# HG changeset patch # User Jaroslav Tulach # Date 1392471403 -3600 # Node ID e046cfcb8f0052ccdce27ecfa560c312a7ffe604 # Parent 3ec3ae9699ef2c4fc9a7bd3459364f5aac7a322b Centralizing the stack pushes into single assign method diff -r 3ec3ae9699ef -r e046cfcb8f00 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Feb 07 10:03:44 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Feb 15 14:36:43 2014 +0100 @@ -367,72 +367,71 @@ final int c = readUByte(byteCodes, i); switch (c) { case opc_aload_0: - emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(0)); + smapper.assign(out, VarType.REFERENCE, lmapper.getA(0)); break; case opc_iload_0: - emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0)); + smapper.assign(out, VarType.INTEGER, lmapper.getI(0)); break; case opc_lload_0: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0)); + smapper.assign(out, VarType.LONG, lmapper.getL(0)); break; case opc_fload_0: - emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0)); + smapper.assign(out, VarType.FLOAT, lmapper.getF(0)); break; case opc_dload_0: - emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(0)); + smapper.assign(out, VarType.DOUBLE, lmapper.getD(0)); break; case opc_aload_1: - emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(1)); + smapper.assign(out, VarType.REFERENCE, lmapper.getA(1)); break; case opc_iload_1: - emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1)); + smapper.assign(out, VarType.INTEGER, lmapper.getI(1)); break; case opc_lload_1: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1)); + smapper.assign(out, VarType.LONG, lmapper.getL(1)); break; case opc_fload_1: - emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1)); + smapper.assign(out, VarType.FLOAT, lmapper.getF(1)); break; case opc_dload_1: - emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(1)); + smapper.assign(out, VarType.DOUBLE, lmapper.getD(1)); break; case opc_aload_2: - emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(2)); + smapper.assign(out, VarType.REFERENCE, lmapper.getA(2)); break; case opc_iload_2: - emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2)); + smapper.assign(out, VarType.INTEGER, lmapper.getI(2)); break; case opc_lload_2: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2)); + smapper.assign(out, VarType.LONG, lmapper.getL(2)); break; case opc_fload_2: - emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2)); + smapper.assign(out, VarType.FLOAT, lmapper.getF(2)); break; case opc_dload_2: - emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(2)); + smapper.assign(out, VarType.DOUBLE, lmapper.getD(2)); break; case opc_aload_3: - emit(out, "var @1 = @2;", smapper.pushA(), lmapper.getA(3)); + smapper.assign(out, VarType.REFERENCE, lmapper.getA(3)); break; case opc_iload_3: - emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3)); + smapper.assign(out, VarType.INTEGER, lmapper.getI(3)); break; case opc_lload_3: - emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3)); + smapper.assign(out, VarType.LONG, lmapper.getL(3)); break; case opc_fload_3: - emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3)); + smapper.assign(out, VarType.FLOAT, lmapper.getF(3)); break; case opc_dload_3: - emit(out, "var @1 = @2;", smapper.pushD(), lmapper.getD(3)); + smapper.assign(out, VarType.DOUBLE, lmapper.getD(3)); break; case opc_iload: { ++i; final int indx = wide ? readUShort(byteCodes, i++) : readUByte(byteCodes, i); wide = false; - emit(out, "var @1 = @2;", - smapper.pushI(), lmapper.getI(indx)); + smapper.assign(out, VarType.INTEGER, lmapper.getI(indx)); break; } case opc_lload: { @@ -440,8 +439,7 @@ final int indx = wide ? readUShort(byteCodes, i++) : readUByte(byteCodes, i); wide = false; - emit(out, "var @1 = @2;", - smapper.pushL(), lmapper.getL(indx)); + smapper.assign(out, VarType.LONG, lmapper.getL(indx)); break; } case opc_fload: { @@ -449,8 +447,7 @@ final int indx = wide ? readUShort(byteCodes, i++) : readUByte(byteCodes, i); wide = false; - emit(out, "var @1 = @2;", - smapper.pushF(), lmapper.getF(indx)); + smapper.assign(out, VarType.FLOAT, lmapper.getF(indx)); break; } case opc_dload: { @@ -458,8 +455,7 @@ final int indx = wide ? readUShort(byteCodes, i++) : readUByte(byteCodes, i); wide = false; - emit(out, "var @1 = @2;", - smapper.pushD(), lmapper.getD(indx)); + smapper.assign(out, VarType.DOUBLE, lmapper.getD(indx)); break; } case opc_aload: { @@ -467,8 +463,7 @@ final int indx = wide ? readUShort(byteCodes, i++) : readUByte(byteCodes, i); wide = false; - emit(out, "var @1 = @2;", - smapper.pushA(), lmapper.getA(indx)); + smapper.assign(out, VarType.REFERENCE, lmapper.getA(indx)); break; } case opc_istore: { @@ -1935,7 +1930,7 @@ return ","; } - private static void emit(final Appendable out, + static void emit(final Appendable out, final String format, final CharSequence... params) throws IOException { final int length = format.length(); diff -r 3ec3ae9699ef -r e046cfcb8f00 rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Fri Feb 07 10:03:44 2014 +0100 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/StackMapper.java Sat Feb 15 14:36:43 2014 +0100 @@ -17,6 +17,7 @@ */ package org.apidesign.vm4brwsr; +import java.io.IOException; import org.apidesign.vm4brwsr.ByteCodeParser.TypeArray; final class StackMapper { @@ -70,6 +71,10 @@ return getVariable(pushTypeImpl(type)); } + void assign(Appendable out, int varType, CharSequence s) throws IOException { + ByteCodeToJavaScript.emit(out, "var @1 = @2;", pushT(varType), s); + } + public Variable popI() { return popT(VarType.INTEGER); } diff -r 3ec3ae9699ef -r e046cfcb8f00 rt/vm/src/test/java/org/apidesign/vm4brwsr/SizeOfAMethodTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/SizeOfAMethodTest.java Sat Feb 15 14:36:43 2014 +0100 @@ -0,0 +1,63 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package org.apidesign.vm4brwsr; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author Jaroslav Tulach + */ +public class SizeOfAMethodTest { + private static TestVM code; + + @Test public void sumXYShouldBeSmall() { + String s = code.codeSeq().toString(); + int beg = s.indexOf("c.sum__III"); + int end = s.indexOf("c.sum__III.access"); + + assertTrue(beg > 0, "Found sum method in " + code.toString()); + assertTrue(beg < end, "Found end of sum method in " + code.toString()); + + String method = s.substring(beg, end); + + assertEquals(method.indexOf("st"), -1, "There should be no stack operations:\n" + method); + } + + + @BeforeClass + public static void compileTheCode() throws Exception { + StringBuilder sb = new StringBuilder(); + code = TestVM.compileClass(sb, "org/apidesign/vm4brwsr/StaticMethod"); + } + @AfterClass + public static void releaseTheCode() { + code = null; + } + +} diff -r 3ec3ae9699ef -r e046cfcb8f00 rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Fri Feb 07 10:03:44 2014 +0100 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Sat Feb 15 14:36:43 2014 +0100 @@ -164,7 +164,10 @@ return ex.toString(); } } - + + final CharSequence codeSeq() { + return codeSeq; + } private static class EmulationResources implements Bck2Brwsr.Resources { @Override