# HG changeset patch # User Martin Soch # Date 1358114874 -3600 # Node ID 7df624c2a0a1b872f2a9452bf79b4608de682536 # Parent 12e866a32b40c4062101a8341a4f65e7b2d9d6ab Integer arithmetic expressions extracted into simple functions. diff -r 12e866a32b40 -r 7df624c2a0a1 emul/src/main/java/java/lang/Number.java --- a/emul/src/main/java/java/lang/Number.java Fri Jan 11 16:36:28 2013 +0100 +++ b/emul/src/main/java/java/lang/Number.java Sun Jan 13 23:07:54 2013 +0100 @@ -25,6 +25,8 @@ package java.lang; +import org.apidesign.bck2brwsr.core.ExtraJavaScript; + /** * The abstract class Number is the superclass of classes * BigDecimal, BigInteger, @@ -46,6 +48,10 @@ * @see java.lang.Short * @since JDK1.0 */ +@ExtraJavaScript( + resource="/org/apidesign/vm4brwsr/emul/java_lang_Number.js", + processByteCode=true +) public abstract class Number implements java.io.Serializable { /** * Returns the value of the specified number as an int. diff -r 12e866a32b40 -r 7df624c2a0a1 emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_Number.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_Number.js Sun Jan 13 23:07:54 2013 +0100 @@ -0,0 +1,6 @@ +// empty line needed here +__add32 = function(x,y) { return (x + y) | 0; }; +__sub32 = function(x,y) { return (x - y) | 0; }; +__mul32 = function(x,y) { + return (((x * (y >> 16)) << 16) + x * (y & 0xFFFF)) | 0; +}; diff -r 12e866a32b40 -r 7df624c2a0a1 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Jan 11 16:36:28 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jan 13 23:07:54 2013 +0100 @@ -491,7 +491,7 @@ emit(out, "@1 = @2;", lmapper.setD(3), smapper.popD()); break; case opc_iadd: - emit(out, "@1 = (@1 + @2) | 0;", smapper.getI(1), smapper.popI()); + emit(out, "@1 = __add32(@1,@2);", smapper.getI(1), smapper.popI()); break; case opc_ladd: emit(out, "@1 += @2;", smapper.getL(1), smapper.popL()); @@ -503,7 +503,7 @@ emit(out, "@1 += @2;", smapper.getD(1), smapper.popD()); break; case opc_isub: - emit(out, "@1 = (@1 - @2) | 0;", smapper.getI(1), smapper.popI()); + emit(out, "@1 = __sub32(@1,@2);", smapper.getI(1), smapper.popI()); break; case opc_lsub: emit(out, "@1 -= @2;", smapper.getL(1), smapper.popL()); @@ -515,7 +515,7 @@ emit(out, "@1 -= @2;", smapper.getD(1), smapper.popD()); break; case opc_imul: - emit(out, "@1 = (((@1 * (@2 >> 16)) << 16) + @1 * (@2 & 0xFFFF)) | 0;", smapper.getI(1), smapper.popI()); + emit(out, "@1 = __mul32(@1,@2);", smapper.getI(1), smapper.popI()); break; case opc_lmul: emit(out, "@1 *= @2;", smapper.getL(1), smapper.popL());