1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Dec 04 12:06:27 2012 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Wed Dec 05 10:03:58 2012 +0100
1.3 @@ -121,10 +121,17 @@
1.4 }
1.5 continue;
1.6 }
1.7 + String mn;
1.8 if (m.isStatic()) {
1.9 - generateStaticMethod("\n c.", m, toInitilize);
1.10 + mn = generateStaticMethod("\n c.", m, toInitilize);
1.11 } else {
1.12 - generateInstanceMethod("\n c.", m);
1.13 + mn = generateInstanceMethod("\n c.", m);
1.14 + }
1.15 + byte[] runAnno = m.findAnnotationData(false);
1.16 + if (runAnno != null) {
1.17 + out.append("\n c.").append(mn).append(".anno = {");
1.18 + generateAnno(jc, out, runAnno);
1.19 + out.append("\n };");
1.20 }
1.21 }
1.22 out.append("\n c.constructor = CLS;");
1.23 @@ -175,9 +182,10 @@
1.24 }
1.25 return sb.toString();
1.26 }
1.27 - private void generateStaticMethod(String prefix, MethodData m, StringArray toInitilize) throws IOException {
1.28 - if (javaScriptBody(prefix, m, true)) {
1.29 - return;
1.30 + private String generateStaticMethod(String prefix, MethodData m, StringArray toInitilize) throws IOException {
1.31 + String jsb = javaScriptBody(prefix, m, true);
1.32 + if (jsb != null) {
1.33 + return jsb;
1.34 }
1.35 StringBuilder argsCnt = new StringBuilder();
1.36 final String mn = findMethodName(m, argsCnt);
1.37 @@ -212,11 +220,13 @@
1.38 out.append(" throw 'no code found for ").append(m.getInternalSig()).append("';\n");
1.39 }
1.40 out.append("};");
1.41 + return mn;
1.42 }
1.43
1.44 - private void generateInstanceMethod(String prefix, MethodData m) throws IOException {
1.45 - if (javaScriptBody(prefix, m, false)) {
1.46 - return;
1.47 + private String generateInstanceMethod(String prefix, MethodData m) throws IOException {
1.48 + String jsb = javaScriptBody(prefix, m, false);
1.49 + if (jsb != null) {
1.50 + return jsb;
1.51 }
1.52 StringBuilder argsCnt = new StringBuilder();
1.53 final String mn = findMethodName(m, argsCnt);
1.54 @@ -246,6 +256,7 @@
1.55 out.append(" throw 'no code found for ").append(m.getInternalSig()).append("';\n");
1.56 }
1.57 out.append("};");
1.58 + return mn;
1.59 }
1.60
1.61 private void produceCode(byte[] byteCodes) throws IOException {
1.62 @@ -1024,10 +1035,10 @@
1.63 return s;
1.64 }
1.65
1.66 - private boolean javaScriptBody(String prefix, MethodData m, boolean isStatic) throws IOException {
1.67 + private String javaScriptBody(String prefix, MethodData m, boolean isStatic) throws IOException {
1.68 byte[] arr = m.findAnnotationData(true);
1.69 if (arr == null) {
1.70 - return false;
1.71 + return null;
1.72 }
1.73 final String jvmType = "Lorg/apidesign/bck2brwsr/core/JavaScriptBody;";
1.74 class P extends AnnotationParser {
1.75 @@ -1055,10 +1066,11 @@
1.76 P p = new P();
1.77 p.parse(arr, jc);
1.78 if (p.body == null) {
1.79 - return false;
1.80 + return null;
1.81 }
1.82 StringBuilder cnt = new StringBuilder();
1.83 - out.append(prefix).append(findMethodName(m, cnt));
1.84 + final String mn = findMethodName(m, cnt);
1.85 + out.append(prefix).append(mn);
1.86 out.append(" = function(");
1.87 String space;
1.88 int index;
1.89 @@ -1079,7 +1091,7 @@
1.90 out.append(") {").append("\n");
1.91 out.append(p.body);
1.92 out.append("\n}\n");
1.93 - return true;
1.94 + return mn;
1.95 }
1.96 private static String className(ClassData jc) {
1.97 //return jc.getName().getInternalName().replace('/', '_');
1.98 @@ -1155,6 +1167,9 @@
1.99 @Override
1.100 protected void visitAttr(String type, String attr, String attrType, String value)
1.101 throws IOException {
1.102 + if (attr == null) {
1.103 + return;
1.104 + }
1.105 if (cnt++ > 0) {
1.106 out.append(",\n");
1.107 }