Merging use of function.call into default branch. It seems to be the way to go.
1.1 --- a/core/src/main/java/org/apidesign/bck2brwsr/core/impl/JavaScriptProcesor.java Sun Jan 13 06:59:05 2013 +0100
1.2 +++ b/core/src/main/java/org/apidesign/bck2brwsr/core/impl/JavaScriptProcesor.java Mon Jan 14 11:52:38 2013 +0100
1.3 @@ -53,7 +53,7 @@
1.4 @Override
1.5 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
1.6 for (Element e : roundEnv.getElementsAnnotatedWith(JavaScriptBody.class)) {
1.7 - if (e.getKind() != ElementKind.METHOD) {
1.8 + if (e.getKind() != ElementKind.METHOD && e.getKind() != ElementKind.CONSTRUCTOR) {
1.9 continue;
1.10 }
1.11 ExecutableElement ee = (ExecutableElement)e;
1.12 @@ -61,13 +61,7 @@
1.13
1.14 JavaScriptBody jsb = e.getAnnotation(JavaScriptBody.class);
1.15 String[] arr = jsb.args();
1.16 - int indx;
1.17 - if (!ee.getModifiers().contains(Modifier.STATIC)) {
1.18 - indx = 1;
1.19 - } else {
1.20 - indx = 0;
1.21 - }
1.22 - if (indx + params.size() != arr.length) {
1.23 + if (params.size() != arr.length) {
1.24 processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Number of args arguments does not match real arguments!", e);
1.25 }
1.26 }
1.27 @@ -81,14 +75,8 @@
1.28 StringBuilder sb = new StringBuilder();
1.29 if (e.getKind() == ElementKind.METHOD && member.getSimpleName().contentEquals("args")) {
1.30 ExecutableElement ee = (ExecutableElement) e;
1.31 - String sep;
1.32 - if (!ee.getModifiers().contains(Modifier.STATIC)) {
1.33 - sb.append("{ \"self\"");
1.34 - sep = ", ";
1.35 - } else {
1.36 - sb.append("{ ");
1.37 - sep = "";
1.38 - }
1.39 + String sep = "";
1.40 + sb.append("{ ");
1.41 for (VariableElement ve : ee.getParameters()) {
1.42 sb.append(sep).append('"').append(ve.getSimpleName())
1.43 .append('"');
2.1 --- a/emul/src/main/java/java/lang/Class.java Sun Jan 13 06:59:05 2013 +0100
2.2 +++ b/emul/src/main/java/java/lang/Class.java Mon Jan 14 11:52:38 2013 +0100
2.3 @@ -216,7 +216,7 @@
2.4 + "\nif (c['cons__V']) {"
2.5 + "\n if ((c.cons__V.access & 0x1) != 0) {"
2.6 + "\n var inst = c();"
2.7 - + "\n c.cons__V(inst);"
2.8 + + "\n c.cons__V.call(inst);"
2.9 + "\n return inst;"
2.10 + "\n }"
2.11 + "\n return illegal;"
2.12 @@ -318,7 +318,7 @@
2.13 return (getAccess() & 0x200) != 0;
2.14 }
2.15
2.16 - @JavaScriptBody(args = "self", body = "return self.access;")
2.17 + @JavaScriptBody(args = {}, body = "return this.access;")
2.18 private native int getAccess();
2.19
2.20
2.21 @@ -362,8 +362,8 @@
2.22 * @see java.lang.Void#TYPE
2.23 * @since JDK1.1
2.24 */
2.25 - @JavaScriptBody(args = "self", body =
2.26 - "if (self.primitive) return true;"
2.27 + @JavaScriptBody(args = {}, body =
2.28 + "if (this.primitive) return true;"
2.29 + "else return false;"
2.30 )
2.31 public native boolean isPrimitive();
2.32 @@ -447,7 +447,7 @@
2.33 return jvmName().replace('/', '.');
2.34 }
2.35
2.36 - @JavaScriptBody(args = "self", body = "return self.jvmName;")
2.37 + @JavaScriptBody(args = {}, body = "return this.jvmName;")
2.38 private native String jvmName();
2.39
2.40
2.41 @@ -481,7 +481,7 @@
2.42 *
2.43 * @return the superclass of the class represented by this object.
2.44 */
2.45 - @JavaScriptBody(args = "self", body = "return self.superclass;")
2.46 + @JavaScriptBody(args = {}, body = "return this.superclass;")
2.47 public native Class<? super T> getSuperclass();
2.48
2.49 /**
2.50 @@ -1078,10 +1078,10 @@
2.51 throw new ClassCastException(this.toString());
2.52 }
2.53
2.54 - @JavaScriptBody(args = { "self", "ac" },
2.55 + @JavaScriptBody(args = { "ac" },
2.56 body =
2.57 - "if (self.anno) {"
2.58 - + " return self.anno['L' + ac.jvmName + ';'];"
2.59 + "if (this.anno) {"
2.60 + + " return this.anno['L' + ac.jvmName + ';'];"
2.61 + "} else return null;"
2.62 )
2.63 private Object getAnnotationData(Class<?> annotationClass) {
2.64 @@ -1100,8 +1100,8 @@
2.65 * @throws NullPointerException {@inheritDoc}
2.66 * @since 1.5
2.67 */
2.68 - @JavaScriptBody(args = { "self", "ac" },
2.69 - body = "if (self.anno && self.anno['L' + ac.jvmName + ';']) { return true; }"
2.70 + @JavaScriptBody(args = { "ac" },
2.71 + body = "if (this.anno && this.anno['L' + ac.jvmName + ';']) { return true; }"
2.72 + "else return false;"
2.73 )
2.74 public boolean isAnnotationPresent(
2.75 @@ -1112,7 +1112,7 @@
2.76 return getAnnotation(annotationClass) != null;
2.77 }
2.78
2.79 - @JavaScriptBody(args = "self", body = "return self.anno;")
2.80 + @JavaScriptBody(args = {}, body = "return this.anno;")
2.81 private Object getAnnotationData() {
2.82 throw new UnsupportedOperationException();
2.83 }
3.1 --- a/emul/src/main/java/java/lang/Object.java Sun Jan 13 06:59:05 2013 +0100
3.2 +++ b/emul/src/main/java/java/lang/Object.java Mon Jan 14 11:52:38 2013 +0100
3.3 @@ -66,7 +66,7 @@
3.4 * @see Class Literals, section 15.8.2 of
3.5 * <cite>The Java™ Language Specification</cite>.
3.6 */
3.7 - @JavaScriptBody(args="self", body="return self.constructor.$class;")
3.8 + @JavaScriptBody(args={}, body="return this.constructor.$class;")
3.9 public final native Class<?> getClass();
3.10
3.11 /**
3.12 @@ -104,14 +104,14 @@
3.13 * @see java.lang.Object#equals(java.lang.Object)
3.14 * @see java.lang.System#identityHashCode
3.15 */
3.16 - @JavaScriptBody(args = "self", body =
3.17 - "if (self.$hashCode) return self.$hashCode;\n"
3.18 - + "var h = self.computeHashCode__I(self);\n"
3.19 - + "return self.$hashCode = h & h;"
3.20 + @JavaScriptBody(args = {}, body =
3.21 + "if (this.$hashCode) return this.$hashCode;\n"
3.22 + + "var h = this.computeHashCode__I();\n"
3.23 + + "return this.$hashCode = h & h;"
3.24 )
3.25 public native int hashCode();
3.26
3.27 - @JavaScriptBody(args = "self", body = "Math.random() * Math.pow(2, 32);")
3.28 + @JavaScriptBody(args = {}, body = "Math.random() * Math.pow(2, 32);")
3.29 native int computeHashCode();
3.30
3.31 /**
4.1 --- a/emul/src/main/java/java/lang/String.java Sun Jan 13 06:59:05 2013 +0100
4.2 +++ b/emul/src/main/java/java/lang/String.java Mon Jan 14 11:52:38 2013 +0100
4.3 @@ -169,11 +169,11 @@
4.4 * @param value
4.5 * The initial value of the string
4.6 */
4.7 - @JavaScriptBody(args = { "self", "charArr" }, body=
4.8 + @JavaScriptBody(args = { "charArr" }, body=
4.9 "for (var i = 0; i < charArr.length; i++) {\n"
4.10 + " if (typeof charArr[i] === 'number') charArr[i] = String.fromCharCode(charArr[i]);\n"
4.11 + "}\n"
4.12 - + "self.fld_r = charArr.join('');\n"
4.13 + + "this.fld_r = charArr.join('');\n"
4.14 )
4.15 public String(char value[]) {
4.16 }
4.17 @@ -199,12 +199,12 @@
4.18 * If the {@code offset} and {@code count} arguments index
4.19 * characters outside the bounds of the {@code value} array
4.20 */
4.21 - @JavaScriptBody(args = { "self", "charArr", "off", "cnt" }, body =
4.22 + @JavaScriptBody(args = { "charArr", "off", "cnt" }, body =
4.23 "var up = off + cnt;\n" +
4.24 "for (var i = off; i < up; i++) {\n" +
4.25 " if (typeof charArr[i] === 'number') charArr[i] = String.fromCharCode(charArr[i]);\n" +
4.26 "}\n" +
4.27 - "self.fld_r = charArr.slice(off, up).join(\"\");\n"
4.28 + "this.fld_r = charArr.slice(off, up).join(\"\");\n"
4.29 )
4.30 public String(char value[], int offset, int count) {
4.31 }
4.32 @@ -618,7 +618,7 @@
4.33 * @return the length of the sequence of characters represented by this
4.34 * object.
4.35 */
4.36 - @JavaScriptBody(args = "self", body = "return self.toString().length;")
4.37 + @JavaScriptBody(args = {}, body = "return this.toString().length;")
4.38 public int length() {
4.39 throw new UnsupportedOperationException();
4.40 }
4.41 @@ -631,7 +631,7 @@
4.42 *
4.43 * @since 1.6
4.44 */
4.45 - @JavaScriptBody(args = "self", body="return self.toString().length === 0;")
4.46 + @JavaScriptBody(args = {}, body="return this.toString().length === 0;")
4.47 public boolean isEmpty() {
4.48 return length() == 0;
4.49 }
4.50 @@ -654,8 +654,8 @@
4.51 * argument is negative or not less than the length of this
4.52 * string.
4.53 */
4.54 - @JavaScriptBody(args = { "self", "index" },
4.55 - body = "return self.toString().charCodeAt(index);"
4.56 + @JavaScriptBody(args = { "index" },
4.57 + body = "return this.toString().charCodeAt(index);"
4.58 )
4.59 public char charAt(int index) {
4.60 throw new UnsupportedOperationException();
4.61 @@ -780,8 +780,8 @@
4.62 * Copy characters from this string into dst starting at dstBegin.
4.63 * This method doesn't perform any range checking.
4.64 */
4.65 - @JavaScriptBody(args = { "self", "arr", "to" }, body =
4.66 - "var s = self.toString();\n" +
4.67 + @JavaScriptBody(args = { "arr", "to" }, body =
4.68 + "var s = this.toString();\n" +
4.69 "for (var i = 0; i < s.length; i++) {\n" +
4.70 " arr[to++] = s[i];\n" +
4.71 "}"
4.72 @@ -820,8 +820,8 @@
4.73 * <li><code>dstBegin+(srcEnd-srcBegin)</code> is larger than
4.74 * <code>dst.length</code></ul>
4.75 */
4.76 - @JavaScriptBody(args = { "self", "beg", "end", "arr", "dst" }, body=
4.77 - "var s = self.toString();\n" +
4.78 + @JavaScriptBody(args = { "beg", "end", "arr", "dst" }, body=
4.79 + "var s = this.toString();\n" +
4.80 "while (beg < end) {\n" +
4.81 " arr[dst++] = s[beg++];\n" +
4.82 "}\n"
4.83 @@ -993,9 +993,9 @@
4.84 * @see #compareTo(String)
4.85 * @see #equalsIgnoreCase(String)
4.86 */
4.87 - @JavaScriptBody(args = { "self", "obj" }, body =
4.88 + @JavaScriptBody(args = { "obj" }, body =
4.89 "return obj.$instOf_java_lang_String && "
4.90 - + "self.toString() === obj.toString();"
4.91 + + "this.toString() === obj.toString();"
4.92 )
4.93 public boolean equals(Object anObject) {
4.94 if (this == anObject) {
4.95 @@ -1420,9 +1420,9 @@
4.96 * this.substring(toffset).startsWith(prefix)
4.97 * </pre>
4.98 */
4.99 - @JavaScriptBody(args = { "self", "find", "from" }, body=
4.100 + @JavaScriptBody(args = { "find", "from" }, body=
4.101 "find = find.toString();\n" +
4.102 - "return self.toString().substring(from, from + find.length) === find;\n"
4.103 + "return this.toString().substring(from, from + find.length) === find;\n"
4.104 )
4.105 public boolean startsWith(String prefix, int toffset) {
4.106 char ta[] = toCharArray();
4.107 @@ -1570,9 +1570,9 @@
4.108 * than or equal to <code>fromIndex</code>, or <code>-1</code>
4.109 * if the character does not occur.
4.110 */
4.111 - @JavaScriptBody(args = { "self", "ch", "from" }, body =
4.112 + @JavaScriptBody(args = { "ch", "from" }, body =
4.113 "if (typeof ch === 'number') ch = String.fromCharCode(ch);\n" +
4.114 - "return self.toString().indexOf(ch, from);\n"
4.115 + "return this.toString().indexOf(ch, from);\n"
4.116 )
4.117 public int indexOf(int ch, int fromIndex) {
4.118 if (fromIndex < 0) {
4.119 @@ -1679,9 +1679,9 @@
4.120 * than or equal to <code>fromIndex</code>, or <code>-1</code>
4.121 * if the character does not occur before that point.
4.122 */
4.123 - @JavaScriptBody(args = { "self", "ch", "from" }, body =
4.124 + @JavaScriptBody(args = { "ch", "from" }, body =
4.125 "if (typeof ch === 'number') ch = String.fromCharCode(ch);\n" +
4.126 - "return self.toString().lastIndexOf(ch, from);"
4.127 + "return this.toString().lastIndexOf(ch, from);"
4.128 )
4.129 public int lastIndexOf(int ch, int fromIndex) {
4.130 if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
4.131 @@ -1754,8 +1754,8 @@
4.132 * starting at the specified index,
4.133 * or {@code -1} if there is no such occurrence.
4.134 */
4.135 - @JavaScriptBody(args = { "self", "str", "fromIndex" }, body =
4.136 - "return self.toString().indexOf(str.toString(), fromIndex);"
4.137 + @JavaScriptBody(args = { "str", "fromIndex" }, body =
4.138 + "return this.toString().indexOf(str.toString(), fromIndex);"
4.139 )
4.140 public native int indexOf(String str, int fromIndex);
4.141
4.142 @@ -1794,8 +1794,8 @@
4.143 * searching backward from the specified index,
4.144 * or {@code -1} if there is no such occurrence.
4.145 */
4.146 - @JavaScriptBody(args = { "self", "s", "from" }, body =
4.147 - "return self.toString().lastIndexOf(s.toString(), from);"
4.148 + @JavaScriptBody(args = { "s", "from" }, body =
4.149 + "return this.toString().lastIndexOf(s.toString(), from);"
4.150 )
4.151 public int lastIndexOf(String str, int fromIndex) {
4.152 return lastIndexOf(toCharArray(), offset(), length(), str.toCharArray(), str.offset(), str.length(), fromIndex);
4.153 @@ -1903,8 +1903,8 @@
4.154 * <code>beginIndex</code> is larger than
4.155 * <code>endIndex</code>.
4.156 */
4.157 - @JavaScriptBody(args = { "self", "beginIndex", "endIndex" }, body =
4.158 - "return self.toString().substring(beginIndex, endIndex);"
4.159 + @JavaScriptBody(args = { "beginIndex", "endIndex" }, body =
4.160 + "return this.toString().substring(beginIndex, endIndex);"
4.161 )
4.162 public String substring(int beginIndex, int endIndex) {
4.163 if (beginIndex < 0) {
4.164 @@ -2012,10 +2012,10 @@
4.165 * @return a string derived from this string by replacing every
4.166 * occurrence of <code>oldChar</code> with <code>newChar</code>.
4.167 */
4.168 - @JavaScriptBody(args = { "self", "arg1", "arg2" }, body =
4.169 + @JavaScriptBody(args = { "arg1", "arg2" }, body =
4.170 "if (typeof arg1 === 'number') arg1 = String.fromCharCode(arg1);\n" +
4.171 "if (typeof arg2 === 'number') arg2 = String.fromCharCode(arg2);\n" +
4.172 - "var s = self.toString();\n" +
4.173 + "var s = this.toString();\n" +
4.174 "for (;;) {\n" +
4.175 " var ret = s.replace(arg1, arg2);\n" +
4.176 " if (ret === s) {\n" +
4.177 @@ -2078,8 +2078,8 @@
4.178 * @since 1.4
4.179 * @spec JSR-51
4.180 */
4.181 - @JavaScriptBody(args = { "self", "regex" }, body =
4.182 - "self = self.toString();\n"
4.183 + @JavaScriptBody(args = { "regex" }, body =
4.184 + "var self = this.toString();\n"
4.185 + "var re = new RegExp(regex.toString());\n"
4.186 + "var r = re.exec(self);\n"
4.187 + "return r != null && r.length > 0 && self.length == r[0].length;"
4.188 @@ -2496,7 +2496,7 @@
4.189 * @return the <code>String</code>, converted to lowercase.
4.190 * @see java.lang.String#toLowerCase(Locale)
4.191 */
4.192 - @JavaScriptBody(args = "self", body = "return self.toLowerCase();")
4.193 + @JavaScriptBody(args = {}, body = "return this.toLowerCase();")
4.194 public String toLowerCase() {
4.195 throw new UnsupportedOperationException("Should be supported but without connection to locale");
4.196 }
4.197 @@ -2662,7 +2662,7 @@
4.198 * @return the <code>String</code>, converted to uppercase.
4.199 * @see java.lang.String#toUpperCase(Locale)
4.200 */
4.201 - @JavaScriptBody(args = "self", body = "return self.toUpperCase();")
4.202 + @JavaScriptBody(args = {}, body = "return this.toUpperCase();")
4.203 public String toUpperCase() {
4.204 throw new UnsupportedOperationException();
4.205 }
4.206 @@ -2718,7 +2718,7 @@
4.207 *
4.208 * @return the string itself.
4.209 */
4.210 - @JavaScriptBody(args = "self", body = "return self.toString();")
4.211 + @JavaScriptBody(args = {}, body = "return this.toString();")
4.212 public String toString() {
4.213 return this;
4.214 }
5.1 --- a/emul/src/main/java/java/lang/Throwable.java Sun Jan 13 06:59:05 2013 +0100
5.2 +++ b/emul/src/main/java/java/lang/Throwable.java Mon Jan 14 11:52:38 2013 +0100
5.3 @@ -783,7 +783,7 @@
5.4 return this;
5.5 }
5.6
5.7 - @JavaScriptBody(args = { "self", "dummy" }, body = "")
5.8 + @JavaScriptBody(args = { "dummy" }, body = "")
5.9 private native Throwable fillInStackTrace(int dummy);
5.10
5.11 /**
6.1 --- a/emul/src/main/java/java/lang/reflect/Method.java Sun Jan 13 06:59:05 2013 +0100
6.2 +++ b/emul/src/main/java/java/lang/reflect/Method.java Mon Jan 14 11:52:38 2013 +0100
6.3 @@ -646,10 +646,10 @@
6.4 return Modifier.isSynthetic(getModifiers());
6.5 }
6.6
6.7 - @JavaScriptBody(args = { "self", "ac" },
6.8 + @JavaScriptBody(args = { "ac" },
6.9 body =
6.10 - "if (self.fld_data.anno) {"
6.11 - + " return self.fld_data.anno['L' + ac.jvmName + ';'];"
6.12 + "if (this.fld_data.anno) {"
6.13 + + " return this.fld_data.anno['L' + ac.jvmName + ';'];"
6.14 + "} else return null;"
6.15 )
6.16 private Object getAnnotationData(Class<?> annotationClass) {
7.1 --- a/javap/src/main/java/org/apidesign/javap/Vector.java Sun Jan 13 06:59:05 2013 +0100
7.2 +++ b/javap/src/main/java/org/apidesign/javap/Vector.java Mon Jan 14 11:52:38 2013 +0100
7.3 @@ -37,8 +37,8 @@
7.4 void add(Object objectType) {
7.5 addElement(objectType);
7.6 }
7.7 - @JavaScriptBody(args = { "self", "obj" }, body =
7.8 - "self.push(obj);"
7.9 + @JavaScriptBody(args = { "obj" }, body =
7.10 + "this.push(obj);"
7.11 )
7.12 void addElement(Object obj) {
7.13 final int s = size();
7.14 @@ -46,16 +46,16 @@
7.15 setElementAt(obj, s);
7.16 }
7.17
7.18 - @JavaScriptBody(args = { "self" }, body =
7.19 - "return self.length;"
7.20 + @JavaScriptBody(args = { }, body =
7.21 + "return this.length;"
7.22 )
7.23 int size() {
7.24 return arr == null ? 0 : arr.length;
7.25 }
7.26
7.27 - @JavaScriptBody(args = { "self", "newArr" }, body =
7.28 - "for (var i = 0; i < self.length; i++) {\n"
7.29 - + " newArr[i] = self[i];\n"
7.30 + @JavaScriptBody(args = { "newArr" }, body =
7.31 + "for (var i = 0; i < this.length; i++) {\n"
7.32 + + " newArr[i] = this[i];\n"
7.33 + "}\n")
7.34 void copyInto(Object[] newArr) {
7.35 if (arr == null) {
7.36 @@ -67,8 +67,8 @@
7.37 }
7.38 }
7.39
7.40 - @JavaScriptBody(args = { "self", "index" }, body =
7.41 - "return self[index];"
7.42 + @JavaScriptBody(args = { "index" }, body =
7.43 + "return this[index];"
7.44 )
7.45 Object elementAt(int index) {
7.46 return arr[index];
7.47 @@ -80,8 +80,8 @@
7.48 arr = newArr;
7.49 }
7.50
7.51 - @JavaScriptBody(args = { "self", "val", "index" }, body =
7.52 - "self[index] = val;"
7.53 + @JavaScriptBody(args = { "val", "index" }, body =
7.54 + "this[index] = val;"
7.55 )
7.56 void setElementAt(Object val, int index) {
7.57 arr[index] = val;
8.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java Sun Jan 13 06:59:05 2013 +0100
8.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java Mon Jan 14 11:52:38 2013 +0100
8.3 @@ -51,9 +51,9 @@
8.4 * @param r the runnable to execute, never null
8.5 */
8.6 @JavaScriptBody(
8.7 - args={ "self", "ev", "r" },
8.8 - body="var e = window.document.getElementById(self.fld_id);\n"
8.9 - + "e[ev.fld_id] = function() { r.run__V(r); };\n"
8.10 + args={ "ev", "r" },
8.11 + body="var e = window.document.getElementById(this.fld_id);\n"
8.12 + + "e[ev.fld_id] = function() { r.run__V(); };\n"
8.13 )
8.14 final native void on(OnEvent ev, Runnable r);
8.15
9.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jan 13 06:59:05 2013 +0100
9.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 14 11:52:38 2013 +0100
9.3 @@ -249,7 +249,7 @@
9.4 new LocalsMapper(stackMapIterator.getArguments());
9.5
9.6 out.append(prefix).append(name).append(" = function(");
9.7 - lmapper.outputArguments(out);
9.8 + lmapper.outputArguments(out, m.isStatic());
9.9 out.append(") {").append("\n");
9.10
9.11 final byte[] byteCodes = m.getCode();
9.12 @@ -275,6 +275,9 @@
9.13 out.append(';');
9.14 }
9.15 }
9.16 + if (!m.isStatic()) {
9.17 + out.append(" var ").append(" lcA0 = this;\n");
9.18 + }
9.19
9.20 // maxStack includes two stack positions for every pushed long / double
9.21 // so this might generate more stack variables than we need
9.22 @@ -1330,7 +1333,11 @@
9.23 out.append("constructor.");
9.24 }
9.25 out.append(mn);
9.26 - out.append('(');
9.27 + if (isStatic) {
9.28 + out.append('(');
9.29 + } else {
9.30 + out.append(".call(");
9.31 + }
9.32 if (numArguments > 0) {
9.33 out.append(vars[0]);
9.34 for (int j = 1; j < numArguments; ++j) {
9.35 @@ -1366,10 +1373,11 @@
9.36 out.append(vars[0]).append('.');
9.37 out.append(mn);
9.38 out.append('(');
9.39 - out.append(vars[0]);
9.40 + String sep = "";
9.41 for (int j = 1; j < numArguments; ++j) {
9.42 - out.append(", ");
9.43 + out.append(sep);
9.44 out.append(vars[j]);
9.45 + sep = ", ";
9.46 }
9.47 out.append(");");
9.48 i += 2;
9.49 @@ -1443,15 +1451,8 @@
9.50 final String mn = findMethodName(m, cnt);
9.51 out.append(prefix).append(mn);
9.52 out.append(" = function(");
9.53 - String space;
9.54 - int index;
9.55 - if (!isStatic) {
9.56 - space = outputArg(out, p.args, 0);
9.57 - index = 1;
9.58 - } else {
9.59 - space = "";
9.60 - index = 0;
9.61 - }
9.62 + String space = "";
9.63 + int index = 0;
9.64 for (int i = 0; i < cnt.length(); i++) {
9.65 out.append(space);
9.66 space = outputArg(out, p.args, index);
9.67 @@ -1600,7 +1601,7 @@
9.68 out.append(" stA0 = e;");
9.69 out.append("} else {");
9.70 out.append(" stA0 = vm.java_lang_Throwable(true);");
9.71 - out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2(stA0, e.toString());");
9.72 + out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2.call(stA0, e.toString());");
9.73 out.append("}");
9.74 out.append("gt=" + e.handler_pc + "; continue;");
9.75 } else {
10.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java Sun Jan 13 06:59:05 2013 +0100
10.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java Mon Jan 14 11:52:38 2013 +0100
10.3 @@ -33,13 +33,14 @@
10.4 localTypeRecords = new TypeArray(initTypeRecords);
10.5 }
10.6
10.7 - public void outputArguments(final Appendable out) throws IOException {
10.8 + public void outputArguments(final Appendable out, boolean isStatic) throws IOException {
10.9 final int argRecordCount = argTypeRecords.getSize();
10.10 - if (argRecordCount > 0) {
10.11 - Variable variable = getVariable(argTypeRecords, 0);
10.12 + int first = isStatic ? 0 : 1;
10.13 + if (argRecordCount > first) {
10.14 + Variable variable = getVariable(argTypeRecords, first);
10.15 out.append(variable);
10.16
10.17 - int i = variable.isCategory2() ? 2 : 1;
10.18 + int i = first + (variable.isCategory2() ? 2 : 1);
10.19 while (i < argRecordCount) {
10.20 variable = getVariable(argTypeRecords, i);
10.21 out.append(", ");
11.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Sun Jan 13 06:59:05 2013 +0100
11.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon Jan 14 11:52:38 2013 +0100
11.3 @@ -117,7 +117,7 @@
11.4 + " var loader = {};\n"
11.5 + " loader.vm = vm;\n"
11.6 + " loader.loadClass = function(name) {\n"
11.7 - + " var attr = name.replace__Ljava_lang_String_2CC(name, '.','_');\n"
11.8 + + " var attr = name.replace__Ljava_lang_String_2CC('.','_');\n"
11.9 + " var fn = vm[attr];\n"
11.10 + " if (fn) return fn(false);\n"
11.11 + " if (!args[0]) throw 'bck2brwsr initialized without loader function, cannot load ' + name;\n"
12.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Sun Jan 13 06:59:05 2013 +0100
12.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Mon Jan 14 11:52:38 2013 +0100
12.3 @@ -112,17 +112,17 @@
12.4 this.lazy = vm;
12.5 }
12.6
12.7 - @JavaScriptBody(args = {"self", "n"},
12.8 + @JavaScriptBody(args = {"n"},
12.9 body =
12.10 - "var cls = n.replace__Ljava_lang_String_2CC(n, '/','_').toString();"
12.11 - + "\nvar dot = n.replace__Ljava_lang_String_2CC(n,'/','.').toString();"
12.12 - + "\nvar lazy = self.fld_lazy;"
12.13 + "var cls = n.replace__Ljava_lang_String_2CC('/','_').toString();"
12.14 + + "\nvar dot = n.replace__Ljava_lang_String_2CC('/','.').toString();"
12.15 + + "\nvar lazy = this.fld_lazy;"
12.16 + "\nvar loader = lazy.fld_loader;"
12.17 + "\nvar vm = loader.vm;"
12.18 + "\nif (vm[cls]) return false;"
12.19 + "\nvm[cls] = function() {"
12.20 + "\n var instance = arguments.length == 0 || arguments[0] === true;"
12.21 - + "\n return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(lazy, dot, instance);"
12.22 + + "\n return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(dot, instance);"
12.23 + "\n};"
12.24 + "\nreturn true;")
12.25 @Override
13.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sun Jan 13 06:59:05 2013 +0100
13.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Mon Jan 14 11:52:38 2013 +0100
13.3 @@ -125,4 +125,11 @@
13.4 public static boolean iofObject() {
13.5 return jsObj() instanceof Object;
13.6 }
13.7 +
13.8 + public static int jscall() {
13.9 + return jsgetbytes(new Instance());
13.10 + }
13.11 +
13.12 + @JavaScriptBody(args = { "instance" }, body = "return instance.getByte__B();")
13.13 + private static native int jsgetbytes(Instance instance);
13.14 }
14.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sun Jan 13 06:59:05 2013 +0100
14.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Mon Jan 14 11:52:38 2013 +0100
14.3 @@ -131,6 +131,14 @@
14.4 Double.valueOf(1)
14.5 );
14.6 }
14.7 +
14.8 + @Test public void jsCallingConvention() throws Exception {
14.9 + assertExec(
14.10 + "Pointer to 'this' is passed automatically (and not as a first argument)",
14.11 + Instance.class, "jscall__I",
14.12 + Double.valueOf(31)
14.13 + );
14.14 + }
14.15
14.16 protected String startCompilationWith() {
14.17 return "org/apidesign/vm4brwsr/Instance";