# HG changeset patch # User Jaroslav Tulach # Date 1358160758 -3600 # Node ID d49769e4f783cdfa8872838620876fc7f6b88d74 # Parent d7ec46950980ab417cd0ea7f8bef72051434c0a1# Parent 9359b006782ba26cfcc409c2aa4ee598962a448b Merging use of function.call into default branch. It seems to be the way to go. diff -r d7ec46950980 -r d49769e4f783 core/src/main/java/org/apidesign/bck2brwsr/core/impl/JavaScriptProcesor.java --- a/core/src/main/java/org/apidesign/bck2brwsr/core/impl/JavaScriptProcesor.java Sun Jan 13 06:59:05 2013 +0100 +++ b/core/src/main/java/org/apidesign/bck2brwsr/core/impl/JavaScriptProcesor.java Mon Jan 14 11:52:38 2013 +0100 @@ -53,7 +53,7 @@ @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { for (Element e : roundEnv.getElementsAnnotatedWith(JavaScriptBody.class)) { - if (e.getKind() != ElementKind.METHOD) { + if (e.getKind() != ElementKind.METHOD && e.getKind() != ElementKind.CONSTRUCTOR) { continue; } ExecutableElement ee = (ExecutableElement)e; @@ -61,13 +61,7 @@ JavaScriptBody jsb = e.getAnnotation(JavaScriptBody.class); String[] arr = jsb.args(); - int indx; - if (!ee.getModifiers().contains(Modifier.STATIC)) { - indx = 1; - } else { - indx = 0; - } - if (indx + params.size() != arr.length) { + if (params.size() != arr.length) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Number of args arguments does not match real arguments!", e); } } @@ -81,14 +75,8 @@ StringBuilder sb = new StringBuilder(); if (e.getKind() == ElementKind.METHOD && member.getSimpleName().contentEquals("args")) { ExecutableElement ee = (ExecutableElement) e; - String sep; - if (!ee.getModifiers().contains(Modifier.STATIC)) { - sb.append("{ \"self\""); - sep = ", "; - } else { - sb.append("{ "); - sep = ""; - } + String sep = ""; + sb.append("{ "); for (VariableElement ve : ee.getParameters()) { sb.append(sep).append('"').append(ve.getSimpleName()) .append('"'); diff -r d7ec46950980 -r d49769e4f783 emul/src/main/java/java/lang/Class.java --- a/emul/src/main/java/java/lang/Class.java Sun Jan 13 06:59:05 2013 +0100 +++ b/emul/src/main/java/java/lang/Class.java Mon Jan 14 11:52:38 2013 +0100 @@ -216,7 +216,7 @@ + "\nif (c['cons__V']) {" + "\n if ((c.cons__V.access & 0x1) != 0) {" + "\n var inst = c();" - + "\n c.cons__V(inst);" + + "\n c.cons__V.call(inst);" + "\n return inst;" + "\n }" + "\n return illegal;" @@ -318,7 +318,7 @@ return (getAccess() & 0x200) != 0; } - @JavaScriptBody(args = "self", body = "return self.access;") + @JavaScriptBody(args = {}, body = "return this.access;") private native int getAccess(); @@ -362,8 +362,8 @@ * @see java.lang.Void#TYPE * @since JDK1.1 */ - @JavaScriptBody(args = "self", body = - "if (self.primitive) return true;" + @JavaScriptBody(args = {}, body = + "if (this.primitive) return true;" + "else return false;" ) public native boolean isPrimitive(); @@ -447,7 +447,7 @@ return jvmName().replace('/', '.'); } - @JavaScriptBody(args = "self", body = "return self.jvmName;") + @JavaScriptBody(args = {}, body = "return this.jvmName;") private native String jvmName(); @@ -481,7 +481,7 @@ * * @return the superclass of the class represented by this object. */ - @JavaScriptBody(args = "self", body = "return self.superclass;") + @JavaScriptBody(args = {}, body = "return this.superclass;") public native Class getSuperclass(); /** @@ -1078,10 +1078,10 @@ throw new ClassCastException(this.toString()); } - @JavaScriptBody(args = { "self", "ac" }, + @JavaScriptBody(args = { "ac" }, body = - "if (self.anno) {" - + " return self.anno['L' + ac.jvmName + ';'];" + "if (this.anno) {" + + " return this.anno['L' + ac.jvmName + ';'];" + "} else return null;" ) private Object getAnnotationData(Class annotationClass) { @@ -1100,8 +1100,8 @@ * @throws NullPointerException {@inheritDoc} * @since 1.5 */ - @JavaScriptBody(args = { "self", "ac" }, - body = "if (self.anno && self.anno['L' + ac.jvmName + ';']) { return true; }" + @JavaScriptBody(args = { "ac" }, + body = "if (this.anno && this.anno['L' + ac.jvmName + ';']) { return true; }" + "else return false;" ) public boolean isAnnotationPresent( @@ -1112,7 +1112,7 @@ return getAnnotation(annotationClass) != null; } - @JavaScriptBody(args = "self", body = "return self.anno;") + @JavaScriptBody(args = {}, body = "return this.anno;") private Object getAnnotationData() { throw new UnsupportedOperationException(); } diff -r d7ec46950980 -r d49769e4f783 emul/src/main/java/java/lang/Object.java --- a/emul/src/main/java/java/lang/Object.java Sun Jan 13 06:59:05 2013 +0100 +++ b/emul/src/main/java/java/lang/Object.java Mon Jan 14 11:52:38 2013 +0100 @@ -66,7 +66,7 @@ * @see Class Literals, section 15.8.2 of * The Java™ Language Specification. */ - @JavaScriptBody(args="self", body="return self.constructor.$class;") + @JavaScriptBody(args={}, body="return this.constructor.$class;") public final native Class getClass(); /** @@ -104,14 +104,14 @@ * @see java.lang.Object#equals(java.lang.Object) * @see java.lang.System#identityHashCode */ - @JavaScriptBody(args = "self", body = - "if (self.$hashCode) return self.$hashCode;\n" - + "var h = self.computeHashCode__I(self);\n" - + "return self.$hashCode = h & h;" + @JavaScriptBody(args = {}, body = + "if (this.$hashCode) return this.$hashCode;\n" + + "var h = this.computeHashCode__I();\n" + + "return this.$hashCode = h & h;" ) public native int hashCode(); - @JavaScriptBody(args = "self", body = "Math.random() * Math.pow(2, 32);") + @JavaScriptBody(args = {}, body = "Math.random() * Math.pow(2, 32);") native int computeHashCode(); /** diff -r d7ec46950980 -r d49769e4f783 emul/src/main/java/java/lang/String.java --- a/emul/src/main/java/java/lang/String.java Sun Jan 13 06:59:05 2013 +0100 +++ b/emul/src/main/java/java/lang/String.java Mon Jan 14 11:52:38 2013 +0100 @@ -169,11 +169,11 @@ * @param value * The initial value of the string */ - @JavaScriptBody(args = { "self", "charArr" }, body= + @JavaScriptBody(args = { "charArr" }, body= "for (var i = 0; i < charArr.length; i++) {\n" + " if (typeof charArr[i] === 'number') charArr[i] = String.fromCharCode(charArr[i]);\n" + "}\n" - + "self.fld_r = charArr.join('');\n" + + "this.fld_r = charArr.join('');\n" ) public String(char value[]) { } @@ -199,12 +199,12 @@ * If the {@code offset} and {@code count} arguments index * characters outside the bounds of the {@code value} array */ - @JavaScriptBody(args = { "self", "charArr", "off", "cnt" }, body = + @JavaScriptBody(args = { "charArr", "off", "cnt" }, body = "var up = off + cnt;\n" + "for (var i = off; i < up; i++) {\n" + " if (typeof charArr[i] === 'number') charArr[i] = String.fromCharCode(charArr[i]);\n" + "}\n" + - "self.fld_r = charArr.slice(off, up).join(\"\");\n" + "this.fld_r = charArr.slice(off, up).join(\"\");\n" ) public String(char value[], int offset, int count) { } @@ -618,7 +618,7 @@ * @return the length of the sequence of characters represented by this * object. */ - @JavaScriptBody(args = "self", body = "return self.toString().length;") + @JavaScriptBody(args = {}, body = "return this.toString().length;") public int length() { throw new UnsupportedOperationException(); } @@ -631,7 +631,7 @@ * * @since 1.6 */ - @JavaScriptBody(args = "self", body="return self.toString().length === 0;") + @JavaScriptBody(args = {}, body="return this.toString().length === 0;") public boolean isEmpty() { return length() == 0; } @@ -654,8 +654,8 @@ * argument is negative or not less than the length of this * string. */ - @JavaScriptBody(args = { "self", "index" }, - body = "return self.toString().charCodeAt(index);" + @JavaScriptBody(args = { "index" }, + body = "return this.toString().charCodeAt(index);" ) public char charAt(int index) { throw new UnsupportedOperationException(); @@ -780,8 +780,8 @@ * Copy characters from this string into dst starting at dstBegin. * This method doesn't perform any range checking. */ - @JavaScriptBody(args = { "self", "arr", "to" }, body = - "var s = self.toString();\n" + + @JavaScriptBody(args = { "arr", "to" }, body = + "var s = this.toString();\n" + "for (var i = 0; i < s.length; i++) {\n" + " arr[to++] = s[i];\n" + "}" @@ -820,8 +820,8 @@ *
  • dstBegin+(srcEnd-srcBegin) is larger than * dst.length */ - @JavaScriptBody(args = { "self", "beg", "end", "arr", "dst" }, body= - "var s = self.toString();\n" + + @JavaScriptBody(args = { "beg", "end", "arr", "dst" }, body= + "var s = this.toString();\n" + "while (beg < end) {\n" + " arr[dst++] = s[beg++];\n" + "}\n" @@ -993,9 +993,9 @@ * @see #compareTo(String) * @see #equalsIgnoreCase(String) */ - @JavaScriptBody(args = { "self", "obj" }, body = + @JavaScriptBody(args = { "obj" }, body = "return obj.$instOf_java_lang_String && " - + "self.toString() === obj.toString();" + + "this.toString() === obj.toString();" ) public boolean equals(Object anObject) { if (this == anObject) { @@ -1420,9 +1420,9 @@ * this.substring(toffset).startsWith(prefix) * */ - @JavaScriptBody(args = { "self", "find", "from" }, body= + @JavaScriptBody(args = { "find", "from" }, body= "find = find.toString();\n" + - "return self.toString().substring(from, from + find.length) === find;\n" + "return this.toString().substring(from, from + find.length) === find;\n" ) public boolean startsWith(String prefix, int toffset) { char ta[] = toCharArray(); @@ -1570,9 +1570,9 @@ * than or equal to fromIndex, or -1 * if the character does not occur. */ - @JavaScriptBody(args = { "self", "ch", "from" }, body = + @JavaScriptBody(args = { "ch", "from" }, body = "if (typeof ch === 'number') ch = String.fromCharCode(ch);\n" + - "return self.toString().indexOf(ch, from);\n" + "return this.toString().indexOf(ch, from);\n" ) public int indexOf(int ch, int fromIndex) { if (fromIndex < 0) { @@ -1679,9 +1679,9 @@ * than or equal to fromIndex, or -1 * if the character does not occur before that point. */ - @JavaScriptBody(args = { "self", "ch", "from" }, body = + @JavaScriptBody(args = { "ch", "from" }, body = "if (typeof ch === 'number') ch = String.fromCharCode(ch);\n" + - "return self.toString().lastIndexOf(ch, from);" + "return this.toString().lastIndexOf(ch, from);" ) public int lastIndexOf(int ch, int fromIndex) { if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) { @@ -1754,8 +1754,8 @@ * starting at the specified index, * or {@code -1} if there is no such occurrence. */ - @JavaScriptBody(args = { "self", "str", "fromIndex" }, body = - "return self.toString().indexOf(str.toString(), fromIndex);" + @JavaScriptBody(args = { "str", "fromIndex" }, body = + "return this.toString().indexOf(str.toString(), fromIndex);" ) public native int indexOf(String str, int fromIndex); @@ -1794,8 +1794,8 @@ * searching backward from the specified index, * or {@code -1} if there is no such occurrence. */ - @JavaScriptBody(args = { "self", "s", "from" }, body = - "return self.toString().lastIndexOf(s.toString(), from);" + @JavaScriptBody(args = { "s", "from" }, body = + "return this.toString().lastIndexOf(s.toString(), from);" ) public int lastIndexOf(String str, int fromIndex) { return lastIndexOf(toCharArray(), offset(), length(), str.toCharArray(), str.offset(), str.length(), fromIndex); @@ -1903,8 +1903,8 @@ * beginIndex is larger than * endIndex. */ - @JavaScriptBody(args = { "self", "beginIndex", "endIndex" }, body = - "return self.toString().substring(beginIndex, endIndex);" + @JavaScriptBody(args = { "beginIndex", "endIndex" }, body = + "return this.toString().substring(beginIndex, endIndex);" ) public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { @@ -2012,10 +2012,10 @@ * @return a string derived from this string by replacing every * occurrence of oldChar with newChar. */ - @JavaScriptBody(args = { "self", "arg1", "arg2" }, body = + @JavaScriptBody(args = { "arg1", "arg2" }, body = "if (typeof arg1 === 'number') arg1 = String.fromCharCode(arg1);\n" + "if (typeof arg2 === 'number') arg2 = String.fromCharCode(arg2);\n" + - "var s = self.toString();\n" + + "var s = this.toString();\n" + "for (;;) {\n" + " var ret = s.replace(arg1, arg2);\n" + " if (ret === s) {\n" + @@ -2078,8 +2078,8 @@ * @since 1.4 * @spec JSR-51 */ - @JavaScriptBody(args = { "self", "regex" }, body = - "self = self.toString();\n" + @JavaScriptBody(args = { "regex" }, body = + "var self = this.toString();\n" + "var re = new RegExp(regex.toString());\n" + "var r = re.exec(self);\n" + "return r != null && r.length > 0 && self.length == r[0].length;" @@ -2496,7 +2496,7 @@ * @return the String, converted to lowercase. * @see java.lang.String#toLowerCase(Locale) */ - @JavaScriptBody(args = "self", body = "return self.toLowerCase();") + @JavaScriptBody(args = {}, body = "return this.toLowerCase();") public String toLowerCase() { throw new UnsupportedOperationException("Should be supported but without connection to locale"); } @@ -2662,7 +2662,7 @@ * @return the String, converted to uppercase. * @see java.lang.String#toUpperCase(Locale) */ - @JavaScriptBody(args = "self", body = "return self.toUpperCase();") + @JavaScriptBody(args = {}, body = "return this.toUpperCase();") public String toUpperCase() { throw new UnsupportedOperationException(); } @@ -2718,7 +2718,7 @@ * * @return the string itself. */ - @JavaScriptBody(args = "self", body = "return self.toString();") + @JavaScriptBody(args = {}, body = "return this.toString();") public String toString() { return this; } diff -r d7ec46950980 -r d49769e4f783 emul/src/main/java/java/lang/Throwable.java --- a/emul/src/main/java/java/lang/Throwable.java Sun Jan 13 06:59:05 2013 +0100 +++ b/emul/src/main/java/java/lang/Throwable.java Mon Jan 14 11:52:38 2013 +0100 @@ -783,7 +783,7 @@ return this; } - @JavaScriptBody(args = { "self", "dummy" }, body = "") + @JavaScriptBody(args = { "dummy" }, body = "") private native Throwable fillInStackTrace(int dummy); /** diff -r d7ec46950980 -r d49769e4f783 emul/src/main/java/java/lang/reflect/Method.java --- a/emul/src/main/java/java/lang/reflect/Method.java Sun Jan 13 06:59:05 2013 +0100 +++ b/emul/src/main/java/java/lang/reflect/Method.java Mon Jan 14 11:52:38 2013 +0100 @@ -646,10 +646,10 @@ return Modifier.isSynthetic(getModifiers()); } - @JavaScriptBody(args = { "self", "ac" }, + @JavaScriptBody(args = { "ac" }, body = - "if (self.fld_data.anno) {" - + " return self.fld_data.anno['L' + ac.jvmName + ';'];" + "if (this.fld_data.anno) {" + + " return this.fld_data.anno['L' + ac.jvmName + ';'];" + "} else return null;" ) private Object getAnnotationData(Class annotationClass) { diff -r d7ec46950980 -r d49769e4f783 javap/src/main/java/org/apidesign/javap/Vector.java --- a/javap/src/main/java/org/apidesign/javap/Vector.java Sun Jan 13 06:59:05 2013 +0100 +++ b/javap/src/main/java/org/apidesign/javap/Vector.java Mon Jan 14 11:52:38 2013 +0100 @@ -37,8 +37,8 @@ void add(Object objectType) { addElement(objectType); } - @JavaScriptBody(args = { "self", "obj" }, body = - "self.push(obj);" + @JavaScriptBody(args = { "obj" }, body = + "this.push(obj);" ) void addElement(Object obj) { final int s = size(); @@ -46,16 +46,16 @@ setElementAt(obj, s); } - @JavaScriptBody(args = { "self" }, body = - "return self.length;" + @JavaScriptBody(args = { }, body = + "return this.length;" ) int size() { return arr == null ? 0 : arr.length; } - @JavaScriptBody(args = { "self", "newArr" }, body = - "for (var i = 0; i < self.length; i++) {\n" - + " newArr[i] = self[i];\n" + @JavaScriptBody(args = { "newArr" }, body = + "for (var i = 0; i < this.length; i++) {\n" + + " newArr[i] = this[i];\n" + "}\n") void copyInto(Object[] newArr) { if (arr == null) { @@ -67,8 +67,8 @@ } } - @JavaScriptBody(args = { "self", "index" }, body = - "return self[index];" + @JavaScriptBody(args = { "index" }, body = + "return this[index];" ) Object elementAt(int index) { return arr[index]; @@ -80,8 +80,8 @@ arr = newArr; } - @JavaScriptBody(args = { "self", "val", "index" }, body = - "self[index] = val;" + @JavaScriptBody(args = { "val", "index" }, body = + "this[index] = val;" ) void setElementAt(Object val, int index) { arr[index] = val; diff -r d7ec46950980 -r d49769e4f783 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java Sun Jan 13 06:59:05 2013 +0100 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Element.java Mon Jan 14 11:52:38 2013 +0100 @@ -51,9 +51,9 @@ * @param r the runnable to execute, never null */ @JavaScriptBody( - args={ "self", "ev", "r" }, - body="var e = window.document.getElementById(self.fld_id);\n" - + "e[ev.fld_id] = function() { r.run__V(r); };\n" + args={ "ev", "r" }, + body="var e = window.document.getElementById(this.fld_id);\n" + + "e[ev.fld_id] = function() { r.run__V(); };\n" ) final native void on(OnEvent ev, Runnable r); diff -r d7ec46950980 -r d49769e4f783 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jan 13 06:59:05 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jan 14 11:52:38 2013 +0100 @@ -249,7 +249,7 @@ new LocalsMapper(stackMapIterator.getArguments()); out.append(prefix).append(name).append(" = function("); - lmapper.outputArguments(out); + lmapper.outputArguments(out, m.isStatic()); out.append(") {").append("\n"); final byte[] byteCodes = m.getCode(); @@ -275,6 +275,9 @@ out.append(';'); } } + if (!m.isStatic()) { + out.append(" var ").append(" lcA0 = this;\n"); + } // maxStack includes two stack positions for every pushed long / double // so this might generate more stack variables than we need @@ -1330,7 +1333,11 @@ out.append("constructor."); } out.append(mn); - out.append('('); + if (isStatic) { + out.append('('); + } else { + out.append(".call("); + } if (numArguments > 0) { out.append(vars[0]); for (int j = 1; j < numArguments; ++j) { @@ -1366,10 +1373,11 @@ out.append(vars[0]).append('.'); out.append(mn); out.append('('); - out.append(vars[0]); + String sep = ""; for (int j = 1; j < numArguments; ++j) { - out.append(", "); + out.append(sep); out.append(vars[j]); + sep = ", "; } out.append(");"); i += 2; @@ -1443,15 +1451,8 @@ final String mn = findMethodName(m, cnt); out.append(prefix).append(mn); out.append(" = function("); - String space; - int index; - if (!isStatic) { - space = outputArg(out, p.args, 0); - index = 1; - } else { - space = ""; - index = 0; - } + String space = ""; + int index = 0; for (int i = 0; i < cnt.length(); i++) { out.append(space); space = outputArg(out, p.args, index); @@ -1600,7 +1601,7 @@ out.append(" stA0 = e;"); out.append("} else {"); out.append(" stA0 = vm.java_lang_Throwable(true);"); - out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2(stA0, e.toString());"); + out.append(" vm.java_lang_Throwable.cons__VLjava_lang_String_2.call(stA0, e.toString());"); out.append("}"); out.append("gt=" + e.handler_pc + "; continue;"); } else { diff -r d7ec46950980 -r d49769e4f783 vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java Sun Jan 13 06:59:05 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/LocalsMapper.java Mon Jan 14 11:52:38 2013 +0100 @@ -33,13 +33,14 @@ localTypeRecords = new TypeArray(initTypeRecords); } - public void outputArguments(final Appendable out) throws IOException { + public void outputArguments(final Appendable out, boolean isStatic) throws IOException { final int argRecordCount = argTypeRecords.getSize(); - if (argRecordCount > 0) { - Variable variable = getVariable(argTypeRecords, 0); + int first = isStatic ? 0 : 1; + if (argRecordCount > first) { + Variable variable = getVariable(argTypeRecords, first); out.append(variable); - int i = variable.isCategory2() ? 2 : 1; + int i = first + (variable.isCategory2() ? 2 : 1); while (i < argRecordCount) { variable = getVariable(argTypeRecords, i); out.append(", "); diff -r d7ec46950980 -r d49769e4f783 vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Sun Jan 13 06:59:05 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon Jan 14 11:52:38 2013 +0100 @@ -117,7 +117,7 @@ + " var loader = {};\n" + " loader.vm = vm;\n" + " loader.loadClass = function(name) {\n" - + " var attr = name.replace__Ljava_lang_String_2CC(name, '.','_');\n" + + " var attr = name.replace__Ljava_lang_String_2CC('.','_');\n" + " var fn = vm[attr];\n" + " if (fn) return fn(false);\n" + " if (!args[0]) throw 'bck2brwsr initialized without loader function, cannot load ' + name;\n" diff -r d7ec46950980 -r d49769e4f783 vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Sun Jan 13 06:59:05 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/VMLazy.java Mon Jan 14 11:52:38 2013 +0100 @@ -112,17 +112,17 @@ this.lazy = vm; } - @JavaScriptBody(args = {"self", "n"}, + @JavaScriptBody(args = {"n"}, body = - "var cls = n.replace__Ljava_lang_String_2CC(n, '/','_').toString();" - + "\nvar dot = n.replace__Ljava_lang_String_2CC(n,'/','.').toString();" - + "\nvar lazy = self.fld_lazy;" + "var cls = n.replace__Ljava_lang_String_2CC('/','_').toString();" + + "\nvar dot = n.replace__Ljava_lang_String_2CC('/','.').toString();" + + "\nvar lazy = this.fld_lazy;" + "\nvar loader = lazy.fld_loader;" + "\nvar vm = loader.vm;" + "\nif (vm[cls]) return false;" + "\nvm[cls] = function() {" + "\n var instance = arguments.length == 0 || arguments[0] === true;" - + "\n return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(lazy, dot, instance);" + + "\n return lazy.load__Ljava_lang_Object_2Ljava_lang_String_2Z(dot, instance);" + "\n};" + "\nreturn true;") @Override diff -r d7ec46950980 -r d49769e4f783 vm/src/test/java/org/apidesign/vm4brwsr/Instance.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sun Jan 13 06:59:05 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Mon Jan 14 11:52:38 2013 +0100 @@ -125,4 +125,11 @@ public static boolean iofObject() { return jsObj() instanceof Object; } + + public static int jscall() { + return jsgetbytes(new Instance()); + } + + @JavaScriptBody(args = { "instance" }, body = "return instance.getByte__B();") + private static native int jsgetbytes(Instance instance); } diff -r d7ec46950980 -r d49769e4f783 vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sun Jan 13 06:59:05 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Mon Jan 14 11:52:38 2013 +0100 @@ -131,6 +131,14 @@ Double.valueOf(1) ); } + + @Test public void jsCallingConvention() throws Exception { + assertExec( + "Pointer to 'this' is passed automatically (and not as a first argument)", + Instance.class, "jscall__I", + Double.valueOf(31) + ); + } protected String startCompilationWith() { return "org/apidesign/vm4brwsr/Instance";