1.1 --- a/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Tue Feb 18 21:43:55 2014 +0100
1.2 +++ b/rt/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Tue Feb 18 22:20:50 2014 +0100
1.3 @@ -224,6 +224,14 @@
1.4 return hi.next32(low);
1.5 }
1.6 };
1.7 +
1.8 + numberPrototype.compare = function(x) {
1.9 + if (this == x) {
1.10 + return 0;
1.11 + } else {
1.12 + return (this < x) ? -1 : 1;
1.13 + }
1.14 + };
1.15
1.16 numberPrototype.compare64 = function(x) {
1.17 if (this.high32() === x.high32()) {
2.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Feb 18 21:43:55 2014 +0100
2.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Feb 18 22:20:50 2014 +0100
2.3 @@ -831,7 +831,7 @@
2.4 int indx = readUByte(byteCodes, ++i);
2.5 String v = encodeConstant(indx);
2.6 int type = VarType.fromConstantType(jc.getTag(indx));
2.7 - emit(smapper, out, "var @1 = @2;", smapper.pushT(type), v);
2.8 + smapper.assign(out, type, v);
2.9 break;
2.10 }
2.11 case opc_ldc_w:
2.12 @@ -858,18 +858,15 @@
2.13 break;
2.14 }
2.15 case opc_lcmp:
2.16 - emit(smapper, out, "var @3 = (@2).compare64(@1);",
2.17 - smapper.popL(), smapper.popL(), smapper.pushI());
2.18 + smapper.replace(out, VarType.INTEGER, "(@2).compare64(@1)", smapper.popL(), smapper.getL(0));
2.19 break;
2.20 case opc_fcmpl:
2.21 case opc_fcmpg:
2.22 - emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
2.23 - smapper.popF(), smapper.popF(), smapper.pushI());
2.24 + smapper.replace(out, VarType.INTEGER, "(@2).compare(@1)", smapper.popF(), smapper.getF(0));
2.25 break;
2.26 case opc_dcmpl:
2.27 case opc_dcmpg:
2.28 - emit(smapper, out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);",
2.29 - smapper.popD(), smapper.popD(), smapper.pushI());
2.30 + smapper.replace(out, VarType.INTEGER, "(@2).compare(@1)", smapper.popD(), smapper.getD(0));
2.31 break;
2.32 case opc_if_acmpeq:
2.33 i = generateIf(smapper, byteCodes, i, smapper.popA(), smapper.popA(),
2.34 @@ -885,56 +882,56 @@
2.35 break;
2.36 case opc_ifeq: {
2.37 int indx = i + readShortArg(byteCodes, i);
2.38 - emitIf(smapper, out, "if (@1 == 0) ",
2.39 + emitIf(smapper, out, "if ((@1) == 0) ",
2.40 smapper.popI(), i, indx, topMostLabel);
2.41 i += 2;
2.42 break;
2.43 }
2.44 case opc_ifne: {
2.45 int indx = i + readShortArg(byteCodes, i);
2.46 - emitIf(smapper, out, "if (@1 != 0) ",
2.47 + emitIf(smapper, out, "if ((@1) != 0) ",
2.48 smapper.popI(), i, indx, topMostLabel);
2.49 i += 2;
2.50 break;
2.51 }
2.52 case opc_iflt: {
2.53 int indx = i + readShortArg(byteCodes, i);
2.54 - emitIf(smapper, out, "if (@1 < 0) ",
2.55 + emitIf(smapper, out, "if ((@1) < 0) ",
2.56 smapper.popI(), i, indx, topMostLabel);
2.57 i += 2;
2.58 break;
2.59 }
2.60 case opc_ifle: {
2.61 int indx = i + readShortArg(byteCodes, i);
2.62 - emitIf(smapper, out, "if (@1 <= 0) ",
2.63 + emitIf(smapper, out, "if ((@1) <= 0) ",
2.64 smapper.popI(), i, indx, topMostLabel);
2.65 i += 2;
2.66 break;
2.67 }
2.68 case opc_ifgt: {
2.69 int indx = i + readShortArg(byteCodes, i);
2.70 - emitIf(smapper, out, "if (@1 > 0) ",
2.71 + emitIf(smapper, out, "if ((@1) > 0) ",
2.72 smapper.popI(), i, indx, topMostLabel);
2.73 i += 2;
2.74 break;
2.75 }
2.76 case opc_ifge: {
2.77 int indx = i + readShortArg(byteCodes, i);
2.78 - emitIf(smapper, out, "if (@1 >= 0) ",
2.79 + emitIf(smapper, out, "if ((@1) >= 0) ",
2.80 smapper.popI(), i, indx, topMostLabel);
2.81 i += 2;
2.82 break;
2.83 }
2.84 case opc_ifnonnull: {
2.85 int indx = i + readShortArg(byteCodes, i);
2.86 - emitIf(smapper, out, "if (@1 !== null) ",
2.87 + emitIf(smapper, out, "if ((@1) !== null) ",
2.88 smapper.popA(), i, indx, topMostLabel);
2.89 i += 2;
2.90 break;
2.91 }
2.92 case opc_ifnull: {
2.93 int indx = i + readShortArg(byteCodes, i);
2.94 - emitIf(smapper, out, "if (@1 === null) ",
2.95 + emitIf(smapper, out, "if ((@1) === null) ",
2.96 smapper.popA(), i, indx, topMostLabel);
2.97 i += 2;
2.98 break;
2.99 @@ -1013,8 +1010,7 @@
2.100 break;
2.101 }
2.102 case opc_arraylength:
2.103 - emit(smapper, out, "var @2 = @1.length;",
2.104 - smapper.popA(), smapper.pushI());
2.105 + smapper.replace(out, VarType.INTEGER, "(@1).length", smapper.getA(0));
2.106 break;
2.107 case opc_lastore:
2.108 emit(smapper, out, "Array.at(@3, @2, @1);",
2.109 @@ -1040,27 +1036,27 @@
2.110 smapper.popI(), smapper.popI(), smapper.popA());
2.111 break;
2.112 case opc_laload:
2.113 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
2.114 - smapper.popI(), smapper.popA(), smapper.pushL());
2.115 + smapper.replace(out, VarType.LONG, "Array.at(@2, @1)",
2.116 + smapper.popI(), smapper.getA(0));
2.117 break;
2.118 case opc_faload:
2.119 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
2.120 - smapper.popI(), smapper.popA(), smapper.pushF());
2.121 + smapper.replace(out, VarType.FLOAT, "Array.at(@2, @1)",
2.122 + smapper.popI(), smapper.getA(0));
2.123 break;
2.124 case opc_daload:
2.125 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
2.126 - smapper.popI(), smapper.popA(), smapper.pushD());
2.127 + smapper.replace(out, VarType.DOUBLE, "Array.at(@2, @1)",
2.128 + smapper.popI(), smapper.getA(0));
2.129 break;
2.130 case opc_aaload:
2.131 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
2.132 - smapper.popI(), smapper.popA(), smapper.pushA());
2.133 + smapper.replace(out, VarType.REFERENCE, "Array.at(@2, @1)",
2.134 + smapper.popI(), smapper.getA(0));
2.135 break;
2.136 case opc_iaload:
2.137 case opc_baload:
2.138 case opc_caload:
2.139 case opc_saload:
2.140 - emit(smapper, out, "var @3 = Array.at(@2, @1);",
2.141 - smapper.popI(), smapper.popA(), smapper.pushI());
2.142 + smapper.replace(out, VarType.INTEGER, "Array.at(@2, @1)",
2.143 + smapper.popI(), smapper.getA(0));
2.144 break;
2.145 case opc_pop:
2.146 case opc_pop2:
2.147 @@ -1232,9 +1228,9 @@
2.148 final int type = VarType.fromFieldType(fi[2].charAt(0));
2.149 final String mangleClass = mangleClassName(fi[0]);
2.150 final String mangleClassAccess = accessClass(mangleClass);
2.151 - emit(smapper, out, "var @2 = @4(false)._@3.call(@1);",
2.152 - smapper.popA(),
2.153 - smapper.pushT(type), fi[1], mangleClassAccess
2.154 + smapper.replace(out, type, "@3(false)._@2.call(@1)",
2.155 + smapper.getA(0),
2.156 + fi[1], mangleClassAccess
2.157 );
2.158 i += 2;
2.159 break;
2.160 @@ -1257,9 +1253,8 @@
2.161 int indx = readUShortArg(byteCodes, i);
2.162 String[] fi = jc.getFieldInfoName(indx);
2.163 final int type = VarType.fromFieldType(fi[2].charAt(0));
2.164 - emit(smapper, out, "var @1 = @2(false)._@3();",
2.165 - smapper.pushT(type),
2.166 - accessClass(mangleClassName(fi[0])), fi[1]);
2.167 + String ac = accessClass(mangleClassName(fi[0]));
2.168 + smapper.assign(out, type, ac + "(false)._" + fi[1] + "()");
2.169 i += 2;
2.170 addReference(fi[0]);
2.171 break;
2.172 @@ -1297,13 +1292,13 @@
2.173 }
2.174
2.175 case opc_monitorenter: {
2.176 - out.append("/* monitor enter */");
2.177 + debug("/* monitor enter */");
2.178 smapper.popA();
2.179 break;
2.180 }
2.181
2.182 case opc_monitorexit: {
2.183 - out.append("/* monitor exit */");
2.184 + debug("/* monitor exit */");
2.185 smapper.popA();
2.186 break;
2.187 }
2.188 @@ -1341,9 +1336,9 @@
2.189 ) throws IOException {
2.190 mapper.flush(out);
2.191 int indx = i + readShortArg(byteCodes, i);
2.192 - out.append("if (").append(v1)
2.193 - .append(' ').append(test).append(' ')
2.194 - .append(v2).append(") ");
2.195 + out.append("if ((").append(v1)
2.196 + .append(") ").append(test).append(" (")
2.197 + .append(v2).append(")) ");
2.198 goTo(out, i, indx, topMostLabel);
2.199 return i + 2;
2.200 }
2.201 @@ -2101,7 +2096,9 @@
2.202 table += 4;
2.203 int high = readInt4(byteCodes, table);
2.204 table += 4;
2.205 - out.append("switch (").append(smapper.popI()).append(") {\n");
2.206 + final CharSequence swVar = smapper.popValue();
2.207 + smapper.flush(out);
2.208 + out.append("switch (").append(swVar).append(") {\n");
2.209 while (low <= high) {
2.210 int offset = i + readInt4(byteCodes, table);
2.211 table += 4;
2.212 @@ -2121,7 +2118,9 @@
2.213 table += 4;
2.214 int n = readInt4(byteCodes, table);
2.215 table += 4;
2.216 - out.append("switch (").append(smapper.popI()).append(") {\n");
2.217 + final CharSequence swVar = smapper.popValue();
2.218 + smapper.flush(out);
2.219 + out.append("switch (").append(swVar).append(") {\n");
2.220 while (n-- > 0) {
2.221 int cnstnt = readInt4(byteCodes, table);
2.222 table += 4;
3.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Tue Feb 18 21:43:55 2014 +0100
3.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClosureWrapper.java Tue Feb 18 22:20:50 2014 +0100
3.3 @@ -254,6 +254,7 @@
3.4 "shr64",
3.5 "ushr64",
3.6 "compare64",
3.7 + "compare",
3.8 "neg64",
3.9 "div32",
3.10 "mod32",