# HG changeset patch # User Martin Soch # Date 1359328538 -3600 # Node ID 035fcbd7a33c8981895f05cc303fdcbfbec5b6a2 # Parent b42911b78a165e4cd7546097ade87f7697a69b39 using Number for as a base for Long number type diff -r b42911b78a16 -r 035fcbd7a33c emul/mini/src/main/java/java/lang/Character.java --- a/emul/mini/src/main/java/java/lang/Character.java Sun Jan 27 10:19:02 2013 +0100 +++ b/emul/mini/src/main/java/java/lang/Character.java Mon Jan 28 00:15:38 2013 +0100 @@ -2193,6 +2193,10 @@ * @see Character#isDigit(int) * @since 1.5 */ + @JavaScriptBody(args = { "codePoint", "radix" }, body= + "var x = parseInt(String.fromCharCode(codePoint), radix);\n" + + "return isNaN(x) ? -1 : x;" + ) public static int digit(int codePoint, int radix) { throw new UnsupportedOperationException(); } diff -r b42911b78a16 -r 035fcbd7a33c emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Sun Jan 27 10:19:02 2013 +0100 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Mon Jan 28 00:15:38 2013 +0100 @@ -8,64 +8,63 @@ Number.prototype.toInt8 = function() { return (this << 24) >> 24; }; Number.prototype.toInt16 = function() { return (this << 16) >> 16; }; -var Long = function(low, hi) { - this.low = low; - this.hi = hi; +Number.prototype.next32 = function(low) { + if (this === 0) { + return low; + } + var l = new Number(low); + l.hi = this; + return l; }; -function LongFromNumber(x) { - return new Long(x % 0xFFFFFFFF, Math.floor(x / 0xFFFFFFFF)); +Number.prototype.high32 = function() { + return this.hi ? this.hi : (Math.floor(this / 0xFFFFFFFF)) | 0; +}; +Number.prototype.toInt32 = function() { return this | 0; }; +Number.prototype.toFP = function() { + return this.hi ? this.hi * 0xFFFFFFFF + this : this; +}; +Number.prototype.toLong = function() { + var hi = (this > 0xFFFFFFFF) ? (Math.floor(this / 0xFFFFFFFF)) | 0 : 0; + return hi.next32(this % 0xFFFFFFFF); +} + +Number.prototype.add64 = function(x) { + var low = this + x; + carry = 0; + if (low > 0xFFFFFFFF) { + carry = 1; + low -= 0xFFFFFFFF; // should not here be also -1? + } + var hi = (this.high32() + x.high32() + carry) & 0xFFFFFFFF; + return hi.next32(low); }; -function MakeLong(x) { - if ((x.hi == undefined) && (x.low == undefined)) { - return LongFromNumber(x); +Number.prototype.div64 = function(x) { + var low = Math.floor(this.toFP() / x.toFP()); // TODO: not exact enough + if (low > 0xFFFFFFFF) { + var hi = Math.floor(low / 0xFFFFFFFF) | 0; + return hi.next32(low % 0xFFFFFFFF); } - return x; + return low; }; -Long.prototype.toInt32 = function() { return this.low | 0; }; -Long.prototype.toFP = function() { return this.hi * 0xFFFFFFFF + this.low; }; - -Long.prototype.toString = function() { - return String(this.toFP()); +Number.prototype.shl64 = function(x) { + if (x > 32) { + var hi = (this << (x - 32)) & 0xFFFFFFFF; + return hi.next32(0); + } else { + var hi = (this.high32() << x) & 0xFFFFFFFF; + var low_reminder = this >> x; + hi |= low_reminder; + var low = this << x; + return hi.next32(low); + } }; -Long.prototype.valueOf = function() { - return this.toFP(); -}; - -Long.prototype.compare64 = function(x) { +Number.prototype.compare64 = function(x) { if (this.hi == x.hi) { - return (this.low == x.low) ? 0 : ((this.low < x.low) ? -1 : 1); + return (this == x) ? 0 : ((this < x) ? -1 : 1); } return (this.hi < x.hi) ? -1 : 1; }; - -Long.prototype.add64 = function(x) { - low = this.low + x.low; - carry = 0; - if (low > 0xFFFFFFFF) { - carry = 1; - low -= 0xFFFFFFFF; - } - hi = (this.hi + x.hi + carry) & 0xFFFFFFFF; - return new Long(low, hi); -}; - -Long.prototype.div64 = function(x) { - return LongFromNumber(Math.floor(this.toFP() / x.toFP())); -}; - -Long.prototype.shl64 = function(x) { - if (x > 32) { - hi = (this.low << (x - 32)) & 0xFFFFFFFF; - low = 0; - } else { - hi = (this.hi << x) & 0xFFFFFFFF; - low_reminder = this.low >> x; - hi |= low_reminder; - low = this.low << x; - } - return new Long(low, hi); -}; diff -r b42911b78a16 -r 035fcbd7a33c vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jan 27 10:19:02 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 28 00:15:38 2013 +0100 @@ -313,7 +313,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0)); break; case opc_lload_0: - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(0)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0)); break; case opc_fload_0: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0)); @@ -328,7 +328,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1)); break; case opc_lload_1: - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(1)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1)); break; case opc_fload_1: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1)); @@ -343,7 +343,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2)); break; case opc_lload_2: - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(2)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2)); break; case opc_fload_2: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2)); @@ -358,7 +358,7 @@ emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3)); break; case opc_lload_3: - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(3)); + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3)); break; case opc_fload_3: emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3)); @@ -662,7 +662,7 @@ emit(out, "return @1;", smapper.popA()); break; case opc_i2l: - emit(out, "var @2 = new Long(@1, 0);", smapper.popI(), smapper.pushL()); + emit(out, "var @2 = @1", smapper.popI(), smapper.pushL()); break; case opc_i2f: emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF()); @@ -691,7 +691,7 @@ smapper.popF(), smapper.pushI()); break; case opc_f2l: - emit(out, "var @2 = LongFromNumber(Math.floor(@1));", + emit(out, "var @2 = Math.floor(@1).toLong();", smapper.popF(), smapper.pushL()); break; case opc_d2i: @@ -699,7 +699,7 @@ smapper.popD(), smapper.pushI()); break; case opc_d2l: - emit(out, "var @2 = LongFromNumber(Math.floor(@1));", + emit(out, "var @2 = Math.floor(@1).toLong();", smapper.popD(), smapper.pushL()); break; case opc_i2b: @@ -724,7 +724,7 @@ emit(out, "var @1 = 0;", smapper.pushD()); break; case opc_lconst_0: - emit(out, "var @1 = new Long(0,0);", smapper.pushL()); + emit(out, "var @1 = 0;", smapper.pushL()); break; case opc_fconst_0: emit(out, "var @1 = 0;", smapper.pushF()); @@ -733,7 +733,7 @@ emit(out, "var @1 = 1;", smapper.pushI()); break; case opc_lconst_1: - emit(out, "var @1 = new Long(1,0);", smapper.pushL()); + emit(out, "var @1 = 1;", smapper.pushL()); break; case opc_fconst_1: emit(out, "var @1 = 1;", smapper.pushF()); @@ -773,7 +773,7 @@ final Long lv = new Long(v); final int low = (int)(lv.longValue() & 0xFFFFFFFF); final int hi = (int)(lv.longValue() >> 32); - emit(out, "var @1 = new Long(0x@2, 0x@3);", smapper.pushL(), + emit(out, "var @1 = 0x@3.next32(0x@2);", smapper.pushL(), Integer.toHexString(low), Integer.toHexString(hi)); } else { emit(out, "var @1 = @2;", smapper.pushT(type), v); diff -r b42911b78a16 -r 035fcbd7a33c vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Sun Jan 27 10:19:02 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Mon Jan 28 00:15:38 2013 +0100 @@ -51,7 +51,7 @@ ScriptEngine[] arr = { null }; code = StaticMethodTest.compileClass(sb, arr, - "org/apidesign/vm4brwsr/VM" + new String[]{"org/apidesign/vm4brwsr/VM", "org/apidesign/vm4brwsr/StaticMethod"} ); arr[0].getContext().setAttribute("loader", new BytesLoader(), ScriptContext.ENGINE_SCOPE); codeSeq = sb;