vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
branchreflection
changeset 266 2e2e6f946208
parent 250 42c2ceb1e160
child 272 a6a23aa7a546
     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                  }