# HG changeset patch # User Jaroslav Tulach # Date 1358523951 -3600 # Node ID 509e3d4f477c28d047e384e6825ffff395f2f87b # Parent a2871a3fd4c5e0450ee50cdb7e507721fa4d9d65# Parent 859cc3a0b8f064fba316796dbf06b19604ab3940 Merging Lubo's elimination of the 'var' block at the beginning of each function diff -r a2871a3fd4c5 -r 509e3d4f477c javap/src/main/java/org/apidesign/javap/StackMapIterator.java --- a/javap/src/main/java/org/apidesign/javap/StackMapIterator.java Tue Jan 15 12:44:33 2013 +0100 +++ b/javap/src/main/java/org/apidesign/javap/StackMapIterator.java Fri Jan 18 16:45:51 2013 +0100 @@ -123,7 +123,7 @@ } final int length = methodSignature.length(); - int skipType = 0; + boolean skipType = false; int argType; for (int i = 1; i < length; ++i) { switch (methodSignature.charAt(i)) { @@ -156,10 +156,10 @@ // not interested in the return value type return argTypes; case '[': - if (skipType == 0) { + if (!skipType) { argTypes.add(ITEM_Object); + skipType = true; } - ++skipType; continue; default: @@ -167,10 +167,10 @@ "Invalid method signature"); } - if (skipType == 0) { + if (!skipType) { argTypes.add(argType); } else { - --skipType; + skipType = false; } } diff -r a2871a3fd4c5 -r 509e3d4f477c vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Jan 15 12:44:33 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 18 16:45:51 2013 +0100 @@ -264,37 +264,10 @@ final StackMapper smapper = new StackMapper(); - final int maxLocals = m.getMaxLocals(); - if (maxLocals > 0) { - // TODO: generate only used local variables - for (int j = 0; j <= VarType.LAST; ++j) { - out.append("\n var ").append(Variable.getLocalVariable(j, 0)); - for (int i = 1; i < maxLocals; ++i) { - out.append(", "); - out.append(Variable.getLocalVariable(j, i)); - } - out.append(';'); - } - } if (!m.isStatic()) { out.append(" var ").append(" lcA0 = this;\n"); } - // maxStack includes two stack positions for every pushed long / double - // so this might generate more stack variables than we need - final int maxStack = m.getMaxStack(); - if (maxStack > 0) { - // TODO: generate only used stack variables - for (int j = 0; j <= VarType.LAST; ++j) { - out.append("\n var ").append(Variable.getStackVariable(j, 0)); - for (int i = 1; i < maxStack; ++i) { - out.append(", "); - out.append(Variable.getStackVariable(j, i)); - } - out.append(';'); - } - } - int lastStackFrame = -1; TrapData[] previousTrap = null; @@ -325,174 +298,184 @@ final int c = readByte(byteCodes, i); switch (c) { case opc_aload_0: - emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(0)); + emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(0)); break; case opc_iload_0: - emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(0)); + emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0)); break; case opc_lload_0: - emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(0)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0)); break; case opc_fload_0: - emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(0)); + emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0)); break; case opc_dload_0: - emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(0)); + emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(0)); break; case opc_aload_1: - emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(1)); + emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(1)); break; case opc_iload_1: - emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(1)); + emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1)); break; case opc_lload_1: - emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(1)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1)); break; case opc_fload_1: - emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(1)); + emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1)); break; case opc_dload_1: - emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(1)); + emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(1)); break; case opc_aload_2: - emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(2)); + emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(2)); break; case opc_iload_2: - emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(2)); + emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2)); break; case opc_lload_2: - emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(2)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2)); break; case opc_fload_2: - emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(2)); + emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2)); break; case opc_dload_2: - emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(2)); + emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(2)); break; case opc_aload_3: - emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(3)); + emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(3)); break; case opc_iload_3: - emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(3)); + emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3)); break; case opc_lload_3: - emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(3)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3)); break; case opc_fload_3: - emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(3)); + emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3)); break; case opc_dload_3: - emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(3)); + emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(3)); break; case opc_iload: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", smapper.pushI(), lmapper.getI(indx)); + emit(out, "var @1 = @2;", + smapper.pushI(), lmapper.getI(indx)); break; } case opc_lload: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", smapper.pushL(), lmapper.getL(indx)); + emit(out, "var @1 = @2;", + smapper.pushL(), lmapper.getL(indx)); break; } case opc_fload: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", smapper.pushF(), lmapper.getF(indx)); + emit(out, "var @1 = @2;", + smapper.pushF(), lmapper.getF(indx)); break; } case opc_dload: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", smapper.pushD(), lmapper.getD(indx)); + emit(out, "var @1 = @2;", + smapper.pushD(), lmapper.getD(indx)); break; } case opc_aload: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", smapper.pushA(), lmapper.getA(indx)); + emit(out, "var @1 = @2;", + smapper.pushA(), lmapper.getA(indx)); break; } case opc_istore: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", lmapper.setI(indx), smapper.popI()); + emit(out, "var @1 = @2;", + lmapper.setI(indx), smapper.popI()); break; } case opc_lstore: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", lmapper.setL(indx), smapper.popL()); + emit(out, "var @1 = @2;", + lmapper.setL(indx), smapper.popL()); break; } case opc_fstore: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", lmapper.setF(indx), smapper.popF()); + emit(out, "var @1 = @2;", + lmapper.setF(indx), smapper.popF()); break; } case opc_dstore: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", lmapper.setD(indx), smapper.popD()); + emit(out, "var @1 = @2;", + lmapper.setD(indx), smapper.popD()); break; } case opc_astore: { final int indx = readByte(byteCodes, ++i); - emit(out, "@1 = @2;", lmapper.setA(indx), smapper.popA()); + emit(out, "var @1 = @2;", + lmapper.setA(indx), smapper.popA()); break; } case opc_astore_0: - emit(out, "@1 = @2;", lmapper.setA(0), smapper.popA()); + emit(out, "var @1 = @2;", lmapper.setA(0), smapper.popA()); break; case opc_istore_0: - emit(out, "@1 = @2;", lmapper.setI(0), smapper.popI()); + emit(out, "var @1 = @2;", lmapper.setI(0), smapper.popI()); break; case opc_lstore_0: - emit(out, "@1 = @2;", lmapper.setL(0), smapper.popL()); + emit(out, "var @1 = @2;", lmapper.setL(0), smapper.popL()); break; case opc_fstore_0: - emit(out, "@1 = @2;", lmapper.setF(0), smapper.popF()); + emit(out, "var @1 = @2;", lmapper.setF(0), smapper.popF()); break; case opc_dstore_0: - emit(out, "@1 = @2;", lmapper.setD(0), smapper.popD()); + emit(out, "var @1 = @2;", lmapper.setD(0), smapper.popD()); break; case opc_astore_1: - emit(out, "@1 = @2;", lmapper.setA(1), smapper.popA()); + emit(out, "var @1 = @2;", lmapper.setA(1), smapper.popA()); break; case opc_istore_1: - emit(out, "@1 = @2;", lmapper.setI(1), smapper.popI()); + emit(out, "var @1 = @2;", lmapper.setI(1), smapper.popI()); break; case opc_lstore_1: - emit(out, "@1 = @2;", lmapper.setL(1), smapper.popL()); + emit(out, "var @1 = @2;", lmapper.setL(1), smapper.popL()); break; case opc_fstore_1: - emit(out, "@1 = @2;", lmapper.setF(1), smapper.popF()); + emit(out, "var @1 = @2;", lmapper.setF(1), smapper.popF()); break; case opc_dstore_1: - emit(out, "@1 = @2;", lmapper.setD(1), smapper.popD()); + emit(out, "var @1 = @2;", lmapper.setD(1), smapper.popD()); break; case opc_astore_2: - emit(out, "@1 = @2;", lmapper.setA(2), smapper.popA()); + emit(out, "var @1 = @2;", lmapper.setA(2), smapper.popA()); break; case opc_istore_2: - emit(out, "@1 = @2;", lmapper.setI(2), smapper.popI()); + emit(out, "var @1 = @2;", lmapper.setI(2), smapper.popI()); break; case opc_lstore_2: - emit(out, "@1 = @2;", lmapper.setL(2), smapper.popL()); + emit(out, "var @1 = @2;", lmapper.setL(2), smapper.popL()); break; case opc_fstore_2: - emit(out, "@1 = @2;", lmapper.setF(2), smapper.popF()); + emit(out, "var @1 = @2;", lmapper.setF(2), smapper.popF()); break; case opc_dstore_2: - emit(out, "@1 = @2;", lmapper.setD(2), smapper.popD()); + emit(out, "var @1 = @2;", lmapper.setD(2), smapper.popD()); break; case opc_astore_3: - emit(out, "@1 = @2;", lmapper.setA(3), smapper.popA()); + emit(out, "var @1 = @2;", lmapper.setA(3), smapper.popA()); break; case opc_istore_3: - emit(out, "@1 = @2;", lmapper.setI(3), smapper.popI()); + emit(out, "var @1 = @2;", lmapper.setI(3), smapper.popI()); break; case opc_lstore_3: - emit(out, "@1 = @2;", lmapper.setL(3), smapper.popL()); + emit(out, "var @1 = @2;", lmapper.setL(3), smapper.popL()); break; case opc_fstore_3: - emit(out, "@1 = @2;", lmapper.setF(3), smapper.popF()); + emit(out, "var @1 = @2;", lmapper.setF(3), smapper.popF()); break; case opc_dstore_3: - emit(out, "@1 = @2;", lmapper.setD(3), smapper.popD()); + emit(out, "var @1 = @2;", lmapper.setD(3), smapper.popD()); break; case opc_iadd: emit(out, "@1 = @1.add32(@2);", smapper.getI(1), smapper.popI()); @@ -635,105 +618,105 @@ emit(out, "return @1;", smapper.popA()); break; case opc_i2l: - emit(out, "@2 = @1;", smapper.popI(), smapper.pushL()); + emit(out, "var @2 = @1;", smapper.popI(), smapper.pushL()); break; case opc_i2f: - emit(out, "@2 = @1;", smapper.popI(), smapper.pushF()); + emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF()); break; case opc_i2d: - emit(out, "@2 = @1;", smapper.popI(), smapper.pushD()); + emit(out, "var @2 = @1;", smapper.popI(), smapper.pushD()); break; case opc_l2i: - emit(out, "@2 = @1;", smapper.popL(), smapper.pushI()); + emit(out, "var @2 = @1;", smapper.popL(), smapper.pushI()); break; // max int check? case opc_l2f: - emit(out, "@2 = @1;", smapper.popL(), smapper.pushF()); + emit(out, "var @2 = @1;", smapper.popL(), smapper.pushF()); break; case opc_l2d: - emit(out, "@2 = @1;", smapper.popL(), smapper.pushD()); + emit(out, "var @2 = @1;", smapper.popL(), smapper.pushD()); break; case opc_f2d: - emit(out, "@2 = @1;", smapper.popF(), smapper.pushD()); + emit(out, "var @2 = @1;", smapper.popF(), smapper.pushD()); break; case opc_d2f: - emit(out, "@2 = @1;", smapper.popD(), smapper.pushF()); + emit(out, "var @2 = @1;", smapper.popD(), smapper.pushF()); break; case opc_f2i: - emit(out, "@2 = Math.floor(@1);", + emit(out, "var @2 = Math.floor(@1);", smapper.popF(), smapper.pushI()); break; case opc_f2l: - emit(out, "@2 = Math.floor(@1);", + emit(out, "var @2 = Math.floor(@1);", smapper.popF(), smapper.pushL()); break; case opc_d2i: - emit(out, "@2 = Math.floor(@1);", + emit(out, "var @2 = Math.floor(@1);", smapper.popD(), smapper.pushI()); break; case opc_d2l: - emit(out, "@2 = Math.floor(@1);", + emit(out, "var @2 = Math.floor(@1);", smapper.popD(), smapper.pushL()); break; case opc_i2b: - emit(out, "@1 = @1.toInt8();", smapper.getI(0)); + emit(out, "var @1 = @1.toInt8();", smapper.getI(0)); break; case opc_i2c: out.append("{ /* number conversion */ }"); break; case opc_i2s: - emit(out, "@1 = @1.toInt16();", smapper.getI(0)); + emit(out, "var @1 = @1.toInt16();", smapper.getI(0)); break; case opc_aconst_null: - emit(out, "@1 = null;", smapper.pushA()); + emit(out, "var @1 = null;", smapper.pushA()); break; case opc_iconst_m1: - emit(out, "@1 = -1;", smapper.pushI()); + emit(out, "var @1 = -1;", smapper.pushI()); break; case opc_iconst_0: - emit(out, "@1 = 0;", smapper.pushI()); + emit(out, "var @1 = 0;", smapper.pushI()); break; case opc_dconst_0: - emit(out, "@1 = 0;", smapper.pushD()); + emit(out, "var @1 = 0;", smapper.pushD()); break; case opc_lconst_0: - emit(out, "@1 = 0;", smapper.pushL()); + emit(out, "var @1 = 0;", smapper.pushL()); break; case opc_fconst_0: - emit(out, "@1 = 0;", smapper.pushF()); + emit(out, "var @1 = 0;", smapper.pushF()); break; case opc_iconst_1: - emit(out, "@1 = 1;", smapper.pushI()); + emit(out, "var @1 = 1;", smapper.pushI()); break; case opc_lconst_1: - emit(out, "@1 = 1;", smapper.pushL()); + emit(out, "var @1 = 1;", smapper.pushL()); break; case opc_fconst_1: - emit(out, "@1 = 1;", smapper.pushF()); + emit(out, "var @1 = 1;", smapper.pushF()); break; case opc_dconst_1: - emit(out, "@1 = 1;", smapper.pushD()); + emit(out, "var @1 = 1;", smapper.pushD()); break; case opc_iconst_2: - emit(out, "@1 = 2;", smapper.pushI()); + emit(out, "var @1 = 2;", smapper.pushI()); break; case opc_fconst_2: - emit(out, "@1 = 2;", smapper.pushF()); + emit(out, "var @1 = 2;", smapper.pushF()); break; case opc_iconst_3: - emit(out, "@1 = 3;", smapper.pushI()); + emit(out, "var @1 = 3;", smapper.pushI()); break; case opc_iconst_4: - emit(out, "@1 = 4;", smapper.pushI()); + emit(out, "var @1 = 4;", smapper.pushI()); break; case opc_iconst_5: - emit(out, "@1 = 5;", smapper.pushI()); + emit(out, "var @1 = 5;", smapper.pushI()); break; case opc_ldc: { int indx = readByte(byteCodes, ++i); String v = encodeConstant(indx); int type = VarType.fromConstantType(jc.getTag(indx)); - emit(out, "@1 = @2;", smapper.pushT(type), v); + emit(out, "var @1 = @2;", smapper.pushT(type), v); break; } case opc_ldc_w: @@ -742,21 +725,21 @@ i += 2; String v = encodeConstant(indx); int type = VarType.fromConstantType(jc.getTag(indx)); - emit(out, "@1 = @2;", smapper.pushT(type), v); + emit(out, "var @1 = @2;", smapper.pushT(type), v); break; } case opc_lcmp: - emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);", + emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);", smapper.popL(), smapper.popL(), smapper.pushI()); break; case opc_fcmpl: case opc_fcmpg: - emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);", + emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);", smapper.popF(), smapper.popF(), smapper.pushI()); break; case opc_dcmpl: case opc_dcmpg: - emit(out, "@3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);", + emit(out, "var @3 = (@2 == @1) ? 0 : ((@2 < @1) ? -1 : 1);", smapper.popD(), smapper.popD(), smapper.pushI()); break; case opc_if_acmpeq: @@ -906,7 +889,7 @@ case opc_new: { int indx = readIntArg(byteCodes, i); String ci = jc.getClassName(indx); - emit(out, "@1 = new @2;", + emit(out, "var @1 = new @2;", smapper.pushA(), accessClass(ci.replace('/', '_'))); addReference(ci); i += 2; @@ -926,7 +909,7 @@ case 11: jvmType = "[J"; break; default: throw new IllegalStateException("Array type: " + atype); } - emit(out, "@2 = new Array(@1).initWith('@3', 0);", + emit(out, "var @2 = new Array(@1).initWith('@3', 0);", smapper.popI(), smapper.pushA(), jvmType); break; case opc_anewarray: { @@ -938,7 +921,7 @@ } else { typeName = "[L" + typeName + ";"; } - emit(out, "@2 = new Array(@1).initWith('@3', null);", + emit(out, "var @2 = new Array(@1).initWith('@3', null);", smapper.popI(), smapper.pushA(), typeName); break; } @@ -966,11 +949,13 @@ for (int d = 1; d < dim; d++) { out.append("\n }"); } - out.append("\n").append(smapper.pushA()).append(" = a0; }"); + out.append("\nvar ").append(smapper.pushA()) + .append(" = a0; }"); break; } case opc_arraylength: - emit(out, "@2 = @1.length;", smapper.popA(), smapper.pushI()); + emit(out, "var @2 = @1.length;", + smapper.popA(), smapper.pushI()); break; case opc_lastore: emit(out, "@3.at(@2, @1);", @@ -996,26 +981,26 @@ smapper.popI(), smapper.popI(), smapper.popA()); break; case opc_laload: - emit(out, "@3 = @2.at(@1);", + emit(out, "var @3 = @2.at(@1);", smapper.popI(), smapper.popA(), smapper.pushL()); break; case opc_faload: - emit(out, "@3 = @2.at(@1);", + emit(out, "var @3 = @2.at(@1);", smapper.popI(), smapper.popA(), smapper.pushF()); break; case opc_daload: - emit(out, "@3 = @2.at(@1);", + emit(out, "var @3 = @2.at(@1);", smapper.popI(), smapper.popA(), smapper.pushD()); break; case opc_aaload: - emit(out, "@3 = @2.at(@1);", + emit(out, "var @3 = @2.at(@1);", smapper.popI(), smapper.popA(), smapper.pushA()); break; case opc_iaload: case opc_baload: case opc_caload: case opc_saload: - emit(out, "@3 = @2.at(@1);", + emit(out, "var @3 = @2.at(@1);", smapper.popI(), smapper.popA(), smapper.pushI()); break; case opc_pop: @@ -1025,17 +1010,18 @@ break; case opc_dup: { final Variable v = smapper.get(0); - emit(out, "@1 = @2;", smapper.pushT(v.getType()), v); + emit(out, "var @1 = @2;", smapper.pushT(v.getType()), v); break; } case opc_dup2: { if (smapper.get(0).isCategory2()) { final Variable v = smapper.get(0); - emit(out, "@1 = @2;", smapper.pushT(v.getType()), v); + emit(out, "var @1 = @2;", + smapper.pushT(v.getType()), v); } else { final Variable v1 = smapper.get(0); final Variable v2 = smapper.get(1); - emit(out, "{ @1 = @2; @3 = @4; }", + emit(out, "var @1 = @2, @3 = @4;", smapper.pushT(v2.getType()), v2, smapper.pushT(v1.getType()), v1); } @@ -1048,7 +1034,7 @@ final Variable vo2 = smapper.pushT(vi2.getType()); final Variable vo1 = smapper.pushT(vi1.getType()); - emit(out, "{ @1 = @2; @3 = @4; @5 = @6; }", + emit(out, "var @1 = @2, @3 = @4, @5 = @6;", vo1, vi1, vo2, vi2, vo3, vo1); break; } @@ -1060,7 +1046,7 @@ final Variable vo2 = smapper.pushT(vi2.getType()); final Variable vo1 = smapper.pushT(vi1.getType()); - emit(out, "{ @1 = @2; @3 = @4; @5 = @6; }", + emit(out, "var @1 = @2, @3 = @4, @5 = @6;", vo1, vi1, vo2, vi2, vo3, vo1); } else { final Variable vi1 = smapper.pop(); @@ -1071,17 +1057,17 @@ final Variable vo2 = smapper.pushT(vi2.getType()); final Variable vo1 = smapper.pushT(vi1.getType()); - emit(out, "{ @1 = @2; @3 = @4; @5 = @6; @7 = @8; }", + emit(out, "var @1 = @2, @3 = @4, @5 = @6, @7 = @8;", vo1, vi1, vo2, vi2, vo3, vi3, vo4, vo1); } break; } case opc_bipush: - emit(out, "@1 = @2;", + emit(out, "var @1 = @2;", smapper.pushI(), Integer.toString(byteCodes[++i])); break; case opc_sipush: - emit(out, "@1 = @2;", + emit(out, "var @1 = @2;", smapper.pushI(), Integer.toString(readIntArg(byteCodes, i))); i += 2; @@ -1090,7 +1076,7 @@ int indx = readIntArg(byteCodes, i); String[] fi = jc.getFieldInfoName(indx); final int type = VarType.fromFieldType(fi[2].charAt(0)); - emit(out, "@2 = @1.fld_@3;", + emit(out, "var @2 = @1.fld_@3;", smapper.popA(), smapper.pushT(type), fi[1]); i += 2; break; @@ -1099,7 +1085,7 @@ int indx = readIntArg(byteCodes, i); String[] fi = jc.getFieldInfoName(indx); final int type = VarType.fromFieldType(fi[2].charAt(0)); - emit(out, "@1 = @2(false).constructor.@3;", + emit(out, "var @1 = @2(false).constructor.@3;", smapper.pushT(type), accessClass(fi[0].replace('/', '_')), fi[1]); i += 2; @@ -1142,7 +1128,7 @@ case opc_instanceof: { int indx = readIntArg(byteCodes, i); final String type = jc.getClassName(indx); - emit(out, "@2 = @1.$instOf_@3 ? 1 : 0;", + emit(out, "var @2 = @1.$instOf_@3 ? 1 : 0;", smapper.popA(), smapper.pushI(), type.replace('/', '_')); i += 2; @@ -1152,7 +1138,7 @@ final Variable v = smapper.popA(); smapper.clear(); - emit(out, "{ @1 = @2; throw @2; }", + emit(out, "{ var @1 = @2; throw @2; }", smapper.pushA(), v); break; } @@ -1352,7 +1338,8 @@ } if (returnType[0] != 'V') { - out.append(mapper.pushT(VarType.fromFieldType(returnType[0]))) + out.append("var ") + .append(mapper.pushT(VarType.fromFieldType(returnType[0]))) .append(" = "); } @@ -1396,7 +1383,8 @@ } if (returnType[0] != 'V') { - out.append(mapper.pushT(VarType.fromFieldType(returnType[0]))) + out.append("var ") + .append(mapper.pushT(VarType.fromFieldType(returnType[0]))) .append(" = "); } @@ -1628,15 +1616,15 @@ addReference(classInternalName); if ("java/lang/Throwable".equals(classInternalName)) { out.append("if (e.$instOf_java_lang_Throwable) {"); - out.append(" stA0 = e;"); + out.append(" var stA0 = e;"); out.append("} else {"); - out.append(" stA0 = vm.java_lang_Throwable(true);"); + out.append(" var stA0 = vm.java_lang_Throwable(true);"); out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2.call(stA0, e.toString());"); out.append("}"); out.append("gt=" + e.handler_pc + "; continue;"); } else { out.append("if (e.$instOf_" + classInternalName.replace('/', '_') + ") {"); - out.append("gt=" + e.handler_pc + "; stA0 = e; continue;"); + out.append("gt=" + e.handler_pc + "; var stA0 = e; continue;"); out.append("}\n"); } } else { @@ -1646,7 +1634,7 @@ if (finallyPC == -1) { out.append("throw e;"); } else { - out.append("gt=" + finallyPC + "; stA0 = e; continue;"); + out.append("gt=" + finallyPC + "; var stA0 = e; continue;"); } out.append("\n}"); }