# HG changeset patch # User Jaroslav Tulach # Date 1350381356 -7200 # Node ID 1376481f15e7e856a84e3b54137e918627393155 # Parent e8438996d406eab0054ea64af0612fa6585e989b Concatenation of strings works diff -r e8438996d406 -r 1376481f15e7 emul/src/main/java/java/lang/AbstractStringBuilder.java --- a/emul/src/main/java/java/lang/AbstractStringBuilder.java Thu Oct 11 10:43:17 2012 -0700 +++ b/emul/src/main/java/java/lang/AbstractStringBuilder.java Tue Oct 16 11:55:56 2012 +0200 @@ -126,7 +126,7 @@ throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } - value = String.copyOf(value, newCapacity); + value = copyOf(value, newCapacity); } /** @@ -138,7 +138,7 @@ */ public void trimToSize() { if (count < value.length) { - value = String.copyOf(value, count); + value = copyOf(value, count); } } @@ -352,7 +352,7 @@ throw new StringIndexOutOfBoundsException(srcEnd); if (srcBegin > srcEnd) throw new StringIndexOutOfBoundsException("srcBegin > srcEnd"); - String.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin); + arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin); } /** @@ -502,7 +502,7 @@ public AbstractStringBuilder append(char[] str) { int len = str.length; ensureCapacityInternal(count + len); - String.arraycopy(str, 0, value, count, len); + arraycopy(str, 0, value, count, len); count += len; return this; } @@ -532,7 +532,7 @@ public AbstractStringBuilder append(char str[], int offset, int len) { if (len > 0) // let arraycopy report AIOOBE for len < 0 ensureCapacityInternal(count + len); - String.arraycopy(str, offset, value, count, len); + arraycopy(str, offset, value, count, len); count += len; return this; } @@ -699,7 +699,7 @@ throw new StringIndexOutOfBoundsException(); int len = end - start; if (len > 0) { - String.arraycopy(value, start+len, value, start, count-end); + arraycopy(value, start+len, value, start, count-end); count -= len; } return this; @@ -761,7 +761,7 @@ public AbstractStringBuilder deleteCharAt(int index) { if ((index < 0) || (index >= count)) throw new StringIndexOutOfBoundsException(index); - String.arraycopy(value, index+1, value, index, count-index-1); + arraycopy(value, index+1, value, index, count-index-1); count--; return this; } @@ -799,7 +799,7 @@ int newCount = count + len - (end - start); ensureCapacityInternal(newCount); - String.arraycopy(value, end, value, start + len, count - end); + arraycopy(value, end, value, start + len, count - end); str.getChars(value, start); count = newCount; return this; @@ -905,8 +905,8 @@ "offset " + offset + ", len " + len + ", str.length " + str.length); ensureCapacityInternal(count + len); - String.arraycopy(value, index, value, index + len, count - index); - String.arraycopy(str, offset, value, index, len); + arraycopy(value, index, value, index + len, count - index); + arraycopy(str, offset, value, index, len); count += len; return this; } @@ -972,7 +972,7 @@ str = "null"; int len = str.length(); ensureCapacityInternal(count + len); - String.arraycopy(value, offset, value, offset + len, count - offset); + arraycopy(value, offset, value, offset + len, count - offset); str.getChars(value, offset); count += len; return this; @@ -1007,8 +1007,8 @@ throw new StringIndexOutOfBoundsException(offset); int len = str.length; ensureCapacityInternal(count + len); - String.arraycopy(value, offset, value, offset + len, count - offset); - String.arraycopy(str, 0, value, offset, len); + arraycopy(value, offset, value, offset + len, count - offset); + arraycopy(str, 0, value, offset, len); count += len; return this; } @@ -1098,7 +1098,7 @@ + s.length()); int len = end - start; ensureCapacityInternal(count + len); - String.arraycopy(value, dstOffset, value, dstOffset + len, + arraycopy(value, dstOffset, value, dstOffset + len, count - dstOffset); for (int i=start; i " + to); + } + char[] copy = new char[newLength]; + arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); + return copy; + } + + static void arraycopy(char[] value, int srcBegin, char[] dst, int dstBegin, int count) { + while (count-- > 0) { + dst[dstBegin++] = value[srcBegin++]; + } + } + + // access system property + static String getProperty(String nm) { + return null; + } + + static char[] copyOf(char[] original, int newLength) { + char[] copy = new char[newLength]; + arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); + return copy; + } + } diff -r e8438996d406 -r 1376481f15e7 emul/src/main/java/java/lang/Boolean.java --- a/emul/src/main/java/java/lang/Boolean.java Thu Oct 11 10:43:17 2012 -0700 +++ b/emul/src/main/java/java/lang/Boolean.java Tue Oct 16 11:55:56 2012 +0200 @@ -235,7 +235,7 @@ public static boolean getBoolean(String name) { boolean result = false; try { - result = toBoolean(String.getProperty(name)); + result = toBoolean(AbstractStringBuilder.getProperty(name)); } catch (IllegalArgumentException e) { } catch (NullPointerException e) { } diff -r e8438996d406 -r 1376481f15e7 emul/src/main/java/java/lang/Integer.java --- a/emul/src/main/java/java/lang/Integer.java Thu Oct 11 10:43:17 2012 -0700 +++ b/emul/src/main/java/java/lang/Integer.java Tue Oct 16 11:55:56 2012 +0200 @@ -600,7 +600,7 @@ // high value may be configured by property int h = 127; String integerCacheHighPropValue = - String.getProperty("java.lang.Integer.IntegerCache.high"); + AbstractStringBuilder.getProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); @@ -882,7 +882,7 @@ public static Integer getInteger(String nm, Integer val) { String v = null; try { - v = String.getProperty(nm); + v = AbstractStringBuilder.getProperty(nm); } catch (IllegalArgumentException e) { } catch (NullPointerException e) { } diff -r e8438996d406 -r 1376481f15e7 emul/src/main/java/java/lang/Long.java --- a/emul/src/main/java/java/lang/Long.java Thu Oct 11 10:43:17 2012 -0700 +++ b/emul/src/main/java/java/lang/Long.java Tue Oct 16 11:55:56 2012 +0200 @@ -923,7 +923,7 @@ public static Long getLong(String nm, Long val) { String v = null; try { - v = String.getProperty(nm); + v = AbstractStringBuilder.getProperty(nm); } catch (IllegalArgumentException e) { } catch (NullPointerException e) { } diff -r e8438996d406 -r 1376481f15e7 emul/src/main/java/java/lang/Math.java --- a/emul/src/main/java/java/lang/Math.java Thu Oct 11 10:43:17 2012 -0700 +++ b/emul/src/main/java/java/lang/Math.java Tue Oct 16 11:55:56 2012 +0200 @@ -25,6 +25,8 @@ package java.lang; +import org.apidesign.bck2brwsr.core.JavaScriptBody; + /** * The class {@code Math} contains methods for performing basic @@ -813,9 +815,6 @@ return (a >= b) ? a : b; } - private static long negativeZeroFloatBits = Float.floatToIntBits(-0.0f); - private static long negativeZeroDoubleBits = Double.doubleToLongBits(-0.0d); - /** * Returns the greater of two {@code float} values. That is, * the result is the argument closer to positive infinity. If the @@ -830,13 +829,11 @@ * @param b another argument. * @return the larger of {@code a} and {@code b}. */ + @JavaScriptBody(args={"a", "b"}, + body="return Math.max(a,b);" + ) public static float max(float a, float b) { - if (a != a) return a; // a is NaN - if ((a == 0.0f) && (b == 0.0f) - && (Float.floatToIntBits(a) == negativeZeroFloatBits)) { - return b; - } - return (a >= b) ? a : b; + throw new UnsupportedOperationException(); } /** @@ -853,13 +850,11 @@ * @param b another argument. * @return the larger of {@code a} and {@code b}. */ + @JavaScriptBody(args={"a", "b"}, + body="return Math.max(a,b);" + ) public static double max(double a, double b) { - if (a != a) return a; // a is NaN - if ((a == 0.0d) && (b == 0.0d) - && (Double.doubleToLongBits(a) == negativeZeroDoubleBits)) { - return b; - } - return (a >= b) ? a : b; + throw new UnsupportedOperationException(); } /** @@ -904,13 +899,11 @@ * @param b another argument. * @return the smaller of {@code a} and {@code b}. */ + @JavaScriptBody(args={"a", "b"}, + body="return Math.min(a,b);" + ) public static float min(float a, float b) { - if (a != a) return a; // a is NaN - if ((a == 0.0f) && (b == 0.0f) - && (Float.floatToIntBits(b) == negativeZeroFloatBits)) { - return b; - } - return (a <= b) ? a : b; + throw new UnsupportedOperationException(); } /** @@ -927,13 +920,11 @@ * @param b another argument. * @return the smaller of {@code a} and {@code b}. */ + @JavaScriptBody(args={"a", "b"}, + body="return Math.min(a,b);" + ) public static double min(double a, double b) { - if (a != a) return a; // a is NaN - if ((a == 0.0d) && (b == 0.0d) - && (Double.doubleToLongBits(b) == negativeZeroDoubleBits)) { - return b; - } - return (a <= b) ? a : b; + throw new UnsupportedOperationException(); } /** diff -r e8438996d406 -r 1376481f15e7 emul/src/main/java/java/lang/String.java --- a/emul/src/main/java/java/lang/String.java Thu Oct 11 10:43:17 2012 -0700 +++ b/emul/src/main/java/java/lang/String.java Tue Oct 16 11:55:56 2012 +0200 @@ -164,7 +164,7 @@ // String itself. Perhaps this constructor is being called // in order to trim the baggage, so make a copy of the array. int off = original.offset; - v = copyOfRange(originalValue, off, off+size); + v = AbstractStringBuilder.copyOfRange(originalValue, off, off+size); } else { // The array representing the String is the same // size as the String, so no point in making a copy. @@ -188,7 +188,7 @@ int size = value.length; this.offset = 0; this.count = size; - this.value = copyOf(value, size); + this.value = AbstractStringBuilder.copyOf(value, size); } /** @@ -225,7 +225,7 @@ } this.offset = 0; this.count = count; - this.value = copyOfRange(value, offset, offset+count); + this.value = AbstractStringBuilder.copyOfRange(value, offset, offset+count); } /** @@ -818,7 +818,7 @@ * This method doesn't perform any range checking. */ void getChars(char dst[], int dstBegin) { - arraycopy(value, offset, dst, dstBegin, count); + AbstractStringBuilder.arraycopy(value, offset, dst, dstBegin, count); } /** @@ -861,7 +861,7 @@ if (srcBegin > srcEnd) { throw new StringIndexOutOfBoundsException(srcEnd - srcBegin); } - arraycopy(value, offset + srcBegin, dst, dstBegin, + AbstractStringBuilder.arraycopy(value, offset + srcBegin, dst, dstBegin, srcEnd - srcBegin); } @@ -3034,32 +3034,4 @@ * guaranteed to be from a pool of unique strings. */ public native String intern(); - - static char[] copyOfRange(char[] original, int from, int to) { - int newLength = to - from; - if (newLength < 0) { - throw new IllegalArgumentException(from + " > " + to); - } - char[] copy = new char[newLength]; - arraycopy(original, from, copy, 0, - Math.min(original.length - from, newLength)); - return copy; - } - static char[] copyOf(char[] original, int newLength) { - char[] copy = new char[newLength]; - arraycopy(original, 0, copy, 0, - Math.min(original.length, newLength)); - return copy; - } - static void arraycopy( - char[] value, int srcBegin, char[] dst, int dstBegin, int count - ) { - while (count-- > 0) { - dst[dstBegin++] = value[srcBegin++]; - } - } - // access system property - static String getProperty(String nm) { - return null; - } } diff -r e8438996d406 -r 1376481f15e7 htmlpage/src/test/java/org/apidesign/bck2brwsr/htmlpage/PageController.java --- a/htmlpage/src/test/java/org/apidesign/bck2brwsr/htmlpage/PageController.java Thu Oct 11 10:43:17 2012 -0700 +++ b/htmlpage/src/test/java/org/apidesign/bck2brwsr/htmlpage/PageController.java Tue Oct 16 11:55:56 2012 +0200 @@ -27,6 +27,6 @@ public class PageController { @OnClick(id="pg.button") static void updateTitle() { - TestPage.PG_TITLE.setText(TestPage.PG_TEXT.getValue()); + TestPage.PG_TITLE.setText("You want this window to be named " + TestPage.PG_TEXT.getValue()); } } diff -r e8438996d406 -r 1376481f15e7 htmlpage/src/test/java/org/apidesign/bck2brwsr/htmlpage/ProcessPageTest.java --- a/htmlpage/src/test/java/org/apidesign/bck2brwsr/htmlpage/ProcessPageTest.java Thu Oct 11 10:43:17 2012 -0700 +++ b/htmlpage/src/test/java/org/apidesign/bck2brwsr/htmlpage/ProcessPageTest.java Tue Oct 16 11:55:56 2012 +0200 @@ -79,7 +79,7 @@ } catch (NoSuchMethodException ex) { fail("Cannot find method in " + sb, ex); } - assertEquals(ret, "something", "We expect that the JavaCode performs all the wiring"); + assertEquals(ret, "You want this window to be named something", "We expect that the JavaCode performs all the wiring"); } static Invocable compileClass(StringBuilder sb, String... names) throws ScriptException, IOException { diff -r e8438996d406 -r 1376481f15e7 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Thu Oct 11 10:43:17 2012 -0700 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Oct 16 11:55:56 2012 +0200 @@ -370,7 +370,7 @@ break; case bc_iinc: { final int varIndx = (byteCodes[++i] + 256) % 256; - final int incrBy = (byteCodes[++i] + 256) % 256; + final int incrBy = byteCodes[++i]; if (incrBy == 1) { out.append("arg" + varIndx).append("++;"); } else { @@ -465,6 +465,12 @@ out.append("{ var delta = stack.pop() - stack.pop(); stack.push(delta < 0 ?-1 : (delta == 0 ? 0 : 1)); }"); break; } + case bc_if_acmpeq: + i = generateIf(byteCodes, i, "==="); + break; + case bc_if_acmpne: + i = generateIf(byteCodes, i, "!="); + break; case bc_if_icmpeq: { i = generateIf(byteCodes, i, "=="); break; @@ -676,6 +682,13 @@ i += 2; break; } + case bc_athrow: { + out.append("{ var t = stack.pop(); stack = new Array(1); stack[0] = t; throw t; }"); + break; + } + default: { + out.append("throw 'unknown bytecode " + c + "';"); + } } out.append(" //"); diff -r e8438996d406 -r 1376481f15e7 vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Thu Oct 11 10:43:17 2012 -0700 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/GenJS.java Tue Oct 16 11:55:56 2012 +0200 @@ -58,8 +58,11 @@ if (name.startsWith("java/") && !name.equals("java/lang/Object") && !name.equals("java/lang/Class") + && !name.equals("java/lang/Math") && !name.equals("java/lang/Number") && !name.equals("java/lang/Integer") + && !name.equals("java/lang/Float") + && !name.equals("java/lang/Double") && !name.equals("java/lang/Throwable") && !name.equals("java/lang/Exception") && !name.equals("java/lang/RuntimeException") @@ -116,7 +119,6 @@ } } } - } private static void readResource(InputStream emul, Appendable out) throws IOException { try { diff -r e8438996d406 -r 1376481f15e7 vm/src/test/java/org/apidesign/vm4brwsr/Array.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Array.java Thu Oct 11 10:43:17 2012 -0700 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Array.java Tue Oct 16 11:55:56 2012 +0200 @@ -80,4 +80,16 @@ } return sum; } + + static void arraycopy(char[] value, int srcBegin, char[] dst, int dstBegin, int count) { + while (count-- > 0) { + dst[dstBegin++] = value[srcBegin++]; + } + } + + public static char copyArray() { + char[] arr = { '0' }; + arraycopy(arr()[0].chars, 0, arr, 0, 1); + return arr[0]; + } } diff -r e8438996d406 -r 1376481f15e7 vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java Thu Oct 11 10:43:17 2012 -0700 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java Tue Oct 16 11:55:56 2012 +0200 @@ -39,6 +39,10 @@ ); } + @Test public void doesCopyArrayWork() throws Exception { + assertExec("Returns 'a'", "org_apidesign_vm4brwsr_Array_copyArrayC", Double.valueOf('a')); + } + private static CharSequence codeSeq; private static Invocable code; diff -r e8438996d406 -r 1376481f15e7 vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java Thu Oct 11 10:43:17 2012 -0700 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java Tue Oct 16 11:55:56 2012 +0200 @@ -24,12 +24,17 @@ } public static String toStringTest(int howMuch) { + counter = 0; StringSample ss = null; for (int i = 0; i < howMuch; i++) { ss = new StringSample(); } return ss.toString().toString(); } + + public static String concatStrings() { + return (toStringTest(1) + "Ahoj").toString(); + } @Override public String toString() { diff -r e8438996d406 -r 1376481f15e7 vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java Thu Oct 11 10:43:17 2012 -0700 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java Tue Oct 16 11:55:56 2012 +0200 @@ -37,6 +37,15 @@ @Test public void toStringConcatenationJava() throws Exception { assertEquals("Hello World!5", StringSample.toStringTest(5)); } + + @Test(timeOut=10000) public void stringStringConcat() throws Exception { + assertExec( + "Composes strings OK", + "org_apidesign_vm4brwsr_StringSample_concatStringsLjava_lang_String", + "Hello World!1Ahoj" + ); + } + private static CharSequence codeSeq; private static Invocable code;