1.1 --- a/emul/mini/src/main/java/java/lang/Character.java Sun Jan 27 10:19:02 2013 +0100
1.2 +++ b/emul/mini/src/main/java/java/lang/Character.java Mon Jan 28 00:15:38 2013 +0100
1.3 @@ -2193,6 +2193,10 @@
1.4 * @see Character#isDigit(int)
1.5 * @since 1.5
1.6 */
1.7 + @JavaScriptBody(args = { "codePoint", "radix" }, body=
1.8 + "var x = parseInt(String.fromCharCode(codePoint), radix);\n"
1.9 + + "return isNaN(x) ? -1 : x;"
1.10 + )
1.11 public static int digit(int codePoint, int radix) {
1.12 throw new UnsupportedOperationException();
1.13 }
2.1 --- a/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Sun Jan 27 10:19:02 2013 +0100
2.2 +++ b/emul/mini/src/main/resources/org/apidesign/vm4brwsr/emul/lang/java_lang_Number.js Mon Jan 28 00:15:38 2013 +0100
2.3 @@ -8,64 +8,63 @@
2.4 Number.prototype.toInt8 = function() { return (this << 24) >> 24; };
2.5 Number.prototype.toInt16 = function() { return (this << 16) >> 16; };
2.6
2.7 -var Long = function(low, hi) {
2.8 - this.low = low;
2.9 - this.hi = hi;
2.10 +Number.prototype.next32 = function(low) {
2.11 + if (this === 0) {
2.12 + return low;
2.13 + }
2.14 + var l = new Number(low);
2.15 + l.hi = this;
2.16 + return l;
2.17 };
2.18
2.19 -function LongFromNumber(x) {
2.20 - return new Long(x % 0xFFFFFFFF, Math.floor(x / 0xFFFFFFFF));
2.21 +Number.prototype.high32 = function() {
2.22 + return this.hi ? this.hi : (Math.floor(this / 0xFFFFFFFF)) | 0;
2.23 +};
2.24 +Number.prototype.toInt32 = function() { return this | 0; };
2.25 +Number.prototype.toFP = function() {
2.26 + return this.hi ? this.hi * 0xFFFFFFFF + this : this;
2.27 +};
2.28 +Number.prototype.toLong = function() {
2.29 + var hi = (this > 0xFFFFFFFF) ? (Math.floor(this / 0xFFFFFFFF)) | 0 : 0;
2.30 + return hi.next32(this % 0xFFFFFFFF);
2.31 +}
2.32 +
2.33 +Number.prototype.add64 = function(x) {
2.34 + var low = this + x;
2.35 + carry = 0;
2.36 + if (low > 0xFFFFFFFF) {
2.37 + carry = 1;
2.38 + low -= 0xFFFFFFFF; // should not here be also -1?
2.39 + }
2.40 + var hi = (this.high32() + x.high32() + carry) & 0xFFFFFFFF;
2.41 + return hi.next32(low);
2.42 };
2.43
2.44 -function MakeLong(x) {
2.45 - if ((x.hi == undefined) && (x.low == undefined)) {
2.46 - return LongFromNumber(x);
2.47 +Number.prototype.div64 = function(x) {
2.48 + var low = Math.floor(this.toFP() / x.toFP()); // TODO: not exact enough
2.49 + if (low > 0xFFFFFFFF) {
2.50 + var hi = Math.floor(low / 0xFFFFFFFF) | 0;
2.51 + return hi.next32(low % 0xFFFFFFFF);
2.52 }
2.53 - return x;
2.54 + return low;
2.55 };
2.56
2.57 -Long.prototype.toInt32 = function() { return this.low | 0; };
2.58 -Long.prototype.toFP = function() { return this.hi * 0xFFFFFFFF + this.low; };
2.59 -
2.60 -Long.prototype.toString = function() {
2.61 - return String(this.toFP());
2.62 +Number.prototype.shl64 = function(x) {
2.63 + if (x > 32) {
2.64 + var hi = (this << (x - 32)) & 0xFFFFFFFF;
2.65 + return hi.next32(0);
2.66 + } else {
2.67 + var hi = (this.high32() << x) & 0xFFFFFFFF;
2.68 + var low_reminder = this >> x;
2.69 + hi |= low_reminder;
2.70 + var low = this << x;
2.71 + return hi.next32(low);
2.72 + }
2.73 };
2.74
2.75 -Long.prototype.valueOf = function() {
2.76 - return this.toFP();
2.77 -};
2.78 -
2.79 -Long.prototype.compare64 = function(x) {
2.80 +Number.prototype.compare64 = function(x) {
2.81 if (this.hi == x.hi) {
2.82 - return (this.low == x.low) ? 0 : ((this.low < x.low) ? -1 : 1);
2.83 + return (this == x) ? 0 : ((this < x) ? -1 : 1);
2.84 }
2.85 return (this.hi < x.hi) ? -1 : 1;
2.86 };
2.87 -
2.88 -Long.prototype.add64 = function(x) {
2.89 - low = this.low + x.low;
2.90 - carry = 0;
2.91 - if (low > 0xFFFFFFFF) {
2.92 - carry = 1;
2.93 - low -= 0xFFFFFFFF;
2.94 - }
2.95 - hi = (this.hi + x.hi + carry) & 0xFFFFFFFF;
2.96 - return new Long(low, hi);
2.97 -};
2.98 -
2.99 -Long.prototype.div64 = function(x) {
2.100 - return LongFromNumber(Math.floor(this.toFP() / x.toFP()));
2.101 -};
2.102 -
2.103 -Long.prototype.shl64 = function(x) {
2.104 - if (x > 32) {
2.105 - hi = (this.low << (x - 32)) & 0xFFFFFFFF;
2.106 - low = 0;
2.107 - } else {
2.108 - hi = (this.hi << x) & 0xFFFFFFFF;
2.109 - low_reminder = this.low >> x;
2.110 - hi |= low_reminder;
2.111 - low = this.low << x;
2.112 - }
2.113 - return new Long(low, hi);
2.114 -};
3.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jan 27 10:19:02 2013 +0100
3.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 28 00:15:38 2013 +0100
3.3 @@ -313,7 +313,7 @@
3.4 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(0));
3.5 break;
3.6 case opc_lload_0:
3.7 - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(0));
3.8 + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(0));
3.9 break;
3.10 case opc_fload_0:
3.11 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(0));
3.12 @@ -328,7 +328,7 @@
3.13 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(1));
3.14 break;
3.15 case opc_lload_1:
3.16 - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(1));
3.17 + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(1));
3.18 break;
3.19 case opc_fload_1:
3.20 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(1));
3.21 @@ -343,7 +343,7 @@
3.22 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(2));
3.23 break;
3.24 case opc_lload_2:
3.25 - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(2));
3.26 + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(2));
3.27 break;
3.28 case opc_fload_2:
3.29 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(2));
3.30 @@ -358,7 +358,7 @@
3.31 emit(out, "var @1 = @2;", smapper.pushI(), lmapper.getI(3));
3.32 break;
3.33 case opc_lload_3:
3.34 - emit(out, "var @1 = MakeLong(@2);", smapper.pushL(), lmapper.getL(3));
3.35 + emit(out, "var @1 = @2;", smapper.pushL(), lmapper.getL(3));
3.36 break;
3.37 case opc_fload_3:
3.38 emit(out, "var @1 = @2;", smapper.pushF(), lmapper.getF(3));
3.39 @@ -662,7 +662,7 @@
3.40 emit(out, "return @1;", smapper.popA());
3.41 break;
3.42 case opc_i2l:
3.43 - emit(out, "var @2 = new Long(@1, 0);", smapper.popI(), smapper.pushL());
3.44 + emit(out, "var @2 = @1", smapper.popI(), smapper.pushL());
3.45 break;
3.46 case opc_i2f:
3.47 emit(out, "var @2 = @1;", smapper.popI(), smapper.pushF());
3.48 @@ -691,7 +691,7 @@
3.49 smapper.popF(), smapper.pushI());
3.50 break;
3.51 case opc_f2l:
3.52 - emit(out, "var @2 = LongFromNumber(Math.floor(@1));",
3.53 + emit(out, "var @2 = Math.floor(@1).toLong();",
3.54 smapper.popF(), smapper.pushL());
3.55 break;
3.56 case opc_d2i:
3.57 @@ -699,7 +699,7 @@
3.58 smapper.popD(), smapper.pushI());
3.59 break;
3.60 case opc_d2l:
3.61 - emit(out, "var @2 = LongFromNumber(Math.floor(@1));",
3.62 + emit(out, "var @2 = Math.floor(@1).toLong();",
3.63 smapper.popD(), smapper.pushL());
3.64 break;
3.65 case opc_i2b:
3.66 @@ -724,7 +724,7 @@
3.67 emit(out, "var @1 = 0;", smapper.pushD());
3.68 break;
3.69 case opc_lconst_0:
3.70 - emit(out, "var @1 = new Long(0,0);", smapper.pushL());
3.71 + emit(out, "var @1 = 0;", smapper.pushL());
3.72 break;
3.73 case opc_fconst_0:
3.74 emit(out, "var @1 = 0;", smapper.pushF());
3.75 @@ -733,7 +733,7 @@
3.76 emit(out, "var @1 = 1;", smapper.pushI());
3.77 break;
3.78 case opc_lconst_1:
3.79 - emit(out, "var @1 = new Long(1,0);", smapper.pushL());
3.80 + emit(out, "var @1 = 1;", smapper.pushL());
3.81 break;
3.82 case opc_fconst_1:
3.83 emit(out, "var @1 = 1;", smapper.pushF());
3.84 @@ -773,7 +773,7 @@
3.85 final Long lv = new Long(v);
3.86 final int low = (int)(lv.longValue() & 0xFFFFFFFF);
3.87 final int hi = (int)(lv.longValue() >> 32);
3.88 - emit(out, "var @1 = new Long(0x@2, 0x@3);", smapper.pushL(),
3.89 + emit(out, "var @1 = 0x@3.next32(0x@2);", smapper.pushL(),
3.90 Integer.toHexString(low), Integer.toHexString(hi));
3.91 } else {
3.92 emit(out, "var @1 = @2;", smapper.pushT(type), v);
4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Sun Jan 27 10:19:02 2013 +0100
4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java Mon Jan 28 00:15:38 2013 +0100
4.3 @@ -51,7 +51,7 @@
4.4
4.5 ScriptEngine[] arr = { null };
4.6 code = StaticMethodTest.compileClass(sb, arr,
4.7 - "org/apidesign/vm4brwsr/VM"
4.8 + new String[]{"org/apidesign/vm4brwsr/VM", "org/apidesign/vm4brwsr/StaticMethod"}
4.9 );
4.10 arr[0].getContext().setAttribute("loader", new BytesLoader(), ScriptContext.ENGINE_SCOPE);
4.11 codeSeq = sb;