# HG changeset patch # User Jaroslav Tulach # Date 1399449714 -7200 # Node ID bafa63ac44a2f262c3cf99672eb2c80594ce21fa # Parent 12a95b773a398a479eff308ac283639f0e35fc57 Shortening constructor calls and access to arrays diff -r 12a95b773a39 -r bafa63ac44a2 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed May 07 09:38:30 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed May 07 10:01:54 2014 +0200 @@ -1118,7 +1118,11 @@ break; case opc_dup: { final Variable v = smapper.get(0); - emit(smapper, this, "var @1 = @2;", smapper.pushT(v.getType()), v); + if (smapper.isDirty()) { + emit(smapper, this, "var @1 = @2;", smapper.pushT(v.getType()), v); + } else { + smapper.assign(this, v.getType(), v); + } break; } case opc_dup2: { diff -r 12a95b773a39 -r bafa63ac44a2 rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Wed May 07 09:38:30 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Wed May 07 10:01:54 2014 +0200 @@ -23,6 +23,7 @@ final class StackMapper { private final TypeArray stackTypeIndexPairs; private final StringArray stackValues; + private boolean dirty; public StackMapper() { stackTypeIndexPairs = new TypeArray(); @@ -32,6 +33,7 @@ public void clear() { stackTypeIndexPairs.clear(); stackValues.clear(); + dirty = false; } public void syncWithFrameStack(final TypeArray frameStack) { @@ -70,7 +72,7 @@ void assign(Appendable out, int varType, CharSequence s) throws IOException { pushTypeAndValue(varType, s); } - + void replace(Appendable out, int varType, String format, CharSequence... arr) throws IOException { StringBuilder sb = new StringBuilder(); @@ -78,6 +80,7 @@ String[] values = stackValues.toArray(); final int last = stackTypeIndexPairs.getSize() - 1; values[last] = sb.toString(); + dirty = true; final int value = (last << 8) | (varType & 0xff); stackTypeIndexPairs.set(last, value); } @@ -92,6 +95,11 @@ CharSequence var = getVariable(stackTypeIndexPairs.get(i)); ByteCodeToJavaScript.emitImpl(out, "var @1 = @2;", var, val); } + dirty = false; + } + + public boolean isDirty() { + return dirty; } public CharSequence popI() { @@ -216,6 +224,7 @@ } else { stackValues.add(val); } + dirty = true; } private void popImpl(final int count) {