Changeset 179:730599eb71ff in livinglogic.java.ul4

Show
Ignore:
Timestamp:
12/26/08 19:16:19 (10 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Add support for colors (no color constants supported yet).

Location:
library/src/com/livinglogic/ul4
Files:
2 added
7 modified
8 moved

Legend:

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

    r116 r179  
    77    protected AST arg2; 
    88    protected AST arg3; 
     9    protected AST arg4; 
    910    protected int argcount; 
     11 
     12    public CallFunc(int start, int end, Name name, AST arg1, AST arg2, AST arg3, AST arg4) 
     13    { 
     14        super(start, end); 
     15        this.name = name; 
     16        this.arg1 = arg1; 
     17        this.arg2 = arg2; 
     18        this.arg3 = arg3; 
     19        this.arg4 = arg4; 
     20        this.argcount = 4; 
     21    } 
    1022 
    1123    public CallFunc(int start, int end, Name name, AST arg1, AST arg2, AST arg3) 
     
    1628        this.arg2 = arg2; 
    1729        this.arg3 = arg3; 
     30        this.arg4 = null; 
    1831        this.argcount = 3; 
    1932    } 
     
    2639        this.arg2 = arg2; 
    2740        this.arg3 = null; 
     41        this.arg4 = null; 
    2842        this.argcount = 2; 
    2943    } 
     
    3650        this.arg2 = null; 
    3751        this.arg3 = null; 
     52        this.arg4 = null; 
    3853        this.argcount = 1; 
    3954    } 
     
    4661        this.arg2 = null; 
    4762        this.arg3 = null; 
     63        this.arg4 = null; 
    4864        this.argcount = 0; 
    4965    } 
    5066 
    51     private static final int[] opcodes = {Opcode.OC_CALLFUNC0, Opcode.OC_CALLFUNC1, Opcode.OC_CALLFUNC2, Opcode.OC_CALLFUNC3}; 
     67    private static final int[] opcodes = {Opcode.OC_CALLFUNC0, Opcode.OC_CALLFUNC1, Opcode.OC_CALLFUNC2, Opcode.OC_CALLFUNC3, Opcode.OC_CALLFUNC4}; 
    5268 
    5369    public int compile(Template template, Registers registers, Location location) 
     
    5672        int r2 = arg2 != null ? arg2.compile(template, registers, location) : -1; 
    5773        int r3 = arg3 != null ? arg3.compile(template, registers, location) : -1; 
     74        int r4 = arg4 != null ? arg4.compile(template, registers, location) : -1; 
    5875        int rr = argcount > 0 ? r1 : registers.alloc(); 
    59         template.opcode(opcodes[argcount], rr, r1, r2, r3, name.value, location); 
     76        template.opcode(opcodes[argcount], rr, r1, r2, r3, r4, name.value, location); 
    6077        if (r2 != -1) 
    6178            registers.free(r2); 
    6279        if (r3 != -1) 
    6380            registers.free(r3); 
     81        if (r4 != -1) 
     82            registers.free(r4); 
    6483        return rr; 
    6584    } 
  • library/src/com/livinglogic/ul4/Compiler.java

    r116 r179  
    1515    { 
    1616        Properties props = new Properties(); 
    17         props.setProperty("python.path", "C:\\jython\\Lib;C:\\ul4"); 
     17        props.setProperty("python.path", "/Users/walter/jython/Lib:/Users/walter/checkouts/LivingLogic.Java.ul4/library/src/com/livinglogic/ul4"); 
    1818        PythonInterpreter.initialize(System.getProperties(), props, new String[] {""}); 
    1919        PythonInterpreter interpreter = new PythonInterpreter(); 
  • library/src/com/livinglogic/ul4/LoadConst.java

    r138 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public abstract class Const extends AST 
     3public abstract class LoadConst extends AST 
    44{ 
    5     public Const(int start, int end) 
     5    public LoadConst(int start, int end) 
    66    { 
    77        super(start, end); 
  • library/src/com/livinglogic/ul4/LoadDate.java

    r123 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public class Date extends AST 
     3public class LoadDate extends AST 
    44{ 
    55    protected java.util.Date value; 
    66 
    7     public Date(int start, int end, java.util.Date value) 
     7    public LoadDate(int start, int end, java.util.Date value) 
    88    { 
    99        super(start, end); 
  • library/src/com/livinglogic/ul4/LoadFalse.java

    r138 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public class False extends Const 
     3public class LoadFalse extends LoadConst 
    44{ 
    5     public False(int start, int end) 
     5    public LoadFalse(int start, int end) 
    66    { 
    77        super(start, end); 
  • library/src/com/livinglogic/ul4/LoadFloat.java

    r138 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public class Float extends AST 
     3public class LoadFloat extends AST 
    44{ 
    55    protected double value; 
    66 
    7     public Float(int start, int end, double value) 
     7    public LoadFloat(int start, int end, double value) 
    88    { 
    99        super(start, end); 
  • library/src/com/livinglogic/ul4/LoadInt.java

    r138 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public class Int extends AST 
     3public class LoadInt extends AST 
    44{ 
    55    protected int value; 
    66 
    7     public Int(int start, int end, int value) 
     7    public LoadInt(int start, int end, int value) 
    88    { 
    99        super(start, end); 
  • library/src/com/livinglogic/ul4/LoadNone.java

    r138 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public class None extends Const 
     3public class LoadNone extends LoadConst 
    44{ 
    5     public None(int start, int end) 
     5    public LoadNone(int start, int end) 
    66    { 
    77        super(start, end); 
  • library/src/com/livinglogic/ul4/LoadStr.java

    r138 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public class Str extends Const 
     3public class LoadStr extends LoadConst 
    44{ 
    55    protected String value; 
    66 
    7     public Str(int start, int end, String value) 
     7    public LoadStr(int start, int end, String value) 
    88    { 
    99        super(start, end); 
  • library/src/com/livinglogic/ul4/LoadTrue.java

    r138 r179  
    11package com.livinglogic.ul4; 
    22 
    3 public class True extends Const 
     3public class LoadTrue extends LoadConst 
    44{ 
    5     public True(int start, int end) 
     5    public LoadTrue(int start, int end) 
    66    { 
    77        super(start, end); 
  • library/src/com/livinglogic/ul4/Main.java

    r177 r179  
    99    public static void main(String[] args) 
    1010    { 
    11         Template tmpl = Compiler.compile("<?print json([None, True, False, 42, 42., ['a','b'], {'a': 'b', 'c': 'd'}])?>"); 
     11        Color c = new Color(0x00, 0x63, 0xa8, 0x33); 
     12        Color b = new Color(0x00, 0x00, 0x00, 0xff); 
     13        Template tmpl = Compiler.compile("<?for c in rgb(-1,2,0.5, 1)?><?print hex(c)?>,<?end for?>"); 
     14        System.out.println(tmpl); 
    1215        long start = System.currentTimeMillis(); 
    13         Map map = new HashMap(); 
    14         String output = tmpl.renders(map); 
     16        Map vars = new HashMap(); 
     17        String output = tmpl.renders(vars); 
    1518        System.out.println("rendered " + (System.currentTimeMillis()-start)); 
    1619        System.out.println(output); 
  • library/src/com/livinglogic/ul4/Opcode.java

    r177 r179  
    1111    public static final int OC_LOADSTR = 6; 
    1212    public static final int OC_LOADDATE = 7; 
    13     public static final int OC_BUILDLIST = 8; 
    14     public static final int OC_BUILDDICT = 9; 
    15     public static final int OC_ADDLIST = 10; 
    16     public static final int OC_ADDDICT = 11; 
    17     public static final int OC_UPDATEDICT = 12; 
    18     public static final int OC_LOADVAR = 13; 
    19     public static final int OC_STOREVAR = 14; 
    20     public static final int OC_ADDVAR = 15; 
    21     public static final int OC_SUBVAR = 16; 
    22     public static final int OC_MULVAR = 17; 
    23     public static final int OC_TRUEDIVVAR = 18; 
    24     public static final int OC_FLOORDIVVAR = 19; 
    25     public static final int OC_MODVAR = 20; 
    26     public static final int OC_DELVAR = 21; 
    27     public static final int OC_GETATTR = 22; 
    28     public static final int OC_GETITEM = 23; 
    29     public static final int OC_GETSLICE12 = 24; 
    30     public static final int OC_GETSLICE1 = 25; 
    31     public static final int OC_GETSLICE2 = 26; 
    32     public static final int OC_PRINT = 27; 
    33     public static final int OC_PRINTX = 28; 
    34     public static final int OC_NOT = 29; 
    35     public static final int OC_NEG = 30; 
    36     public static final int OC_CONTAINS = 31; 
    37     public static final int OC_NOTCONTAINS = 32; 
    38     public static final int OC_EQ = 33; 
    39     public static final int OC_NE = 34; 
    40     public static final int OC_LT = 35; 
    41     public static final int OC_LE = 36; 
    42     public static final int OC_GT = 37; 
    43     public static final int OC_GE = 38; 
    44     public static final int OC_ADD = 39; 
    45     public static final int OC_SUB = 40; 
    46     public static final int OC_MUL = 41; 
    47     public static final int OC_FLOORDIV = 42; 
    48     public static final int OC_TRUEDIV = 43; 
    49     public static final int OC_AND = 44; 
    50     public static final int OC_OR = 45; 
    51     public static final int OC_MOD = 46; 
    52     public static final int OC_CALLFUNC0 = 47; 
    53     public static final int OC_CALLFUNC1 = 48; 
    54     public static final int OC_CALLFUNC2 = 49; 
    55     public static final int OC_CALLFUNC3 = 50; 
    56     public static final int OC_CALLMETH0 = 51; 
    57     public static final int OC_CALLMETH1 = 52; 
    58     public static final int OC_CALLMETH2 = 53; 
    59     public static final int OC_CALLMETH3 = 54; 
    60     public static final int OC_IF = 55; 
    61     public static final int OC_ELSE = 56; 
    62     public static final int OC_ENDIF = 57; 
    63     public static final int OC_FOR = 58; 
    64     public static final int OC_ENDFOR = 59; 
    65     public static final int OC_BREAK = 60; 
    66     public static final int OC_CONTINUE = 61; 
    67     public static final int OC_RENDER = 62; 
     13    public static final int OC_LOADCOLOR = 8; 
     14    public static final int OC_BUILDLIST = 9; 
     15    public static final int OC_BUILDDICT = 10; 
     16    public static final int OC_ADDLIST = 11; 
     17    public static final int OC_ADDDICT = 12; 
     18    public static final int OC_UPDATEDICT = 13; 
     19    public static final int OC_LOADVAR = 14; 
     20    public static final int OC_STOREVAR = 15; 
     21    public static final int OC_ADDVAR = 16; 
     22    public static final int OC_SUBVAR = 17; 
     23    public static final int OC_MULVAR = 18; 
     24    public static final int OC_TRUEDIVVAR = 19; 
     25    public static final int OC_FLOORDIVVAR = 20; 
     26    public static final int OC_MODVAR = 21; 
     27    public static final int OC_DELVAR = 22; 
     28    public static final int OC_GETATTR = 23; 
     29    public static final int OC_GETITEM = 24; 
     30    public static final int OC_GETSLICE12 = 25; 
     31    public static final int OC_GETSLICE1 = 26; 
     32    public static final int OC_GETSLICE2 = 27; 
     33    public static final int OC_PRINT = 28; 
     34    public static final int OC_PRINTX = 29; 
     35    public static final int OC_NOT = 30; 
     36    public static final int OC_NEG = 31; 
     37    public static final int OC_CONTAINS = 32; 
     38    public static final int OC_NOTCONTAINS = 33; 
     39    public static final int OC_EQ = 34; 
     40    public static final int OC_NE = 35; 
     41    public static final int OC_LT = 36; 
     42    public static final int OC_LE = 37; 
     43    public static final int OC_GT = 38; 
     44    public static final int OC_GE = 39; 
     45    public static final int OC_ADD = 40; 
     46    public static final int OC_SUB = 41; 
     47    public static final int OC_MUL = 42; 
     48    public static final int OC_FLOORDIV = 43; 
     49    public static final int OC_TRUEDIV = 44; 
     50    public static final int OC_AND = 45; 
     51    public static final int OC_OR = 46; 
     52    public static final int OC_MOD = 47; 
     53    public static final int OC_CALLFUNC0 = 48; 
     54    public static final int OC_CALLFUNC1 = 49; 
     55    public static final int OC_CALLFUNC2 = 50; 
     56    public static final int OC_CALLFUNC3 = 51; 
     57    public static final int OC_CALLFUNC4 = 52; 
     58    public static final int OC_CALLMETH0 = 53; 
     59    public static final int OC_CALLMETH1 = 54; 
     60    public static final int OC_CALLMETH2 = 55; 
     61    public static final int OC_CALLMETH3 = 56; 
     62    public static final int OC_IF = 57; 
     63    public static final int OC_ELSE = 58; 
     64    public static final int OC_ENDIF = 59; 
     65    public static final int OC_FOR = 60; 
     66    public static final int OC_ENDFOR = 61; 
     67    public static final int OC_BREAK = 62; 
     68    public static final int OC_CONTINUE = 63; 
     69    public static final int OC_RENDER = 64; 
    6870 
    6971    public static final int CF0_NOW = 0; 
     
    104106    public static final int CF3_RANGE = 0; 
    105107    public static final int CF3_ZIP = 1; 
     108    public static final int CF3_RGB = 2; 
     109    public static final int CF3_HLS = 3; 
     110    public static final int CF3_HSV = 4; 
     111 
     112    public static final int CF4_RGB = 0; 
     113    public static final int CF4_HLS = 1; 
     114    public static final int CF4_HSV = 2; 
    106115 
    107116    public static final int CM0_SPLIT = 0; 
     
    114123    public static final int CM0_ITEMS = 7; 
    115124    public static final int CM0_ISOFORMAT = 8; 
     125    public static final int CM0_HLS = 9; 
     126    public static final int CM0_HLSA = 10; 
     127    public static final int CM0_HSV = 11; 
     128    public static final int CM0_HSVA = 12; 
    116129 
    117130    public static final int CM1_SPLIT = 0; 
     
    250263        else if (name.equals("callfunc3")) 
    251264            return OC_CALLFUNC3; 
     265        else if (name.equals("callfunc4")) 
     266            return OC_CALLFUNC4; 
    252267        else if (name.equals("callmeth0")) 
    253268            return OC_CALLMETH0; 
     
    366381        if (name.equals("zip")) 
    367382            return CF3_ZIP; 
     383        else if (name.equals("rgb")) 
     384            return CF3_RGB; 
     385        else if (name.equals("hls")) 
     386            return CF3_HLS; 
     387        else if (name.equals("hsv")) 
     388            return CF3_HSV; 
     389        else 
     390            throw new UnknownFunctionException(name); 
     391    } 
     392 
     393    public static int callfunc4name2code(String name) 
     394    { 
     395        if (name.equals("rgb")) 
     396            return CF4_RGB; 
     397        else if (name.equals("hls")) 
     398            return CF4_HLS; 
     399        else if (name.equals("hsv")) 
     400            return CF4_HSV; 
    368401        else 
    369402            throw new UnknownFunctionException(name); 
     
    392425        else if (name.equals("isoformat")) 
    393426            return CM0_ISOFORMAT; 
     427        else if (name.equals("hls")) 
     428            return CM0_HLS; 
     429        else if (name.equals("hlsa")) 
     430            return CM0_HLSA; 
     431        else if (name.equals("hsv")) 
     432            return CM0_HSV; 
     433        else if (name.equals("hsva")) 
     434            return CM0_HSVA; 
    394435        else 
    395436            throw new UnknownMethodException(name); 
     
    543584        else if (code == OC_CALLFUNC3) 
    544585            return "callfunc3"; 
     586        else if (code == OC_CALLFUNC4) 
     587            return "callfunc4"; 
    545588        else if (code == OC_CALLMETH0) 
    546589            return "callmeth0"; 
     
    598641            case OC_CALLFUNC3: 
    599642                this.argcode = callfunc3name2code(arg); 
     643                break; 
     644            case OC_CALLFUNC4: 
     645                this.argcode = callfunc4name2code(arg); 
    600646                break; 
    601647            case OC_CALLMETH0: 
     
    719765                return "r" + r1 + " = " + arg + "(r" + r2 + ")"; 
    720766            case OC_CALLFUNC2: 
    721                 return "r" + r1 + " = " + arg + "(r" + r2 + ", " + r3 + ")"; 
     767                return "r" + r1 + " = " + arg + "(r" + r2 + ", r" + r3 + ")"; 
    722768            case OC_CALLFUNC3: 
    723                 return "r" + r1 + " = " + arg + "(r" + r2 + ", " + r3 + ", " + r4 + ")"; 
     769                return "r" + r1 + " = " + arg + "(r" + r2 + ", r" + r3 + ", r" + r4 + ")"; 
     770            case OC_CALLFUNC4: 
     771                return "r" + r1 + " = " + arg + "(r" + r2 + ", r" + r3 + ", r" + r4 + ", r" + r5 + ")"; 
    724772            case OC_CALLMETH0: 
    725773                return "r" + r1 + " = r" + r2 + "." + arg + "()"; 
     
    727775                return "r" + r1 + " = r" + r2 + "." + arg + "(r" + r3 + ")"; 
    728776            case OC_CALLMETH2: 
    729                 return "r" + r1 + " = r" + r2 + "." + arg + "(r" + r3 + ", " + r4 + ")"; 
     777                return "r" + r1 + " = r" + r2 + "." + arg + "(r" + r3 + ", r" + r4 + ")"; 
    730778            case OC_CALLMETH3: 
    731                 return "r" + r1 + " = r" + r2 + "." + arg + "(r" + r3 + ", " + r4 + ", " + r5 + ")"; 
     779                return "r" + r1 + " = r" + r2 + "." + arg + "(r" + r3 + ", r" + r4 + ", r" + r5 + ")"; 
    732780            case OC_IF: 
    733781                return "if r" + r1; 
  • library/src/com/livinglogic/ul4/Template.java

    r177 r179  
    101101     * The version number used in the compiled format of the template. 
    102102     */ 
    103     public static final String VERSION = "5"; 
     103    public static final String VERSION = "7"; 
    104104 
    105105    /** 
     
    11931193                                    reg[code.r1] = Utils.zip(reg[code.r2], reg[code.r3], reg[code.r4]); 
    11941194                                    break; 
     1195                                case Opcode.CF3_RGB: 
     1196                                    reg[code.r1] = Utils.rgb(reg[code.r2], reg[code.r3], reg[code.r4]); 
     1197                                    break; 
     1198                                case Opcode.CF3_HLS: 
     1199                                    reg[code.r1] = Utils.hls(reg[code.r2], reg[code.r3], reg[code.r4]); 
     1200                                    break; 
     1201                                case Opcode.CF3_HSV: 
     1202                                    reg[code.r1] = Utils.hsv(reg[code.r2], reg[code.r3], reg[code.r4]); 
     1203                                    break; 
     1204                            } 
     1205                            break; 
     1206                        case Opcode.OC_CALLFUNC4: 
     1207                            switch (code.argcode) 
     1208                            { 
     1209                                case Opcode.CF4_RGB: 
     1210                                    reg[code.r1] = Utils.rgb(reg[code.r2], reg[code.r3], reg[code.r4], reg[code.r5]); 
     1211                                    break; 
     1212                                case Opcode.CF4_HLS: 
     1213                                    reg[code.r1] = Utils.hls(reg[code.r2], reg[code.r3], reg[code.r4], reg[code.r5]); 
     1214                                    break; 
     1215                                case Opcode.CF4_HSV: 
     1216                                    reg[code.r1] = Utils.hsv(reg[code.r2], reg[code.r3], reg[code.r4], reg[code.r5]); 
     1217                                    break; 
    11951218                            } 
    11961219                            break; 
     
    12241247                                case Opcode.CM0_ISOFORMAT: 
    12251248                                    reg[code.r1] = Utils.isoformat(reg[code.r2]); 
     1249                                    break; 
     1250                                case Opcode.CM0_HLS: 
     1251                                    reg[code.r1] = ((Color)reg[code.r2]).hls(); 
     1252                                    break; 
     1253                                case Opcode.CM0_HLSA: 
     1254                                    reg[code.r1] = ((Color)reg[code.r2]).hlsa(); 
     1255                                    break; 
     1256                                case Opcode.CM0_HSV: 
     1257                                    reg[code.r1] = ((Color)reg[code.r2]).hsv(); 
     1258                                    break; 
     1259                                case Opcode.CM0_HSVA: 
     1260                                    reg[code.r1] = ((Color)reg[code.r2]).hsva(); 
    12261261                                    break; 
    12271262                            } 
     
    13911426                        tokens.add(new Token(pos, pos+len, name)); 
    13921427                    else if (name.equals("None")) 
    1393                         tokens.add(new None(pos, pos+len)); 
     1428                        tokens.add(new LoadNone(pos, pos+len)); 
    13941429                    else if (name.equals("True")) 
    1395                         tokens.add(new True(pos, pos+len)); 
     1430                        tokens.add(new LoadTrue(pos, pos+len)); 
    13961431                    else if (name.equals("False")) 
    1397                         tokens.add(new False(pos, pos+len)); 
     1432                        tokens.add(new LoadFalse(pos, pos+len)); 
    13981433                    else 
    13991434                        tokens.add(new Name(pos, pos+len, name)); 
     
    14021437                { 
    14031438                    len = dateMatcher.end(); 
    1404                     tokens.add(new com.livinglogic.ul4.Date(pos, pos+len, Utils.isoDateFormatter.parse(dateMatcher.group()))); 
     1439                    tokens.add(new LoadDate(pos, pos+len, Utils.isoDateFormatter.parse(dateMatcher.group()))); 
    14051440                } 
    14061441                else if (stringMode==0 && floatMatcher.lookingAt()) 
    14071442                { 
    14081443                    len = floatMatcher.end(); 
    1409                     tokens.add(new Float(pos, pos+len, Double.parseDouble(floatMatcher.group()))); 
     1444                    tokens.add(new LoadFloat(pos, pos+len, Double.parseDouble(floatMatcher.group()))); 
    14101445                } 
    14111446                else if (stringMode==0 && hexintMatcher.lookingAt()) 
    14121447                { 
    14131448                    len = hexintMatcher.end(); 
    1414                     tokens.add(new Int(pos, pos+len, Integer.parseInt(hexintMatcher.group().substring(2), 16))); 
     1449                    tokens.add(new LoadInt(pos, pos+len, Integer.parseInt(hexintMatcher.group().substring(2), 16))); 
    14151450                } 
    14161451                else if (stringMode==0 && octintMatcher.lookingAt()) 
    14171452                { 
    14181453                    len = octintMatcher.end(); 
    1419                     tokens.add(new Int(pos, pos+len, Integer.parseInt(octintMatcher.group().substring(2), 8))); 
     1454                    tokens.add(new LoadInt(pos, pos+len, Integer.parseInt(octintMatcher.group().substring(2), 8))); 
    14201455                } 
    14211456                else if (stringMode==0 && binintMatcher.lookingAt()) 
    14221457                { 
    14231458                    len = binintMatcher.end(); 
    1424                     tokens.add(new Int(pos, pos+len, Integer.parseInt(binintMatcher.group().substring(2), 2))); 
     1459                    tokens.add(new LoadInt(pos, pos+len, Integer.parseInt(binintMatcher.group().substring(2), 2))); 
    14251460                } 
    14261461                else if (stringMode==0 && intMatcher.lookingAt()) 
    14271462                { 
    14281463                    len = intMatcher.end(); 
    1429                     tokens.add(new Int(pos, pos+len, Integer.parseInt(intMatcher.group()))); 
     1464                    tokens.add(new LoadInt(pos, pos+len, Integer.parseInt(intMatcher.group()))); 
    14301465                } 
    14311466                else if (stringMode==0 && source.startsWith("'")) 
     
    14471482                    len = 1; 
    14481483                    stringMode = 0; 
    1449                     tokens.add(new Str(stringStartPos, pos+len, collectString.toString())); 
     1484                    tokens.add(new LoadStr(stringStartPos, pos+len, collectString.toString())); 
    14501485                    collectString = null; 
    14511486                } 
     
    19501985                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".iteritems()"); 
    19511986                            break; 
     1987                        case Opcode.CM0_HLS: 
     1988                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".hls()"); 
     1989                            break; 
     1990                        case Opcode.CM0_HLSA: 
     1991                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".hlsa()"); 
     1992                            break; 
     1993                        case Opcode.CM0_HSV: 
     1994                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".hsv()"); 
     1995                            break; 
     1996                        case Opcode.CM0_HSVA: 
     1997                            code(buffer, indent, "reg" + opcode.r1 + " = reg" + opcode.r2 + ".hsva()"); 
     1998                            break; 
    19521999                    } 
    19532000                    break; 
  • library/src/com/livinglogic/ul4/Utils.java

    r177 r179  
    346346    public static Object mod(Object arg1, Object arg2) 
    347347    { 
     348        if (arg1 instanceof Integer && arg2 instanceof Integer) 
     349            return mod((Integer)arg1, (Integer)arg2); 
     350        else if (arg1 instanceof Color && arg2 instanceof Color) 
     351            return ((Color)arg1).blend((Color)arg2); 
    348352        throw new UnsupportedOperationException("Can't apply the modulo operator to instances of " + arg1.getClass() + " and " + arg2.getClass() + "!"); 
    349353    } 
     
    367371        } 
    368372        return arg1.get(index); 
     373    } 
     374 
     375    public static Object getItem(Color arg1, Integer arg2) 
     376    { 
     377        int index = arg2.intValue(); 
     378        switch (index) 
     379        { 
     380            case 0: 
     381                return new Integer(arg1.getR()); 
     382            case 1: 
     383                return new Integer(arg1.getG()); 
     384            case 2: 
     385                return new Integer(arg1.getB()); 
     386            case 3: 
     387                return new Integer(arg1.getA()); 
     388            default: 
     389                throw new ArrayIndexOutOfBoundsException(); 
     390        } 
    369391    } 
    370392 
     
    384406        else if (arg1 instanceof List && arg2 instanceof Integer) 
    385407            return getItem((List)arg1, (Integer)arg2); 
     408        else if (arg1 instanceof Color && arg2 instanceof Integer) 
     409            return getItem((Color)arg1, (Integer)arg2); 
    386410        else if (arg1 instanceof Map) 
    387411            return getItem((Map)arg1, arg2); 
     
    876900    { 
    877901        if (obj instanceof Integer) 
    878             return chr((Integer)obj); 
     902            return hex((Integer)obj); 
    879903        throw new UnsupportedOperationException("Instance of " + obj.getClass() + " can't be represented as a hexadecimal string!"); 
    880904    } 
     
    888912    { 
    889913        if (obj instanceof Integer) 
    890             return chr((Integer)obj); 
     914            return oct((Integer)obj); 
    891915        throw new UnsupportedOperationException("Instance of " + obj.getClass() + " can't be represented as an octal string!"); 
    892916    } 
     
    12891313        else if (obj instanceof Date) 
    12901314            return "date"; 
     1315        else if (obj instanceof Color) 
     1316            return "color"; 
    12911317        else if (obj instanceof List) 
    12921318            return "list"; 
     
    12991325    } 
    13001326 
     1327    private static double _getdouble(Object arg) 
     1328    { 
     1329        if (arg instanceof Integer) 
     1330            return ((Integer)arg).doubleValue(); 
     1331        else if (arg instanceof Double) 
     1332            return ((Double)arg).doubleValue(); 
     1333        else 
     1334            throw new UnsupportedOperationException("can't convert " + arg.getClass() + " to float!"); 
     1335    } 
     1336 
     1337    public static Color rgb(Object arg1, Object arg2, Object arg3) 
     1338    { 
     1339        return Color.fromrgb(_getdouble(arg1), _getdouble(arg2), _getdouble(arg3)); 
     1340    } 
     1341 
     1342    public static Color rgb(Object arg1, Object arg2, Object arg3, Object arg4) 
     1343    { 
     1344        return Color.fromrgb(_getdouble(arg1), _getdouble(arg2), _getdouble(arg3), _getdouble(arg4)); 
     1345    } 
     1346 
     1347    public static Color hsv(Object arg1, Object arg2, Object arg3) 
     1348    { 
     1349        return Color.fromhsv(_getdouble(arg1), _getdouble(arg2), _getdouble(arg3)); 
     1350    } 
     1351 
     1352    public static Color hsv(Object arg1, Object arg2, Object arg3, Object arg4) 
     1353    { 
     1354        return Color.fromhsv(_getdouble(arg1), _getdouble(arg2), _getdouble(arg3), _getdouble(arg4)); 
     1355    } 
     1356 
     1357    public static Color hls(Object arg1, Object arg2, Object arg3) 
     1358    { 
     1359        return Color.fromhls(_getdouble(arg1), _getdouble(arg2), _getdouble(arg3)); 
     1360    } 
     1361 
     1362    public static Color hls(Object arg1, Object arg2, Object arg3, Object arg4) 
     1363    { 
     1364        return Color.fromhls(_getdouble(arg1), _getdouble(arg2), _getdouble(arg3), _getdouble(arg4)); 
     1365    } 
     1366 
    13011367    public static void main(String[] args) 
    13021368    { 
  • library/src/com/livinglogic/ul4/ul4c.py

    r170 r179  
    146146    def makeconst(self, start, end, value): 
    147147        if value is None: 
    148             return ul4.None(start, end) 
     148            return ul4.LoadNone(start, end) 
    149149        elif value is True: 
    150             return ul4.True(start, end) 
     150            return ul4.LoadTrue(start, end) 
    151151        elif value is False: 
    152             return ul4.False(start, end) 
     152            return ul4.LoadFalse(start, end) 
    153153        elif isinstance(value, int): 
    154             return ul4.Int(start, end, value) 
     154            return ul4.LoadInt(start, end, value) 
    155155        elif isinstance(value, float): 
    156             return ul4.Float(start, end, value) 
     156            return ul4.LoadFloat(start, end, value) 
    157157        elif isinstance(value, basestring): 
    158             return ul4.Str(start, end, value) 
     158            return ul4.LoadStr(start, end, value) 
    159159        else: 
    160160            raise TypeError("can't convert %r" % value) 
     
    262262    expr_callfunc3.spark = ['expr10 ::= name ( expr0 , expr0 , expr0 )'] 
    263263 
     264    def expr_callfunc4(self, (name, _0, arg0, _1, arg1, _2, arg2, _3, arg3, _4)): 
     265        return ul4.CallFunc(name.start, _4.end, name, arg0, arg1, arg2, arg3) 
     266    expr_callfunc4.spark = ['expr10 ::= name ( expr0 , expr0 , expr0 , expr0 )'] 
     267 
    264268    def expr_getattr(self, (expr, _0, name)): 
    265269        return ul4.GetAttr(expr.start, name.end, expr, name) 
     
    283287 
    284288    def expr_getitem(self, (expr, _0, key, _1)): 
    285         if isinstance(expr, ul4.Const) and isinstance(key, ul4.Const): # Constant folding 
     289        if isinstance(expr, ul4.LoadConst) and isinstance(key, ul4.LoadConst): # Constant folding 
    286290            return self.makeconst(expr.start, _1.end, expr.value[key.value]) 
    287291        return ul4.GetItem(expr.start, _1.end, expr, key) 
     
    289293 
    290294    def expr_getslice12(self, (expr, _0, index1, _1, index2, _2)): 
    291         if isinstance(expr, ul4.Const) and isinstance(index1, ul4.Const) and isinstance(index2, ul4.Const): # Constant folding 
     295        if isinstance(expr, ul4.LoadConst) and isinstance(index1, ul4.LoadConst) and isinstance(index2, ul4.LoadConst): # Constant folding 
    292296            return self.makeconst(expr.start, _2.end, expr.value[index1.value:index1.value]) 
    293297        return ul4.GetSlice12(expr.start, _2.end, expr, index1, index2) 
     
    295299 
    296300    def expr_getslice1(self, (expr, _0, index1, _1, _2)): 
    297         if isinstance(expr, ul4.Const) and isinstance(index1, ul4.Const): # Constant folding 
     301        if isinstance(expr, ul4.LoadConst) and isinstance(index1, ul4.LoadConst): # Constant folding 
    298302            return self.makeconst(expr.start, _2.end, expr.value[index1.value:]) 
    299303        return ul4.GetSlice1(expr.start, _2.end, expr, index1) 
     
    301305 
    302306    def expr_getslice2(self, (expr, _0, _1, index2, _2)): 
    303         if isinstance(expr, ul4.Const) and isinstance(index2, ul4.Const): # Constant folding 
     307        if isinstance(expr, ul4.LoadConst) and isinstance(index2, ul4.LoadConst): # Constant folding 
    304308            return self.makeconst(expr.start, _2.end, expr.value[:index2.value]) 
    305309        return ul4.GetSlice2(expr.start, _2.end, expr, index2) 
     
    307311 
    308312    def expr_neg(self, (_0, expr)): 
    309         if isinstance(expr, ul4.Const): # Constant folding 
     313        if isinstance(expr, ul4.LoadConst): # Constant folding 
    310314            return self.makeconst(_0.start, expr.end, -expr.value) 
    311315        return ul4.Neg(_0.start, expr.end, expr) 
     
    313317 
    314318    def expr_mul(self, (obj1, _0, obj2)): 
    315         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     319        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    316320            return self.makeconst(obj1.start, obj2.end, obj1.value * obj2.value) 
    317321        return ul4.Mul(obj1.start, obj2.end, obj1, obj2) 
     
    319323 
    320324    def expr_floordiv(self, (obj1, _0, obj2)): 
    321         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     325        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    322326            return self.makeconst(obj1.start, obj2.end, obj1.value // obj2.value) 
    323327        return ul4.FloorDiv(obj1.start, obj2.end, obj1, obj2) 
     
    325329 
    326330    def expr_truediv(self, (obj1, _0, obj2)): 
    327         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     331        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    328332            return self.makeconst(obj1.start, obj2.end, obj1.value / obj2.value) 
    329333        return ul4.TrueDiv(obj1.start, obj2.end, obj1, obj2) 
     
    331335 
    332336    def expr_mod(self, (obj1, _0, obj2)): 
    333         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     337        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    334338            return self.makeconst(obj1.start, obj2.end, obj1.value % obj2.value) 
    335339        return ul4.Mod(obj1.start, obj2.end, obj1, obj2) 
     
    337341 
    338342    def expr_add(self, (obj1, _0, obj2)): 
    339         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     343        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    340344            return self.makeconst(obj1.start, obj2.end, obj1.value + obj2.value) 
    341345        return ul4.Add(obj1.start, obj2.end, obj1, obj2) 
     
    343347 
    344348    def expr_sub(self, (obj1, _0, obj2)): 
    345         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     349        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    346350            return self.makeconst(obj1.start, obj2.end, obj1.value - obj2.value) 
    347351        return ul4.Sub(obj1.start, obj2.end, obj1, obj2) 
     
    349353 
    350354    def expr_eq(self, (obj1, _0, obj2)): 
    351         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     355        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    352356            return self.makeconst(obj1.start, obj2.end, obj1.value == obj2.value) 
    353357        return ul4.EQ(obj1.start, obj2.end, obj1, obj2) 
     
    355359 
    356360    def expr_ne(self, (obj1, _0, obj2)): 
    357         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     361        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    358362            return self.makeconst(obj1.start, obj2.end, obj1.value != obj2.value) 
    359363        return ul4.NE(obj1.start, obj2.end, obj1, obj2) 
     
    361365 
    362366    def expr_lt(self, (obj1, _0, obj2)): 
    363         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     367        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    364368            return self.makeconst(obj1.start, obj2.end, obj1.value < obj2.value) 
    365369        return ul4.LT(obj1.start, obj2.end, obj1, obj2) 
     
    367371 
    368372    def expr_le(self, (obj1, _0, obj2)): 
    369         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     373        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    370374            return self.makeconst(obj1.start, obj2.end, obj1.value <= obj2.value) 
    371375        return ul4.LE(obj1.start, obj2.end, obj1, obj2) 
     
    373377 
    374378    def expr_gt(self, (obj1, _0, obj2)): 
    375         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     379        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    376380            return self.makeconst(obj1.start, obj2.end, obj1.value > obj2.value) 
    377381        return ul4.GT(obj1.start, obj2.end, obj1, obj2) 
     
    379383 
    380384    def expr_ge(self, (obj1, _0, obj2)): 
    381         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     385        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    382386            return self.makeconst(obj1.start, obj2.end, obj1.value >= obj2.value) 
    383387        return ul4.GE(obj1.start, obj2.end, obj1, obj2) 
     
    385389 
    386390    def expr_contains(self, (obj, _0, container)): 
    387         if isinstance(obj, ul4.Const) and isinstance(container, ul4.Const): # Constant folding 
     391        if isinstance(obj, ul4.LoadConst) and isinstance(container, ul4.LoadConst): # Constant folding 
    388392            return self.makeconst(obj.start, container.end, obj.value in container.value) 
    389393        return ul4.Contains(obj.start, container.end, obj, container) 
     
    391395 
    392396    def expr_notcontains(self, (obj, _0, _1, container)): 
    393         if isinstance(obj, ul4.Const) and isinstance(container, ul4.Const): # Constant folding 
     397        if isinstance(obj, ul4.LoadConst) and isinstance(container, ul4.LoadConst): # Constant folding 
    394398            return self.makeconst(obj.start, container.end, obj.value not in container.value) 
    395399        return ul4.NotContains(obj.start, container.end, obj, container) 
     
    397401 
    398402    def expr_not(self, (_0, expr)): 
    399         if isinstance(expr, ul4.Const): # Constant folding 
     403        if isinstance(expr, ul4.LoadConst): # Constant folding 
    400404            return self.makeconst(_0.start, expr.end, not expr.value) 
    401405        return ul4.Not(_0.start, expr.end, expr) 
     
    403407 
    404408    def expr_and(self, (obj1, _0, obj2)): 
    405         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     409        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    406410            return self.makeconst(obj1.start, obj2.end, bool(obj1.value and obj2.value)) 
    407411        return ul4.And(obj1.start, obj2.end, obj1, obj2) 
     
    409413 
    410414    def expr_or(self, (obj1, _0, obj2)): 
    411         if isinstance(obj1, ul4.Const) and isinstance(obj2, ul4.Const): # Constant folding 
     415        if isinstance(obj1, ul4.LoadConst) and isinstance(obj2, ul4.LoadConst): # Constant folding 
    412416            return self.makeconst(obj1.start, obj2.end, bool(obj1.value or obj2.value)) 
    413417        return ul4.Or(obj1.start, obj2.end, obj1, obj2)