Changeset 163:93e8b8bec86c in livinglogic.java.ul4

Show
Ignore:
Timestamp:
07/29/08 22:22:16 (11 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Add a method pythonSource() that output a Python equivalent of the template.

Location:
library/src/com/livinglogic/ul4
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • library/src/com/livinglogic/ul4/Opcode.java

    r161 r163  
    121121    public static final int CM1_GET = 9; 
    122122 
    123     public static final int CM2_REPLACE = 0; 
    124     public static final int CM2_GET = 1; 
     123    public static final int CM2_SPLIT = 0; 
     124    public static final int CM2_RSPLIT = 1; 
     125    public static final int CM2_FIND = 2; 
     126    public static final int CM2_REPLACE = 3; 
     127    public static final int CM2_GET = 4; 
     128 
     129    public static final int CM3_FIND = 0; 
    125130 
    126131    public int name; 
  • library/src/com/livinglogic/ul4/Template.java

    r161 r163  
    15821582        return buffer.toString(); 
    15831583    } 
     1584 
     1585    private void code(StringBuffer buffer, int indent, String code) 
     1586    { 
     1587        for (int i = 0; i < indent; ++i) 
     1588            buffer.append("\t"); 
     1589        buffer.append(code); 
     1590        buffer.append("\n"); 
     1591    } 
     1592 
     1593    public String pythonSource(String function) 
     1594    { 
     1595        StringBuffer buffer = new StringBuffer(); 
     1596        int indent = 0; 
     1597 
     1598        if (function != null) 
     1599        { 
     1600            code(buffer, indent, "def " + function + "(templates={}, **variables):"); 
     1601            indent += 1; 
     1602        } 
     1603        code(buffer, indent, "import sys, marshal, datetime, itertools"); 
     1604        code(buffer, indent, "from ll.misc import xmlescape"); 
     1605        code(buffer, indent, "from ll import ul4c"); 
     1606        code(buffer, indent, "source = u" + Utils.repr(source)); 
     1607        code(buffer, indent, "variables = dict((key.decode('utf-8'), value) for (key, value) in variables.iteritems())"); 
     1608 
     1609        int size = opcodes.size(); 
     1610 
     1611        StringBuffer locations = new StringBuffer(); 
     1612        StringBuffer lines2locs = new StringBuffer(); 
     1613        int index = -1; 
     1614        Location lastLocation = null; 
     1615 
     1616        for (int i = 0; i < size; ++i) 
     1617        { 
     1618            Opcode opcode = (Opcode)opcodes.get(i); 
     1619             
     1620            if (lastLocation != opcode.location) 
     1621            { 
     1622                if (locations.length()>0) 
     1623                    locations.append(", "); 
     1624 
     1625                lastLocation = opcode.location; 
     1626 
     1627                locations.append("(") 
     1628                         .append(Utils.repr(lastLocation.type)) 
     1629                         .append(", ") 
     1630                         .append(lastLocation.starttag) 
     1631                         .append(", ") 
     1632                         .append(lastLocation.endtag) 
     1633                         .append(", ") 
     1634                         .append(lastLocation.startcode) 
     1635                         .append(", ") 
     1636                         .append(lastLocation.endcode) 
     1637                         .append(")"); 
     1638                ++index; 
     1639            } 
     1640            if (lines2locs.length()>0) 
     1641                lines2locs.append(", "); 
     1642            lines2locs.append(index); 
     1643        } 
     1644        code(buffer, indent, "locations = (" + locations + ")"); 
     1645        code(buffer, indent, "lines2locs = (" + lines2locs + ")"); 
     1646 
     1647        code(buffer, indent, "reg0 = reg1 = reg2 = reg3 = reg4 = reg5 = reg6 = reg7 = reg8 = reg9 = None"); 
     1648 
     1649        code(buffer, indent, "try:"); 
     1650        indent += 1; 
     1651        code(buffer, indent, "startline = sys._getframe().f_lineno+1"); // The source line of the first opcode 
     1652 
     1653        int lastOpcode = -1; 
     1654        for (int i = 0; i < size; ++i) 
     1655        { 
     1656            Opcode opcode = (Opcode)opcodes.get(i); 
     1657         
     1658            switch (opcode.name) 
     1659            { 
     1660                case Opcode.OC_TEXT: 
     1661                    code(buffer, indent, "yield u" + Utils.repr(opcode.location.getCode())); 
     1662                    break; 
     1663                case Opcode.OC_LOADSTR: 
     1664                    code(buffer, indent, "reg" + opcode.r1 + " = u" + Utils.repr(opcode.arg)); 
     1665                    break; 
     1666                case Opcode.OC_LOADINT: 
     1667                    code(buffer, indent, "reg" + opcode.r1 + " = " + opcode.arg); 
     1668                    break; 
     1669                case Opcode.OC_LOADFLOAT: 
     1670                    code(buffer, indent, "reg" + opcode.r1 + " = " + opcode.arg); 
     1671                    break; 
     1672                case Opcode.OC_LOADNONE: 
     1673                    code(buffer, indent, "reg" + opcode.r1 + " = None"); 
     1674                    break; 
     1675                case Opcode.OC_LOADFALSE: 
     1676                    code(buffer, indent, "reg" + opcode.r1 + " = False"); 
     1677                    break; 
     1678                case Opcode.OC_LOADTRUE: 
     1679                    code(buffer, indent, "reg" + opcode.r1 + " = True"); 
     1680                    break; 
     1681                case Opcode.OC_LOADDATE: 
     1682                    code(buffer, indent, "reg" + opcode.r1 + " = !!!"); 
     1683                    break; 
     1684                case Opcode.OC_BUILDLIST: 
     1685                    code(buffer, indent, "reg" + opcode.r1 + " = []"); 
     1686                    break; 
     1687                case Opcode.OC_BUILDDICT: 
     1688                    code(buffer, indent, "reg" + opcode.r1 + " = {}"); 
     1689                    break; 
     1690                case Opcode.OC_ADDLIST: 
     1691                    code(buffer, indent, "reg" + opcode.r1 + ".append(reg" + opcode.r2 + ")"); 
     1692                    break; 
     1693                case Opcode.OC_ADDDICT: 
     1694                    code(buffer, indent, "reg" + opcode.r1 + "[reg" + opcode.r2 + "] = reg" + opcode.r3); 
     1695                    break; 
     1696                case Opcode.OC_LOADVAR: 
     1697                    code(buffer, indent, "reg" + opcode.r1 + " = variables[u" + Utils.repr(opcode.arg) + "]"); 
     1698                    break; 
     1699                case Opcode.OC_STOREVAR: 
     1700                    code(buffer, indent, "variables[u" + Utils.repr(opcode.arg) + "] = reg" + opcode.r1); 
     1701                    break; 
     1702                case Opcode.OC_ADDVAR: 
     1703                    code(buffer, indent, "variables[u" + Utils.repr(opcode.arg) + "] += reg" + opcode.r1); 
     1704                    break; 
     1705                case Opcode.OC_SUBVAR: 
     1706                    code(buffer, indent, "variables[u" + Utils.repr(opcode.arg) + "] -= reg" + opcode.r1); 
     1707                    break; 
     1708                case Opcode.OC_MULVAR: 
     1709                    code(buffer, indent, "variables[u" + Utils.repr(opcode.arg) + "] *= reg" + opcode.r1); 
     1710                    break; 
     1711                case Opcode.OC_TRUEDIVVAR: 
     1712                    code(buffer, indent, "variables[u" + Utils.repr(opcode.arg) + "] /= reg" + opcode.r1); 
     1713                    break; 
     1714                case Opcode.OC_FLOORDIVVAR: 
     1715                    code(buffer, indent, "variables[u" + Utils.repr(opcode.arg) + "] //= reg" + opcode.r1); 
     1716                    break; 
     1717                case Opcode.OC_DELVAR: 
     1718                    code(buffer, indent, "del variables[u" + Utils.repr(opcode.arg) + "]"); 
     1719                    break; 
     1720                case Opcode.OC_GETATTR: 
     1721                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + "[u" + Utils.repr(opcode.arg) + "]"); 
     1722                    break; 
     1723                case Opcode.OC_GETITEM: 
     1724                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + "[reg" + opcode.r3 + "]"); 
     1725                    break; 
     1726                case Opcode.OC_GETSLICE12: 
     1727                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + "[reg" + opcode.r3 + ":reg" + opcode.r4 + "]"); 
     1728                    break; 
     1729                case Opcode.OC_GETSLICE1: 
     1730                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + "[reg" + opcode.r3 + ":]"); 
     1731                    break; 
     1732                case Opcode.OC_GETSLICE2: 
     1733                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + "[:reg" + opcode.r3 + "]"); 
     1734                    break; 
     1735                case Opcode.OC_PRINT: 
     1736                    code(buffer, indent, "if reg" + opcode.r1 + " is not None: yield unicode(reg" + opcode.r1 + ")"); 
     1737                    break; 
     1738                case Opcode.OC_PRINTX: 
     1739                    code(buffer, indent, "if reg" + opcode.r1 + " is not None: yield xmlescape(unicode(reg" + opcode.r1 + "))"); 
     1740                    break; 
     1741                case Opcode.OC_FOR: 
     1742                    code(buffer, indent, "for reg" + opcode.r1 + " in reg" + opcode.r2 + ":"); 
     1743                    indent += 1; 
     1744                    break; 
     1745                case Opcode.OC_ENDFOR: 
     1746                    indent -= 1; 
     1747                    code(buffer, indent, "# end for"); 
     1748                    break; 
     1749                case Opcode.OC_BREAK: 
     1750                    code(buffer, indent, "break"); 
     1751                    break; 
     1752                case Opcode.OC_CONTINUE: 
     1753                    code(buffer, indent, "continue"); 
     1754                    break; 
     1755                case Opcode.OC_NOT: 
     1756                    code(buffer, indent, "reg" + opcode.r1 + " = not reg" + opcode.r2); 
     1757                    break; 
     1758                case Opcode.OC_NEG: 
     1759                    code(buffer, indent, "reg" + opcode.r1 + " = -reg" + opcode.r2); 
     1760                    break; 
     1761                case Opcode.OC_CONTAINS: 
     1762                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " in reg" + opcode.r3); 
     1763                    break; 
     1764                case Opcode.OC_NOTCONTAINS: 
     1765                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " not in reg" + opcode.r3); 
     1766                    break; 
     1767                case Opcode.OC_EQ: 
     1768                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " == reg" + opcode.r3); 
     1769                    break; 
     1770                case Opcode.OC_NE: 
     1771                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " != reg" + opcode.r3); 
     1772                    break; 
     1773                case Opcode.OC_LT: 
     1774                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " < reg" + opcode.r3); 
     1775                    break; 
     1776                case Opcode.OC_LE: 
     1777                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " <= reg" + opcode.r3); 
     1778                    break; 
     1779                case Opcode.OC_GT: 
     1780                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " > reg" + opcode.r3); 
     1781                    break; 
     1782                case Opcode.OC_GE: 
     1783                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " >= reg" + opcode.r3); 
     1784                    break; 
     1785                case Opcode.OC_ADD: 
     1786                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " + reg" + opcode.r3); 
     1787                    break; 
     1788                case Opcode.OC_SUB: 
     1789                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " - reg" + opcode.r3); 
     1790                    break; 
     1791                case Opcode.OC_MUL: 
     1792                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " * reg" + opcode.r3); 
     1793                    break; 
     1794                case Opcode.OC_FLOORDIV: 
     1795                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " // reg" + opcode.r3); 
     1796                    break; 
     1797                case Opcode.OC_TRUEDIV: 
     1798                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " / reg" + opcode.r3); 
     1799                    break; 
     1800                case Opcode.OC_AND: 
     1801                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " and reg" + opcode.r3); 
     1802                    break; 
     1803                case Opcode.OC_OR: 
     1804                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " or reg" + opcode.r3); 
     1805                    break; 
     1806                case Opcode.OC_MOD: 
     1807                    code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " % reg" + opcode.r3); 
     1808                    break; 
     1809                case Opcode.OC_CALLFUNC0: 
     1810                    switch (opcode.argcode) 
     1811                    { 
     1812                        case Opcode.CF0_NOW: 
     1813                            code(buffer, indent, "reg" + opcode.r1 + " = datetime.datetime.now()"); 
     1814                            break; 
     1815                    } 
     1816                    break; 
     1817                case Opcode.OC_CALLFUNC1: 
     1818                    switch (opcode.argcode) 
     1819                    { 
     1820                        case Opcode.CF1_XMLESCAPE: 
     1821                            code(buffer, indent, "reg" + opcode.r1 + " = xmlescape(unicode(reg" + opcode.r2 + ")) if reg" + opcode.r2 + " is not None else u''"); 
     1822                            break; 
     1823                        case Opcode.CF1_CSVESCAPE: 
     1824                            code(buffer, indent, "reg" + opcode.r1 + " = ul4c._csvescape(reg" + opcode.r2 + ")"); 
     1825                            break; 
     1826                        case Opcode.CF1_STR: 
     1827                            code(buffer, indent, "reg" + opcode.r1 + " = unicode(reg" + opcode.r2 + ") if reg" + opcode.r2 + " is not None else u''"); 
     1828                            break; 
     1829                        case Opcode.CF1_INT: 
     1830                            code(buffer, indent, "reg" + opcode.r1 + " = int(reg" + opcode.r2 + ")"); 
     1831                            break; 
     1832                        case Opcode.CF1_BOOL: 
     1833                            code(buffer, indent, "reg" + opcode.r1 + " = bool(reg" + opcode.r2 + ")"); 
     1834                            break; 
     1835                        case Opcode.CF1_LEN: 
     1836                            code(buffer, indent, "reg" + opcode.r1 + " = len(reg" + opcode.r2 + ")"); 
     1837                            break; 
     1838                        case Opcode.CF1_ENUMERATE: 
     1839                            code(buffer, indent, "reg" + opcode.r1 + " = enumerate(reg" + opcode.r2 + ")"); 
     1840                            break; 
     1841                        case Opcode.CF1_ISNONE: 
     1842                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + " is not None"); 
     1843                            break; 
     1844                        case Opcode.CF1_ISSTR: 
     1845                            code(buffer, indent, "reg" + opcode.r1 + " = isinstance(reg" + opcode.r2 + ", basestring)"); 
     1846                            break; 
     1847                        case Opcode.CF1_ISINT: 
     1848                            code(buffer, indent, "reg" + opcode.r1 + " = isinstance(reg" + opcode.r2 + ", (int, long)) and not isinstance(reg" + opcode.r2 + ", bool)"); 
     1849                            break; 
     1850                        case Opcode.CF1_ISFLOAT: 
     1851                            code(buffer, indent, "reg" + opcode.r1 + " = isinstance(reg" + opcode.r2 + ", float)"); 
     1852                            break; 
     1853                        case Opcode.CF1_ISBOOL: 
     1854                            code(buffer, indent, "reg" + opcode.r1 + " = isinstance(reg" + opcode.r2 + ", bool)"); 
     1855                            break; 
     1856                        case Opcode.CF1_ISDATE: 
     1857                            code(buffer, indent, "reg" + opcode.r1 + " = isinstance(reg" + opcode.r2 + ", datetime.datetime)"); 
     1858                            break; 
     1859                        case Opcode.CF1_ISLIST: 
     1860                            code(buffer, indent, "reg" + opcode.r1 + " = isinstance(reg" + opcode.r2 + ", (list, tuple))"); 
     1861                            break; 
     1862                        case Opcode.CF1_ISDICT: 
     1863                            code(buffer, indent, "reg" + opcode.r1 + " = isinstance(reg" + opcode.r2 + ", dict)"); 
     1864                            break; 
     1865                        case Opcode.CF1_REPR: 
     1866                            code(buffer, indent, "reg" + opcode.r1 + " = ul4c._repr(reg" + opcode.r2 + ")"); 
     1867                            break; 
     1868                        case Opcode.CF1_GET: 
     1869                            code(buffer, indent, "reg" + opcode.r1 + " = variables.get(reg" + opcode.r2 + ")"); 
     1870                            break; 
     1871                        case Opcode.CF1_CHR: 
     1872                            code(buffer, indent, "reg" + opcode.r1 + " = unichr(reg" + opcode.r2 + ")"); 
     1873                            break; 
     1874                        case Opcode.CF1_ORD: 
     1875                            code(buffer, indent, "reg" + opcode.r1 + " = ord(reg" + opcode.r2 + ")"); 
     1876                            break; 
     1877                        case Opcode.CF1_HEX: 
     1878                            code(buffer, indent, "reg" + opcode.r1 + " = hex(reg" + opcode.r2 + ")"); 
     1879                            break; 
     1880                        case Opcode.CF1_OCT: 
     1881                            code(buffer, indent, "reg" + opcode.r1 + " = ul4c._oct(reg" + opcode.r2 + ")"); 
     1882                            break; 
     1883                        case Opcode.CF1_BIN: 
     1884                            code(buffer, indent, "reg" + opcode.r1 + " = ul4c._bin(reg" + opcode.r2 + ")"); 
     1885                            break; 
     1886                        case Opcode.CF1_SORTED: 
     1887                            code(buffer, indent, "reg" + opcode.r1 + " = sorted(reg" + opcode.r2 + ")"); 
     1888                            break; 
     1889                        case Opcode.CF1_RANGE: 
     1890                            code(buffer, indent, "reg" + opcode.r1 + " = xrange(reg" + opcode.r2 + ")"); 
     1891                            break; 
     1892                    } 
     1893                    break; 
     1894                case Opcode.OC_CALLFUNC2: 
     1895                    switch (opcode.argcode) 
     1896                    { 
     1897                        case Opcode.CF2_RANGE: 
     1898                            code(buffer, indent, "reg" + opcode.r1 + " = xrange(reg" + opcode.r2 + ", reg" + opcode.r3 + ")"); 
     1899                            break; 
     1900                        case Opcode.CF2_GET: 
     1901                            code(buffer, indent, "reg" + opcode.r1 + " = variables.get(reg" + opcode.r2 + ", reg" + opcode.r3 + ")"); 
     1902                            break; 
     1903                        case Opcode.CF2_ZIP: 
     1904                            code(buffer, indent, "reg" + opcode.r1 + " = itertools.izip(reg" + opcode.r2 + ", reg" + opcode.r3 + ")"); 
     1905                            break; 
     1906                    } 
     1907                    break; 
     1908                case Opcode.OC_CALLFUNC3: 
     1909                    switch (opcode.argcode) 
     1910                    { 
     1911                        case Opcode.CF3_RANGE: 
     1912                            code(buffer, indent, "reg" + opcode.r1 + " = xrange(reg" + opcode.r2 + ", reg" + opcode.r3 + ", reg" + opcode.r4 + ")"); 
     1913                            break; 
     1914                        case Opcode.CF3_ZIP: 
     1915                            code(buffer, indent, "reg" + opcode.r1 + " = itertools.izip(reg" + opcode.r2 + ", reg" + opcode.r3 + ", reg" + opcode.r4 + ")"); 
     1916                            break; 
     1917                    } 
     1918                    break; 
     1919                case Opcode.OC_CALLMETH0: 
     1920                    switch (opcode.argcode) 
     1921                    { 
     1922                        case Opcode.CM0_SPLIT: 
     1923                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".split()"); 
     1924                            break; 
     1925                        case Opcode.CM0_STRIP: 
     1926                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".strip()"); 
     1927                            break; 
     1928                        case Opcode.CM0_LSTRIP: 
     1929                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".lstrip()"); 
     1930                            break; 
     1931                        case Opcode.CM0_RSTRIP: 
     1932                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".rstrip()"); 
     1933                            break; 
     1934                        case Opcode.CM0_UPPER: 
     1935                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".upper()"); 
     1936                            break; 
     1937                        case Opcode.CM0_LOWER: 
     1938                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".lower()"); 
     1939                            break; 
     1940                        case Opcode.CM0_CAPITALIZE: 
     1941                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".capitalize()"); 
     1942                            break; 
     1943                        case Opcode.CM0_ISOFORMAT: 
     1944                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".isoformat()"); 
     1945                            break; 
     1946                        case Opcode.CM0_ITEMS: 
     1947                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".iteritems()"); 
     1948                            break; 
     1949                    } 
     1950                    break; 
     1951                case Opcode.OC_CALLMETH1: 
     1952                    switch (opcode.argcode) 
     1953                    { 
     1954                        case Opcode.CM1_SPLIT: 
     1955                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".split(reg" + opcode.r3 + ")"); 
     1956                            break; 
     1957                        case Opcode.CM1_RSPLIT: 
     1958                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".rsplit(reg" + opcode.r3 + ")"); 
     1959                            break; 
     1960                        case Opcode.CM1_STRIP: 
     1961                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".strip(reg" + opcode.r3 + ")"); 
     1962                            break; 
     1963                        case Opcode.CM1_LSTRIP: 
     1964                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".lstrip(reg" + opcode.r3 + ")"); 
     1965                            break; 
     1966                        case Opcode.CM1_RSTRIP: 
     1967                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".rstrip(reg" + opcode.r3 + ")"); 
     1968                            break; 
     1969                        case Opcode.CM1_STARTSWITH: 
     1970                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".startswith(reg" + opcode.r3 + ")"); 
     1971                            break; 
     1972                        case Opcode.CM1_ENDSWITH: 
     1973                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".endswith(reg" + opcode.r3 + ")"); 
     1974                            break; 
     1975                        case Opcode.CM1_FIND: 
     1976                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".find(reg" + opcode.r3 + ")"); 
     1977                            break; 
     1978                        case Opcode.CM1_GET: 
     1979                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".get(reg" + opcode.r3 + ")"); 
     1980                            break; 
     1981                        case Opcode.CM1_FORMAT: 
     1982                            code(buffer, indent, "reg" + opcode.r1 + " = ul4c._format(reg" + opcode.r2 + ", reg" + opcode.r3 + ")"); 
     1983                            break; 
     1984                    } 
     1985                    break; 
     1986                case Opcode.OC_CALLMETH2: 
     1987                    switch (opcode.argcode) 
     1988                    { 
     1989                        case Opcode.CM2_SPLIT: 
     1990                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".split(reg" + opcode.r3 + ", reg" + opcode.r4 + ")"); 
     1991                            break; 
     1992                        case Opcode.CM2_RSPLIT: 
     1993                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".rsplit(reg" + opcode.r3 + ", reg" + opcode.r4 + ")"); 
     1994                            break; 
     1995                        case Opcode.CM2_FIND: 
     1996                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".find(reg" + opcode.r3 + ", reg" + opcode.r4 + ")"); 
     1997                            break; 
     1998                        case Opcode.CM2_REPLACE: 
     1999                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".replace(reg" + opcode.r3 + ", reg" + opcode.r4 + ")"); 
     2000                            break; 
     2001                        case Opcode.CM2_GET: 
     2002                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".get(reg" + opcode.r3 + ", reg" + opcode.r4 + ")"); 
     2003                            break; 
     2004                    } 
     2005                    break; 
     2006                case Opcode.OC_CALLMETH3: 
     2007                    switch (opcode.argcode) 
     2008                    { 
     2009                        case Opcode.CM3_FIND: 
     2010                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".find(reg" + opcode.r3 + ", reg" + opcode.r4 + ", reg" + opcode.r5 + ")"); 
     2011                            break; 
     2012                    } 
     2013                    break; 
     2014                case Opcode.OC_IF: 
     2015                    code(buffer, indent, "if reg" + opcode.r1 + ":"); 
     2016                    indent += 1; 
     2017                    break; 
     2018                case Opcode.OC_ELSE: 
     2019                    if (lastOpcode == Opcode.OC_IF) 
     2020                        buffer.insert(buffer.length()-1, " pass"); 
     2021                    indent -= 1; 
     2022                    code(buffer, indent, "else:"); 
     2023                    indent += 1; 
     2024                    break; 
     2025                case Opcode.OC_ENDIF: 
     2026                    if (lastOpcode == Opcode.OC_IF || lastOpcode == Opcode.OC_ELSE) 
     2027                        buffer.insert(buffer.length()-1, " pass"); 
     2028                    indent -= 1; 
     2029                    code(buffer, indent, "# end if"); 
     2030                    break; 
     2031                case Opcode.OC_RENDER: 
     2032                    code(buffer, indent, "for chunk in templates[u" + Utils.repr(opcode.arg) + "](templates, **dict((key.encode('utf-8'), value) for (key, value) in reg" + opcode.r1 + ".iteritems())): yield chunk"); 
     2033                    break; 
     2034            } 
     2035            lastOpcode = opcode.name; 
     2036        } 
     2037        indent -= 1; 
     2038        code(buffer, indent, "except Exception, exc:"); 
     2039        indent += 1; 
     2040        code(buffer, indent, "raise ul4c.Error(ul4c.Location(source, *locations[lines2locs[sys.exc_info()[2].tb_lineno-startline]]), exc)"); 
     2041        return buffer.toString(); 
     2042    } 
    15842043}