Merging work on lazy loading. Seems stable enough to produce a simple demo.
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 28 Nov 2012 17:58:10 +0100
changeset 21634dfa2becbf2
parent 200 227bafe6ef52
parent 215 cdd00892d06e
child 217 14ce86e00bd9
Merging work on lazy loading. Seems stable enough to produce a simple demo.
     1.1 --- a/emul/src/main/java/java/lang/AbstractStringBuilder.java	Sun Nov 25 21:23:06 2012 +0100
     1.2 +++ b/emul/src/main/java/java/lang/AbstractStringBuilder.java	Wed Nov 28 17:58:10 2012 +0100
     1.3 @@ -602,7 +602,7 @@
     1.4       */
     1.5      @JavaScriptBody(
     1.6          args={ "self", "i" },
     1.7 -        body="return java_lang_AbstractStringBuilder_appendLjava_lang_AbstractStringBuilderLjava_lang_String(self,i.toString());"
     1.8 +        body="return java_lang_AbstractStringBuilder(true).appendLjava_lang_AbstractStringBuilderLjava_lang_String(self,i.toString());"
     1.9      )
    1.10      public AbstractStringBuilder append(int i) {
    1.11          if (i == Integer.MIN_VALUE) {
     2.1 --- a/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Sun Nov 25 21:23:06 2012 +0100
     2.2 +++ b/emul/src/main/resources/org/apidesign/vm4brwsr/emul/java_lang_String.js	Wed Nov 28 17:58:10 2012 +0100
     2.3 @@ -1,4 +1,20 @@
     2.4 -/* */
     2.5 +/**
     2.6 + * Back 2 Browser Bytecode Translator
     2.7 + * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     2.8 + *
     2.9 + * This program is free software: you can redistribute it and/or modify
    2.10 + * it under the terms of the GNU General Public License as published by
    2.11 + * the Free Software Foundation, version 2 of the License.
    2.12 + *
    2.13 + * This program is distributed in the hope that it will be useful,
    2.14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    2.15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    2.16 + * GNU General Public License for more details.
    2.17 + *
    2.18 + * You should have received a copy of the GNU General Public License
    2.19 + * along with this program. Look for COPYING file in the top folder.
    2.20 + * If not, see http://opensource.org/licenses/GPL-2.0.
    2.21 + */
    2.22  
    2.23  
    2.24  function java_lang_String_consVAC(self,charArr) {
    2.25 @@ -350,6 +366,1019 @@
    2.26      return h;
    2.27  }
    2.28  
    2.29 +function java_lang_String_substringLjava_lang_StringI(arg0,arg1) {
    2.30 +    return arg0.toString().substring(arg1);
    2.31 +}
    2.32 +function java_lang_String_substringLjava_lang_StringII(arg0,arg1,arg2) {
    2.33 +    return arg0.toString().substring(arg1, arg2);
    2.34 +}
    2.35 +
    2.36 +function java_lang_String_replaceLjava_lang_StringCC(arg0,arg1,arg2) {
    2.37 +    if (typeof arg1 === 'number') arg1 = String.fromCharCode(arg1);
    2.38 +    if (typeof arg2 === 'number') arg2 = String.fromCharCode(arg2);
    2.39 +    var s = arg0.toString();
    2.40 +    for (;;) {
    2.41 +        var ret = s.replace(arg1, arg2);
    2.42 +        if (ret === s) {
    2.43 +            return ret;
    2.44 +        }
    2.45 +        s = ret;
    2.46 +    }
    2.47 +}
    2.48 +function java_lang_String_containsZLjava_lang_CharSequence(arg0,arg1) {
    2.49 +    return arg0.toString().indexOf(arg1.toString()) >= 0;
    2.50 +}
    2.51 +
    2.52 +function java_lang_String_toStringLjava_lang_String(arg0) {
    2.53 +    return arg0.toString();
    2.54 +}
    2.55 +function java_lang_String_toCharArrayAC(arg0) {
    2.56 +    return arg0.toString().split('');
    2.57 +}
    2.58 +var java_lang_String_serialVersionUID = 0;
    2.59 +var java_lang_String_serialPersistentFields = 0;
    2.60 +var java_lang_String_CASE_INSENSITIVE_ORDER = 0;
    2.61 +function java_lang_String() {
    2.62 +    if (arguments.length === 0) {
    2.63 +        /** the real value of this 'string' we delegate to */
    2.64 +        this.r = '';
    2.65 +        return this;
    2.66 +    } else {
    2.67 +        return new java_lang_String;
    2.68 +    }
    2.69 +}
    2.70 +java_lang_String.prototype = new String;
    2.71 +java_lang_String.prototype.toString = function() { return this.r; };;
    2.72 +java_lang_String.prototype.valueOf = function() { return this.toString().valueOf(); };;
    2.73 +//java_lang_String_classV();
    2.74 +
    2.75 +/* new method for JavaScript String */
    2.76 +String.prototype.consVAC = java_lang_String_consVAC;
    2.77 +String.prototype.consVACII = java_lang_String_consVACII;
    2.78 +String.prototype.charAtCI = java_lang_String_charAtCI;
    2.79 +String.prototype.lengthI = java_lang_String_lengthI;
    2.80 +String.prototype.isEmptyZ = java_lang_String_isEmptyZ;
    2.81 +String.prototype.getCharsVIIACI = java_lang_String_getCharsVIIACAI;
    2.82 +String.prototype.getCharsVACI = java_lang_String_getCharsVACI;
    2.83 +String.prototype.toStringLjava_lang_String = java_lang_String_toStringLjava_lang_String;
    2.84 +String.prototype.substringLjava_lang_StringI = java_lang_String_substringLjava_lang_StringI;
    2.85 +String.prototype.substringLjava_lang_StringII = java_lang_String_substringLjava_lang_StringII;
    2.86 +String.prototype.replaceLjava_lang_StringCC = java_lang_String_replaceLjava_lang_StringCC;
    2.87 +String.prototype.containsZLjava_lang_CharSequence = java_lang_String_containsZLjava_lang_CharSequence;
    2.88 +String.prototype.equalsZLjava_lang_Object = java_lang_String_equalsZLjava_lang_Object;
    2.89 +String.prototype.hashCodeI = java_lang_String_hashCodeI;
    2.90 +String.prototype.toCharArrayAC = java_lang_String_toCharArrayAC;
    2.91 +String.prototype.valueOfLjava_lang_StringI=java_lang_String_valueOfLjava_lang_StringI;
    2.92 +String.prototype.startsWithZLjava_lang_StringI = java_lang_String_startsWithZLjava_lang_StringI;
    2.93 +String.prototype.startsWithZLjava_lang_String=java_lang_String_startsWithZLjava_lang_String;
    2.94 +String.prototype.endsWithZLjava_lang_String=java_lang_String_endsWithZLjava_lang_String;
    2.95 +String.prototype.indexOfII=java_lang_String_indexOfII;
    2.96 +String.prototype.indexOfIII=java_lang_String_indexOfIII;
    2.97 +
    2.98 +String.prototype.$instOf_java_lang_String = true;
    2.99 +String.prototype.$instOf_java_io_Serializable = true;
   2.100 +String.prototype.$instOf_java_lang_Comparable = true;
   2.101 +String.prototype.$instOf_java_lang_CharSequence = true;
   2.102 +
   2.103 +/*
   2.104 +function java_lang_String_subSequenceLjava_lang_CharSequenceII(arg0,arg1,arg2) {
   2.105 +  var arg3;
   2.106 +;
   2.107 +  var stack = new Array(3);
   2.108 +  var gt = 0;
   2.109 +  for(;;) switch(gt) {
   2.110 +    case 0: stack.push(arg0); // 42
   2.111 +    case 1: stack.push(arg1); // 27
   2.112 +    case 2: stack.push(arg2); // 28
   2.113 +    case 3: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.substringLjava_lang_StringII(self, v0, v1)); } // 182 1 147
   2.114 +    case 6: return stack.pop(); // 176
   2.115 +  }
   2.116 +}
   2.117 +function java_lang_String_concatLjava_lang_StringLjava_lang_String(arg0,arg1) {
   2.118 +  var arg2;
   2.119 +  var arg3;
   2.120 +  var arg4;
   2.121 +;
   2.122 +  var stack = new Array(5);
   2.123 +  var gt = 0;
   2.124 +  for(;;) switch(gt) {
   2.125 +    case 0: stack.push(arg1); // 43
   2.126 +    case 1: { var self = stack.pop(); stack.push(self.lengthI(self)); } // 182 1 133
   2.127 +    case 4: arg2 = stack.pop(); // 61
   2.128 +    case 5: stack.push(arg2); // 28
   2.129 +    case 6: if (stack.pop() != 0) { gt = 11; continue; } // 154 0 5
   2.130 +    case 9: stack.push(arg0); // 42
   2.131 +    case 10: return stack.pop(); // 176
   2.132 +    case 11: stack.push(arg0); // 42
   2.133 +    case 12: stack.push(stack.pop().count); // 180 1 97
   2.134 +    case 15: stack.push(arg2); // 28
   2.135 +    case 16: stack.push(stack.pop() + stack.pop()); // 96
   2.136 +    case 17: stack.push(new Array(stack.pop())); // 188 5
   2.137 +    case 19: arg3 = stack.pop(); // 78
   2.138 +    case 20: stack.push(arg0); // 42
   2.139 +    case 21: stack.push(0); // 3
   2.140 +    case 22: stack.push(arg0); // 42
   2.141 +    case 23: stack.push(stack.pop().count); // 180 1 97
   2.142 +    case 26: stack.push(arg3); // 45
   2.143 +    case 27: stack.push(0); // 3
   2.144 +    case 28: { var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); self.getCharsVIIACAI(self, v0, v1, v2, v3); } // 182 1 138
   2.145 +    case 31: stack.push(arg1); // 43
   2.146 +    case 32: stack.push(0); // 3
   2.147 +    case 33: stack.push(arg2); // 28
   2.148 +    case 34: stack.push(arg3); // 45
   2.149 +    case 35: stack.push(arg0); // 42
   2.150 +    case 36: stack.push(stack.pop().count); // 180 1 97
   2.151 +    case 39: { var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); self.getCharsVIIACAI(self, v0, v1, v2, v3); } // 182 1 138
   2.152 +    case 42: stack.push(new java_lang_String); // 187 0 200
   2.153 +    case 45: stack.push(stack[stack.length - 1]); // 89
   2.154 +    case 46: stack.push(0); // 3
   2.155 +    case 47: stack.push(arg0); // 42
   2.156 +    case 48: stack.push(stack.pop().count); // 180 1 97
   2.157 +    case 51: stack.push(arg2); // 28
   2.158 +    case 52: stack.push(stack.pop() + stack.pop()); // 96
   2.159 +    case 53: stack.push(arg3); // 45
   2.160 +    case 54: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
   2.161 +    case 57: return stack.pop(); // 176
   2.162 +  }
   2.163 +}
   2.164 +function java_lang_String_matchesZLjava_lang_String(arg0,arg1) {
   2.165 +  var arg2;
   2.166 +;
   2.167 +  var stack = new Array(2);
   2.168 +  var gt = 0;
   2.169 +  for(;;) switch(gt) {
   2.170 +    case 0: stack.push(arg1); // 43
   2.171 +    case 1: stack.push(arg0); // 42
   2.172 +    case 2: { var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_util_regex_Pattern_matchesZLjava_lang_StringLjava_lang_CharSequence(v0, v1)); } // 184 1 183
   2.173 +    case 5: return stack.pop(); // 172
   2.174 +  }
   2.175 +}
   2.176 +function java_lang_String_replaceFirstLjava_lang_StringLjava_lang_StringLjava_lang_String(arg0,arg1,arg2) {
   2.177 +  var arg3;
   2.178 +;
   2.179 +  var stack = new Array(2);
   2.180 +  var gt = 0;
   2.181 +  for(;;) switch(gt) {
   2.182 +    case 0: stack.push(arg1); // 43
   2.183 +    case 1: { var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_String(v0)); } // 184 1 186
   2.184 +    case 4: stack.push(arg0); // 42
   2.185 +    case 5: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.matcherLjava_util_regex_MatcherLjava_lang_CharSequence(self, v0)); } // 182 1 185
   2.186 +    case 8: stack.push(arg2); // 44
   2.187 +    case 9: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.replaceFirstLjava_lang_StringLjava_lang_String(self, v0)); } // 182 1 182
   2.188 +    case 12: return stack.pop(); // 176
   2.189 +  }
   2.190 +}
   2.191 +function java_lang_String_replaceAllLjava_lang_StringLjava_lang_StringLjava_lang_String(arg0,arg1,arg2) {
   2.192 +  var arg3;
   2.193 +;
   2.194 +  var stack = new Array(2);
   2.195 +  var gt = 0;
   2.196 +  for(;;) switch(gt) {
   2.197 +    case 0: stack.push(arg1); // 43
   2.198 +    case 1: { var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_String(v0)); } // 184 1 186
   2.199 +    case 4: stack.push(arg0); // 42
   2.200 +    case 5: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.matcherLjava_util_regex_MatcherLjava_lang_CharSequence(self, v0)); } // 182 1 185
   2.201 +    case 8: stack.push(arg2); // 44
   2.202 +    case 9: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.replaceAllLjava_lang_StringLjava_lang_String(self, v0)); } // 182 1 181
   2.203 +    case 12: return stack.pop(); // 176
   2.204 +  }
   2.205 +}
   2.206 +function java_lang_String_replaceLjava_lang_StringLjava_lang_CharSequenceLjava_lang_CharSequence(arg0,arg1,arg2) {
   2.207 +  var arg3;
   2.208 +;
   2.209 +  var stack = new Array(2);
   2.210 +  var gt = 0;
   2.211 +  for(;;) switch(gt) {
   2.212 +    case 0: stack.push(arg1); // 43
   2.213 +    case 1: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 132
   2.214 +    case 4: stack.push(16); // 16 16
   2.215 +    case 6: { var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_StringI(v0, v1)); } // 184 1 187
   2.216 +    case 9: stack.push(arg0); // 42
   2.217 +    case 10: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.matcherLjava_util_regex_MatcherLjava_lang_CharSequence(self, v0)); } // 182 1 185
   2.218 +    case 13: stack.push(arg2); // 44
   2.219 +    case 14: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 132
   2.220 +    case 17: { var v0 = stack.pop(); stack.push(java_util_regex_Matcher_quoteReplacementLjava_lang_StringLjava_lang_String(v0)); } // 184 1 180
   2.221 +    case 20: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.replaceAllLjava_lang_StringLjava_lang_String(self, v0)); } // 182 1 181
   2.222 +    case 23: return stack.pop(); // 176
   2.223 +  }
   2.224 +}
   2.225 +function java_lang_String_splitALjava_lang_StringLjava_lang_StringI(arg0,arg1,arg2) {
   2.226 +  var arg3;
   2.227 +;
   2.228 +  var stack = new Array(3);
   2.229 +  var gt = 0;
   2.230 +  for(;;) switch(gt) {
   2.231 +    case 0: stack.push(arg1); // 43
   2.232 +    case 1: { var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_String(v0)); } // 184 1 186
   2.233 +    case 4: stack.push(arg0); // 42
   2.234 +    case 5: stack.push(arg2); // 28
   2.235 +    case 6: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.splitALjava_lang_StringLjava_lang_CharSequenceI(self, v0, v1)); } // 182 1 184
   2.236 +    case 9: return stack.pop(); // 176
   2.237 +  }
   2.238 +}
   2.239 +function java_lang_String_splitALjava_lang_StringLjava_lang_String(arg0,arg1) {
   2.240 +  var arg2;
   2.241 +;
   2.242 +  var stack = new Array(3);
   2.243 +  var gt = 0;
   2.244 +  for(;;) switch(gt) {
   2.245 +    case 0: stack.push(arg0); // 42
   2.246 +    case 1: stack.push(arg1); // 43
   2.247 +    case 2: stack.push(0); // 3
   2.248 +    case 3: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.splitALjava_lang_StringLjava_lang_StringI(self, v0, v1)); } // 182 1 157
   2.249 +    case 6: return stack.pop(); // 176
   2.250 +  }
   2.251 +}
   2.252 +function java_lang_String_toLowerCaseLjava_lang_StringLjava_util_Locale(arg0,arg1) {
   2.253 +  var arg2;
   2.254 +  var arg3;
   2.255 +  var arg4;
   2.256 +  var arg5;
   2.257 +  var arg6;
   2.258 +  var arg7;
   2.259 +  var arg8;
   2.260 +  var arg9;
   2.261 +  var arg10;
   2.262 +  var arg11;
   2.263 +  var arg12;
   2.264 +  var arg13;
   2.265 +  var arg14;
   2.266 +;
   2.267 +  var stack = new Array(6);
   2.268 +  var gt = 0;
   2.269 +  for(;;) switch(gt) {
   2.270 +    case 0: stack.push(arg1); // 43
   2.271 +    case 1: if (stack.pop()) { gt = 12; continue; } // 199 0 11
   2.272 +    case 4: stack.push(new java_lang_NullPointerException); // 187 0 198
   2.273 +    case 7: stack.push(stack[stack.length - 1]); // 89
   2.274 +    case 8: { java_lang_NullPointerException_consV(stack.pop()); } // 183 1 128
   2.275 +    case 11:  // 191
   2.276 +    case 12: stack.push(0); // 3
   2.277 +    case 13: arg2 = stack.pop(); // 61
   2.278 +    case 14: stack.push(arg2); // 28
   2.279 +    case 15: stack.push(arg0); // 42
   2.280 +    case 16: stack.push(stack.pop().count); // 180 1 97
   2.281 +    case 19: if (stack.pop() <= stack.pop()) { gt = 94; continue; } // 162 0 75
   2.282 +    case 22: stack.push(arg0); // 42
   2.283 +    case 23: stack.push(stack.pop().value); // 180 1 100
   2.284 +    case 26: stack.push(arg0); // 42
   2.285 +    case 27: stack.push(stack.pop().offset); // 180 1 99
   2.286 +    case 30: stack.push(arg2); // 28
   2.287 +    case 31: stack.push(stack.pop() + stack.pop()); // 96
   2.288 +    case 32: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.289 +    case 33: arg3 = stack.pop(); // 62
   2.290 +    case 34: stack.push(arg3); // 29
   2.291 +    case 35: stack.push(55296); // 18 1
   2.292 +    case 37: if (stack.pop() > stack.pop()) { gt = 77; continue; } // 161 0 40
   2.293 +    case 40: stack.push(arg3); // 29
   2.294 +    case 41: stack.push(56319); // 18 2
   2.295 +    case 43: if (stack.pop() < stack.pop()) { gt = 77; continue; } // 163 0 34
   2.296 +    case 46: stack.push(arg0); // 42
   2.297 +    case 47: stack.push(arg2); // 28
   2.298 +    case 48: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
   2.299 +    case 51: arg4 = stack.pop() // 54 4
   2.300 +    case 53: stack.push(arg4); // 21 4
   2.301 +    case 55: stack.push(arg4); // 21 4
   2.302 +    case 57: { var v0 = stack.pop(); stack.push(java_lang_Character_toLowerCaseII(v0)); } // 184 1 107
   2.303 +    case 60: if (stack.pop() == stack.pop()) { gt = 66; continue; } // 159 0 6
   2.304 +    case 63: gt = 96; continue; // 167 0 33
   2.305 +    case 66: stack.push(arg2); // 28
   2.306 +    case 67: stack.push(arg4); // 21 4
   2.307 +    case 69: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
   2.308 +    case 72: stack.push(stack.pop() + stack.pop()); // 96
   2.309 +    case 73: arg2 = stack.pop(); // 61
   2.310 +    case 74: gt = 91; continue; // 167 0 17
   2.311 +    case 77: stack.push(arg3); // 29
   2.312 +    case 78: stack.push(arg3); // 29
   2.313 +    case 79: { var v0 = stack.pop(); stack.push(java_lang_Character_toLowerCaseCC(v0)); } // 184 1 104
   2.314 +    case 82: if (stack.pop() == stack.pop()) { gt = 88; continue; } // 159 0 6
   2.315 +    case 85: gt = 96; continue; // 167 0 11
   2.316 +    case 88: arg2++; // 132 2 1
   2.317 +    case 91: gt = 14; continue; // 167 255 179
   2.318 +    case 94: stack.push(arg0); // 42
   2.319 +    case 95: return stack.pop(); // 176
   2.320 +    case 96: stack.push(arg0); // 42
   2.321 +    case 97: stack.push(stack.pop().count); // 180 1 97
   2.322 +    case 100: stack.push(new Array(stack.pop())); // 188 5
   2.323 +    case 102: arg3 = stack.pop(); // 78
   2.324 +    case 103: stack.push(0); // 3
   2.325 +    case 104: arg4 = stack.pop() // 54 4
   2.326 +    case 106: stack.push(arg0); // 42
   2.327 +    case 107: stack.push(stack.pop().value); // 180 1 100
   2.328 +    case 110: stack.push(arg0); // 42
   2.329 +    case 111: stack.push(stack.pop().offset); // 180 1 99
   2.330 +    case 114: stack.push(arg3); // 45
   2.331 +    case 115: stack.push(0); // 3
   2.332 +    case 116: stack.push(arg2); // 28
   2.333 +    case 117: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
   2.334 +    case 120: stack.push(arg1); // 43
   2.335 +    case 121: { var self = stack.pop(); stack.push(self.getLanguageLjava_lang_String(self)); } // 182 1 178
   2.336 +    case 124: arg5 = stack.pop() // 58 5
   2.337 +    case 126: stack.push(arg5); // 25 5
   2.338 +    case 128: stack.push("tr"); // 18 11
   2.339 +    case 130:  // 165
   2.340 +    case 131:  // 0
   2.341 +    case 132: stack.push(6405); // 17 25 5
   2.342 +    case 135: stack.push("az"); // 18 5
   2.343 +    case 137:  // 165
   2.344 +    case 138:  // 0
   2.345 +    case 139: stack.push(1); // 10
   2.346 +    case 140: stack.push(arg5); // 25 5
   2.347 +    case 142: stack.push("lt"); // 18 9
   2.348 +    case 144:  // 166
   2.349 +    case 145:  // 0
   2.350 +    case 146: stack.push(4); // 7
   2.351 +    case 147: stack.push(1); // 4
   2.352 +    case 148: gt = 152; continue; // 167 0 4
   2.353 +    case 151: stack.push(0); // 3
   2.354 +    case 152: arg6 = stack.pop() // 54 6
   2.355 +    case 154: stack.push(arg2); // 28
   2.356 +    case 155: arg11 = stack.pop() // 54 11
   2.357 +    case 157: stack.push(arg11); // 21 11
   2.358 +    case 159: stack.push(arg0); // 42
   2.359 +    case 160: stack.push(stack.pop().count); // 180 1 97
   2.360 +    case 163: if (stack.pop() <= stack.pop()) { gt = 419; continue; } // 162 1 0
   2.361 +    case 166: stack.push(arg0); // 42
   2.362 +    case 167: stack.push(stack.pop().value); // 180 1 100
   2.363 +    case 170: stack.push(arg0); // 42
   2.364 +    case 171: stack.push(stack.pop().offset); // 180 1 99
   2.365 +    case 174: stack.push(arg11); // 21 11
   2.366 +    case 176: stack.push(stack.pop() + stack.pop()); // 96
   2.367 +    case 177: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.368 +    case 178: arg9 = stack.pop() // 54 9
   2.369 +    case 180: stack.push(arg9); // 21 9
   2.370 +    case 182: // number conversion  // 146
   2.371 +    case 183: stack.push(55296); // 18 1
   2.372 +    case 185: if (stack.pop() > stack.pop()) { gt = 214; continue; } // 161 0 29
   2.373 +    case 188: stack.push(arg9); // 21 9
   2.374 +    case 190: // number conversion  // 146
   2.375 +    case 191: stack.push(56319); // 18 2
   2.376 +    case 193: if (stack.pop() < stack.pop()) { gt = 214; continue; } // 163 0 21
   2.377 +    case 196: stack.push(arg0); // 42
   2.378 +    case 197: stack.push(arg11); // 21 11
   2.379 +    case 199: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
   2.380 +    case 202: arg9 = stack.pop() // 54 9
   2.381 +    case 204: stack.push(arg9); // 21 9
   2.382 +    case 206: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
   2.383 +    case 209: arg10 = stack.pop() // 54 10
   2.384 +    case 211: gt = 217; continue; // 167 0 6
   2.385 +    case 214: stack.push(1); // 4
   2.386 +    case 215: arg10 = stack.pop() // 54 10
   2.387 +    case 217: stack.push(arg6); // 21 6
   2.388 +    case 219: if (stack.pop() != 0) { gt = 230; continue; } // 154 0 11
   2.389 +    case 222: stack.push(arg9); // 21 9
   2.390 +    case 224: stack.push(931); // 17 3 163
   2.391 +    case 227: if (stack.pop() != stack.pop()) { gt = 242; continue; } // 160 0 15
   2.392 +    case 230: stack.push(arg0); // 42
   2.393 +    case 231: stack.push(arg11); // 21 11
   2.394 +    case 233: stack.push(arg1); // 43
   2.395 +    case 234: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toLowerCaseExILjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 117
   2.396 +    case 237: arg8 = stack.pop() // 54 8
   2.397 +    case 239: gt = 249; continue; // 167 0 10
   2.398 +    case 242: stack.push(arg9); // 21 9
   2.399 +    case 244: { var v0 = stack.pop(); stack.push(java_lang_Character_toLowerCaseII(v0)); } // 184 1 107
   2.400 +    case 247: arg8 = stack.pop() // 54 8
   2.401 +    case 249: stack.push(arg8); // 21 8
   2.402 +    case 251:  // 2
   2.403 +    case 252: if (stack.pop() == stack.pop()) { gt = 262; continue; } // 159 0 10
   2.404 +    case 255: stack.push(arg8); // 21 8
   2.405 +    case 257: stack.push(65536); // 18 3
   2.406 +    case 259: if (stack.pop() > stack.pop()) { gt = 399; continue; } // 161 0 140
   2.407 +    case 262: stack.push(arg8); // 21 8
   2.408 +    case 264:  // 2
   2.409 +    case 265: if (stack.pop() != stack.pop()) { gt = 280; continue; } // 160 0 15
   2.410 +    case 268: stack.push(arg0); // 42
   2.411 +    case 269: stack.push(arg11); // 21 11
   2.412 +    case 271: stack.push(arg1); // 43
   2.413 +    case 272: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toLowerCaseCharArrayACLjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 119
   2.414 +    case 275: arg7 = stack.pop() // 58 7
   2.415 +    case 277: gt = 315; continue; // 167 0 38
   2.416 +    case 280: stack.push(arg10); // 21 10
   2.417 +    case 282: stack.push(2); // 5
   2.418 +    case 283: if (stack.pop() != stack.pop()) { gt = 308; continue; } // 160 0 25
   2.419 +    case 286: stack.push(arg4); // 21 4
   2.420 +    case 288: stack.push(arg8); // 21 8
   2.421 +    case 290: stack.push(arg3); // 45
   2.422 +    case 291: stack.push(arg11); // 21 11
   2.423 +    case 293: stack.push(arg4); // 21 4
   2.424 +    case 295: stack.push(stack.pop() + stack.pop()); // 96
   2.425 +    case 296: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_Character_toCharsAIIACAI(v0, v1, v2)); } // 184 1 111
   2.426 +    case 299: stack.push(arg10); // 21 10
   2.427 +    case 301: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
   2.428 +    case 302: stack.push(stack.pop() + stack.pop()); // 96
   2.429 +    case 303: arg4 = stack.pop() // 54 4
   2.430 +    case 305: gt = 409; continue; // 167 0 104
   2.431 +    case 308: stack.push(arg8); // 21 8
   2.432 +    case 310: { var v0 = stack.pop(); stack.push(java_lang_Character_toCharsACI(v0)); } // 184 1 109
   2.433 +    case 313: arg7 = stack.pop() // 58 7
   2.434 +    case 315: stack.push(arg7); // 25 7
   2.435 +    case 317: stack.push(stack.pop().length); // 190
   2.436 +    case 318: arg12 = stack.pop() // 54 12
   2.437 +    case 320: stack.push(arg12); // 21 12
   2.438 +    case 322: stack.push(arg10); // 21 10
   2.439 +    case 324: if (stack.pop() >= stack.pop()) { gt = 355; continue; } // 164 0 31
   2.440 +    case 327: stack.push(arg3); // 45
   2.441 +    case 328: stack.push(stack.pop().length); // 190
   2.442 +    case 329: stack.push(arg12); // 21 12
   2.443 +    case 331: stack.push(stack.pop() + stack.pop()); // 96
   2.444 +    case 332: stack.push(arg10); // 21 10
   2.445 +    case 334: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
   2.446 +    case 335: stack.push(new Array(stack.pop())); // 188 5
   2.447 +    case 337: arg13 = stack.pop() // 58 13
   2.448 +    case 339: stack.push(arg3); // 45
   2.449 +    case 340: stack.push(0); // 3
   2.450 +    case 341: stack.push(arg13); // 25 13
   2.451 +    case 343: stack.push(0); // 3
   2.452 +    case 344: stack.push(arg11); // 21 11
   2.453 +    case 346: stack.push(arg4); // 21 4
   2.454 +    case 348: stack.push(stack.pop() + stack.pop()); // 96
   2.455 +    case 349: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
   2.456 +    case 352: stack.push(arg13); // 25 13
   2.457 +    case 354: arg3 = stack.pop(); // 78
   2.458 +    case 355: stack.push(0); // 3
   2.459 +    case 356: arg13 = stack.pop() // 54 13
   2.460 +    case 358: stack.push(arg13); // 21 13
   2.461 +    case 360: stack.push(arg12); // 21 12
   2.462 +    case 362: if (stack.pop() <= stack.pop()) { gt = 386; continue; } // 162 0 24
   2.463 +    case 365: stack.push(arg3); // 45
   2.464 +    case 366: stack.push(arg11); // 21 11
   2.465 +    case 368: stack.push(arg4); // 21 4
   2.466 +    case 370: stack.push(stack.pop() + stack.pop()); // 96
   2.467 +    case 371: stack.push(arg13); // 21 13
   2.468 +    case 373: stack.push(stack.pop() + stack.pop()); // 96
   2.469 +    case 374: stack.push(arg7); // 25 7
   2.470 +    case 376: stack.push(arg13); // 21 13
   2.471 +    case 378: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.472 +    case 379: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
   2.473 +    case 380: arg13++; // 132 13 1
   2.474 +    case 383: gt = 358; continue; // 167 255 231
   2.475 +    case 386: stack.push(arg4); // 21 4
   2.476 +    case 388: stack.push(arg12); // 21 12
   2.477 +    case 390: stack.push(arg10); // 21 10
   2.478 +    case 392: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
   2.479 +    case 393: stack.push(stack.pop() + stack.pop()); // 96
   2.480 +    case 394: arg4 = stack.pop() // 54 4
   2.481 +    case 396: gt = 409; continue; // 167 0 13
   2.482 +    case 399: stack.push(arg3); // 45
   2.483 +    case 400: stack.push(arg11); // 21 11
   2.484 +    case 402: stack.push(arg4); // 21 4
   2.485 +    case 404: stack.push(stack.pop() + stack.pop()); // 96
   2.486 +    case 405: stack.push(arg8); // 21 8
   2.487 +    case 407: // number conversion  // 146
   2.488 +    case 408: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
   2.489 +    case 409: stack.push(arg11); // 21 11
   2.490 +    case 411: stack.push(arg10); // 21 10
   2.491 +    case 413: stack.push(stack.pop() + stack.pop()); // 96
   2.492 +    case 414: arg11 = stack.pop() // 54 11
   2.493 +    case 416: gt = 157; continue; // 167 254 253
   2.494 +    case 419: stack.push(new java_lang_String); // 187 0 200
   2.495 +    case 422: stack.push(stack[stack.length - 1]); // 89
   2.496 +    case 423: stack.push(0); // 3
   2.497 +    case 424: stack.push(arg0); // 42
   2.498 +    case 425: stack.push(stack.pop().count); // 180 1 97
   2.499 +    case 428: stack.push(arg4); // 21 4
   2.500 +    case 430: stack.push(stack.pop() + stack.pop()); // 96
   2.501 +    case 431: stack.push(arg3); // 45
   2.502 +    case 432: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
   2.503 +    case 435: return stack.pop(); // 176
   2.504 +  }
   2.505 +}
   2.506 +function java_lang_String_toLowerCaseLjava_lang_String(arg0) {
   2.507 +  var arg1;
   2.508 +;
   2.509 +  var stack = new Array(2);
   2.510 +  var gt = 0;
   2.511 +  for(;;) switch(gt) {
   2.512 +    case 0: stack.push(arg0); // 42
   2.513 +    case 1: { stack.push(java_util_Locale_getDefaultLjava_util_Locale()); } // 184 1 179
   2.514 +    case 4: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.toLowerCaseLjava_lang_StringLjava_util_Locale(self, v0)); } // 182 1 158
   2.515 +    case 7: return stack.pop(); // 176
   2.516 +  }
   2.517 +}
   2.518 +function java_lang_String_toUpperCaseLjava_lang_StringLjava_util_Locale(arg0,arg1) {
   2.519 +  var arg2;
   2.520 +  var arg3;
   2.521 +  var arg4;
   2.522 +  var arg5;
   2.523 +  var arg6;
   2.524 +  var arg7;
   2.525 +  var arg8;
   2.526 +  var arg9;
   2.527 +  var arg10;
   2.528 +  var arg11;
   2.529 +  var arg12;
   2.530 +  var arg13;
   2.531 +  var arg14;
   2.532 +;
   2.533 +  var stack = new Array(6);
   2.534 +  var gt = 0;
   2.535 +  for(;;) switch(gt) {
   2.536 +    case 0: stack.push(arg1); // 43
   2.537 +    case 1: if (stack.pop()) { gt = 12; continue; } // 199 0 11
   2.538 +    case 4: stack.push(new java_lang_NullPointerException); // 187 0 198
   2.539 +    case 7: stack.push(stack[stack.length - 1]); // 89
   2.540 +    case 8: { java_lang_NullPointerException_consV(stack.pop()); } // 183 1 128
   2.541 +    case 11:  // 191
   2.542 +    case 12: stack.push(0); // 3
   2.543 +    case 13: arg2 = stack.pop(); // 61
   2.544 +    case 14: stack.push(arg2); // 28
   2.545 +    case 15: stack.push(arg0); // 42
   2.546 +    case 16: stack.push(stack.pop().count); // 180 1 97
   2.547 +    case 19: if (stack.pop() <= stack.pop()) { gt = 93; continue; } // 162 0 74
   2.548 +    case 22: stack.push(arg0); // 42
   2.549 +    case 23: stack.push(stack.pop().value); // 180 1 100
   2.550 +    case 26: stack.push(arg0); // 42
   2.551 +    case 27: stack.push(stack.pop().offset); // 180 1 99
   2.552 +    case 30: stack.push(arg2); // 28
   2.553 +    case 31: stack.push(stack.pop() + stack.pop()); // 96
   2.554 +    case 32: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.555 +    case 33: arg3 = stack.pop(); // 62
   2.556 +    case 34: stack.push(arg3); // 29
   2.557 +    case 35: stack.push(55296); // 18 1
   2.558 +    case 37: if (stack.pop() > stack.pop()) { gt = 61; continue; } // 161 0 24
   2.559 +    case 40: stack.push(arg3); // 29
   2.560 +    case 41: stack.push(56319); // 18 2
   2.561 +    case 43: if (stack.pop() < stack.pop()) { gt = 61; continue; } // 163 0 18
   2.562 +    case 46: stack.push(arg0); // 42
   2.563 +    case 47: stack.push(arg2); // 28
   2.564 +    case 48: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
   2.565 +    case 51: arg3 = stack.pop(); // 62
   2.566 +    case 52: stack.push(arg3); // 29
   2.567 +    case 53: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
   2.568 +    case 56: arg4 = stack.pop() // 54 4
   2.569 +    case 58: gt = 64; continue; // 167 0 6
   2.570 +    case 61: stack.push(1); // 4
   2.571 +    case 62: arg4 = stack.pop() // 54 4
   2.572 +    case 64: stack.push(arg3); // 29
   2.573 +    case 65: { var v0 = stack.pop(); stack.push(java_lang_Character_toUpperCaseExII(v0)); } // 184 1 108
   2.574 +    case 68: arg5 = stack.pop() // 54 5
   2.575 +    case 70: stack.push(arg5); // 21 5
   2.576 +    case 72:  // 2
   2.577 +    case 73: if (stack.pop() == stack.pop()) { gt = 95; continue; } // 159 0 22
   2.578 +    case 76: stack.push(arg3); // 29
   2.579 +    case 77: stack.push(arg5); // 21 5
   2.580 +    case 79: if (stack.pop() == stack.pop()) { gt = 85; continue; } // 159 0 6
   2.581 +    case 82: gt = 95; continue; // 167 0 13
   2.582 +    case 85: stack.push(arg2); // 28
   2.583 +    case 86: stack.push(arg4); // 21 4
   2.584 +    case 88: stack.push(stack.pop() + stack.pop()); // 96
   2.585 +    case 89: arg2 = stack.pop(); // 61
   2.586 +    case 90: gt = 14; continue; // 167 255 180
   2.587 +    case 93: stack.push(arg0); // 42
   2.588 +    case 94: return stack.pop(); // 176
   2.589 +    case 95: stack.push(arg0); // 42
   2.590 +    case 96: stack.push(stack.pop().count); // 180 1 97
   2.591 +    case 99: stack.push(new Array(stack.pop())); // 188 5
   2.592 +    case 101: arg3 = stack.pop(); // 78
   2.593 +    case 102: stack.push(0); // 3
   2.594 +    case 103: arg4 = stack.pop() // 54 4
   2.595 +    case 105: stack.push(arg0); // 42
   2.596 +    case 106: stack.push(stack.pop().value); // 180 1 100
   2.597 +    case 109: stack.push(arg0); // 42
   2.598 +    case 110: stack.push(stack.pop().offset); // 180 1 99
   2.599 +    case 113: stack.push(arg3); // 45
   2.600 +    case 114: stack.push(0); // 3
   2.601 +    case 115: stack.push(arg2); // 28
   2.602 +    case 116: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
   2.603 +    case 119: stack.push(arg1); // 43
   2.604 +    case 120: { var self = stack.pop(); stack.push(self.getLanguageLjava_lang_String(self)); } // 182 1 178
   2.605 +    case 123: arg5 = stack.pop() // 58 5
   2.606 +    case 125: stack.push(arg5); // 25 5
   2.607 +    case 127: stack.push("tr"); // 18 11
   2.608 +    case 129:  // 165
   2.609 +    case 130:  // 0
   2.610 +    case 131: stack.push(6405); // 17 25 5
   2.611 +    case 134: stack.push("az"); // 18 5
   2.612 +    case 136:  // 165
   2.613 +    case 137:  // 0
   2.614 +    case 138: stack.push(1); // 10
   2.615 +    case 139: stack.push(arg5); // 25 5
   2.616 +    case 141: stack.push("lt"); // 18 9
   2.617 +    case 143:  // 166
   2.618 +    case 144:  // 0
   2.619 +    case 145: stack.push(4); // 7
   2.620 +    case 146: stack.push(1); // 4
   2.621 +    case 147: gt = 151; continue; // 167 0 4
   2.622 +    case 150: stack.push(0); // 3
   2.623 +    case 151: arg6 = stack.pop() // 54 6
   2.624 +    case 153: stack.push(arg2); // 28
   2.625 +    case 154: arg11 = stack.pop() // 54 11
   2.626 +    case 156: stack.push(arg11); // 21 11
   2.627 +    case 158: stack.push(arg0); // 42
   2.628 +    case 159: stack.push(stack.pop().count); // 180 1 97
   2.629 +    case 162: if (stack.pop() <= stack.pop()) { gt = 425; continue; } // 162 1 7
   2.630 +    case 165: stack.push(arg0); // 42
   2.631 +    case 166: stack.push(stack.pop().value); // 180 1 100
   2.632 +    case 169: stack.push(arg0); // 42
   2.633 +    case 170: stack.push(stack.pop().offset); // 180 1 99
   2.634 +    case 173: stack.push(arg11); // 21 11
   2.635 +    case 175: stack.push(stack.pop() + stack.pop()); // 96
   2.636 +    case 176: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.637 +    case 177: arg9 = stack.pop() // 54 9
   2.638 +    case 179: stack.push(arg9); // 21 9
   2.639 +    case 181: // number conversion  // 146
   2.640 +    case 182: stack.push(55296); // 18 1
   2.641 +    case 184: if (stack.pop() > stack.pop()) { gt = 213; continue; } // 161 0 29
   2.642 +    case 187: stack.push(arg9); // 21 9
   2.643 +    case 189: // number conversion  // 146
   2.644 +    case 190: stack.push(56319); // 18 2
   2.645 +    case 192: if (stack.pop() < stack.pop()) { gt = 213; continue; } // 163 0 21
   2.646 +    case 195: stack.push(arg0); // 42
   2.647 +    case 196: stack.push(arg11); // 21 11
   2.648 +    case 198: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
   2.649 +    case 201: arg9 = stack.pop() // 54 9
   2.650 +    case 203: stack.push(arg9); // 21 9
   2.651 +    case 205: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
   2.652 +    case 208: arg10 = stack.pop() // 54 10
   2.653 +    case 210: gt = 216; continue; // 167 0 6
   2.654 +    case 213: stack.push(1); // 4
   2.655 +    case 214: arg10 = stack.pop() // 54 10
   2.656 +    case 216: stack.push(arg6); // 21 6
   2.657 +    case 218: if (stack.pop() == 0) { gt = 233; continue; } // 153 0 15
   2.658 +    case 221: stack.push(arg0); // 42
   2.659 +    case 222: stack.push(arg11); // 21 11
   2.660 +    case 224: stack.push(arg1); // 43
   2.661 +    case 225: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toUpperCaseExILjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 118
   2.662 +    case 228: arg8 = stack.pop() // 54 8
   2.663 +    case 230: gt = 240; continue; // 167 0 10
   2.664 +    case 233: stack.push(arg9); // 21 9
   2.665 +    case 235: { var v0 = stack.pop(); stack.push(java_lang_Character_toUpperCaseExII(v0)); } // 184 1 108
   2.666 +    case 238: arg8 = stack.pop() // 54 8
   2.667 +    case 240: stack.push(arg8); // 21 8
   2.668 +    case 242:  // 2
   2.669 +    case 243: if (stack.pop() == stack.pop()) { gt = 253; continue; } // 159 0 10
   2.670 +    case 246: stack.push(arg8); // 21 8
   2.671 +    case 248: stack.push(65536); // 18 3
   2.672 +    case 250: if (stack.pop() > stack.pop()) { gt = 405; continue; } // 161 0 155
   2.673 +    case 253: stack.push(arg8); // 21 8
   2.674 +    case 255:  // 2
   2.675 +    case 256: if (stack.pop() != stack.pop()) { gt = 286; continue; } // 160 0 30
   2.676 +    case 259: stack.push(arg6); // 21 6
   2.677 +    case 261: if (stack.pop() == 0) { gt = 276; continue; } // 153 0 15
   2.678 +    case 264: stack.push(arg0); // 42
   2.679 +    case 265: stack.push(arg11); // 21 11
   2.680 +    case 267: stack.push(arg1); // 43
   2.681 +    case 268: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toUpperCaseCharArrayACLjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 120
   2.682 +    case 271: arg7 = stack.pop() // 58 7
   2.683 +    case 273: gt = 321; continue; // 167 0 48
   2.684 +    case 276: stack.push(arg9); // 21 9
   2.685 +    case 278: { var v0 = stack.pop(); stack.push(java_lang_Character_toUpperCaseCharArrayACI(v0)); } // 184 1 110
   2.686 +    case 281: arg7 = stack.pop() // 58 7
   2.687 +    case 283: gt = 321; continue; // 167 0 38
   2.688 +    case 286: stack.push(arg10); // 21 10
   2.689 +    case 288: stack.push(2); // 5
   2.690 +    case 289: if (stack.pop() != stack.pop()) { gt = 314; continue; } // 160 0 25
   2.691 +    case 292: stack.push(arg4); // 21 4
   2.692 +    case 294: stack.push(arg8); // 21 8
   2.693 +    case 296: stack.push(arg3); // 45
   2.694 +    case 297: stack.push(arg11); // 21 11
   2.695 +    case 299: stack.push(arg4); // 21 4
   2.696 +    case 301: stack.push(stack.pop() + stack.pop()); // 96
   2.697 +    case 302: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_Character_toCharsAIIACAI(v0, v1, v2)); } // 184 1 111
   2.698 +    case 305: stack.push(arg10); // 21 10
   2.699 +    case 307: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
   2.700 +    case 308: stack.push(stack.pop() + stack.pop()); // 96
   2.701 +    case 309: arg4 = stack.pop() // 54 4
   2.702 +    case 311: gt = 415; continue; // 167 0 104
   2.703 +    case 314: stack.push(arg8); // 21 8
   2.704 +    case 316: { var v0 = stack.pop(); stack.push(java_lang_Character_toCharsACI(v0)); } // 184 1 109
   2.705 +    case 319: arg7 = stack.pop() // 58 7
   2.706 +    case 321: stack.push(arg7); // 25 7
   2.707 +    case 323: stack.push(stack.pop().length); // 190
   2.708 +    case 324: arg12 = stack.pop() // 54 12
   2.709 +    case 326: stack.push(arg12); // 21 12
   2.710 +    case 328: stack.push(arg10); // 21 10
   2.711 +    case 330: if (stack.pop() >= stack.pop()) { gt = 361; continue; } // 164 0 31
   2.712 +    case 333: stack.push(arg3); // 45
   2.713 +    case 334: stack.push(stack.pop().length); // 190
   2.714 +    case 335: stack.push(arg12); // 21 12
   2.715 +    case 337: stack.push(stack.pop() + stack.pop()); // 96
   2.716 +    case 338: stack.push(arg10); // 21 10
   2.717 +    case 340: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
   2.718 +    case 341: stack.push(new Array(stack.pop())); // 188 5
   2.719 +    case 343: arg13 = stack.pop() // 58 13
   2.720 +    case 345: stack.push(arg3); // 45
   2.721 +    case 346: stack.push(0); // 3
   2.722 +    case 347: stack.push(arg13); // 25 13
   2.723 +    case 349: stack.push(0); // 3
   2.724 +    case 350: stack.push(arg11); // 21 11
   2.725 +    case 352: stack.push(arg4); // 21 4
   2.726 +    case 354: stack.push(stack.pop() + stack.pop()); // 96
   2.727 +    case 355: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
   2.728 +    case 358: stack.push(arg13); // 25 13
   2.729 +    case 360: arg3 = stack.pop(); // 78
   2.730 +    case 361: stack.push(0); // 3
   2.731 +    case 362: arg13 = stack.pop() // 54 13
   2.732 +    case 364: stack.push(arg13); // 21 13
   2.733 +    case 366: stack.push(arg12); // 21 12
   2.734 +    case 368: if (stack.pop() <= stack.pop()) { gt = 392; continue; } // 162 0 24
   2.735 +    case 371: stack.push(arg3); // 45
   2.736 +    case 372: stack.push(arg11); // 21 11
   2.737 +    case 374: stack.push(arg4); // 21 4
   2.738 +    case 376: stack.push(stack.pop() + stack.pop()); // 96
   2.739 +    case 377: stack.push(arg13); // 21 13
   2.740 +    case 379: stack.push(stack.pop() + stack.pop()); // 96
   2.741 +    case 380: stack.push(arg7); // 25 7
   2.742 +    case 382: stack.push(arg13); // 21 13
   2.743 +    case 384: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.744 +    case 385: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
   2.745 +    case 386: arg13++; // 132 13 1
   2.746 +    case 389: gt = 364; continue; // 167 255 231
   2.747 +    case 392: stack.push(arg4); // 21 4
   2.748 +    case 394: stack.push(arg12); // 21 12
   2.749 +    case 396: stack.push(arg10); // 21 10
   2.750 +    case 398: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
   2.751 +    case 399: stack.push(stack.pop() + stack.pop()); // 96
   2.752 +    case 400: arg4 = stack.pop() // 54 4
   2.753 +    case 402: gt = 415; continue; // 167 0 13
   2.754 +    case 405: stack.push(arg3); // 45
   2.755 +    case 406: stack.push(arg11); // 21 11
   2.756 +    case 408: stack.push(arg4); // 21 4
   2.757 +    case 410: stack.push(stack.pop() + stack.pop()); // 96
   2.758 +    case 411: stack.push(arg8); // 21 8
   2.759 +    case 413: // number conversion  // 146
   2.760 +    case 414: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
   2.761 +    case 415: stack.push(arg11); // 21 11
   2.762 +    case 417: stack.push(arg10); // 21 10
   2.763 +    case 419: stack.push(stack.pop() + stack.pop()); // 96
   2.764 +    case 420: arg11 = stack.pop() // 54 11
   2.765 +    case 422: gt = 156; continue; // 167 254 246
   2.766 +    case 425: stack.push(new java_lang_String); // 187 0 200
   2.767 +    case 428: stack.push(stack[stack.length - 1]); // 89
   2.768 +    case 429: stack.push(0); // 3
   2.769 +    case 430: stack.push(arg0); // 42
   2.770 +    case 431: stack.push(stack.pop().count); // 180 1 97
   2.771 +    case 434: stack.push(arg4); // 21 4
   2.772 +    case 436: stack.push(stack.pop() + stack.pop()); // 96
   2.773 +    case 437: stack.push(arg3); // 45
   2.774 +    case 438: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
   2.775 +    case 441: return stack.pop(); // 176
   2.776 +  }
   2.777 +}
   2.778 +function java_lang_String_toUpperCaseLjava_lang_String(arg0) {
   2.779 +  var arg1;
   2.780 +;
   2.781 +  var stack = new Array(2);
   2.782 +  var gt = 0;
   2.783 +  for(;;) switch(gt) {
   2.784 +    case 0: stack.push(arg0); // 42
   2.785 +    case 1: { stack.push(java_util_Locale_getDefaultLjava_util_Locale()); } // 184 1 179
   2.786 +    case 4: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.toUpperCaseLjava_lang_StringLjava_util_Locale(self, v0)); } // 182 1 159
   2.787 +    case 7: return stack.pop(); // 176
   2.788 +  }
   2.789 +}
   2.790 +function java_lang_String_trimLjava_lang_String(arg0) {
   2.791 +  var arg1;
   2.792 +  var arg2;
   2.793 +  var arg3;
   2.794 +  var arg4;
   2.795 +  var arg5;
   2.796 +;
   2.797 +  var stack = new Array(3);
   2.798 +  var gt = 0;
   2.799 +  for(;;) switch(gt) {
   2.800 +    case 0: stack.push(arg0); // 42
   2.801 +    case 1: stack.push(stack.pop().count); // 180 1 97
   2.802 +    case 4: arg1 = stack.pop(); // 60
   2.803 +    case 5: stack.push(0); // 3
   2.804 +    case 6: arg2 = stack.pop(); // 61
   2.805 +    case 7: stack.push(arg0); // 42
   2.806 +    case 8: stack.push(stack.pop().offset); // 180 1 99
   2.807 +    case 11: arg3 = stack.pop(); // 62
   2.808 +    case 12: stack.push(arg0); // 42
   2.809 +    case 13: stack.push(stack.pop().value); // 180 1 100
   2.810 +    case 16: arg4 = stack.pop() // 58 4
   2.811 +    case 18: stack.push(arg2); // 28
   2.812 +    case 19: stack.push(arg1); // 27
   2.813 +    case 20: if (stack.pop() <= stack.pop()) { gt = 40; continue; } // 162 0 20
   2.814 +    case 23: stack.push(arg4); // 25 4
   2.815 +    case 25: stack.push(arg3); // 29
   2.816 +    case 26: stack.push(arg2); // 28
   2.817 +    case 27: stack.push(stack.pop() + stack.pop()); // 96
   2.818 +    case 28: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.819 +    case 29: stack.push(32); // 16 32
   2.820 +    case 31: if (stack.pop() < stack.pop()) { gt = 40; continue; } // 163 0 9
   2.821 +    case 34: arg2++; // 132 2 1
   2.822 +    case 37: gt = 18; continue; // 167 255 237
   2.823 +    case 40: stack.push(arg2); // 28
   2.824 +    case 41: stack.push(arg1); // 27
   2.825 +    case 42: if (stack.pop() <= stack.pop()) { gt = 64; continue; } // 162 0 22
   2.826 +    case 45: stack.push(arg4); // 25 4
   2.827 +    case 47: stack.push(arg3); // 29
   2.828 +    case 48: stack.push(arg1); // 27
   2.829 +    case 49: stack.push(stack.pop() + stack.pop()); // 96
   2.830 +    case 50: stack.push(1); // 4
   2.831 +    case 51: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
   2.832 +    case 52: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
   2.833 +    case 53: stack.push(32); // 16 32
   2.834 +    case 55: if (stack.pop() < stack.pop()) { gt = 64; continue; } // 163 0 9
   2.835 +    case 58: arg1 += 255; // 132 1 255
   2.836 +    case 61: gt = 40; continue; // 167 255 235
   2.837 +    case 64: stack.push(arg2); // 28
   2.838 +    case 65: if (stack.pop() > 0) { gt = 76; continue; } // 157 0 11
   2.839 +    case 68: stack.push(arg1); // 27
   2.840 +    case 69: stack.push(arg0); // 42
   2.841 +    case 70: stack.push(stack.pop().count); // 180 1 97
   2.842 +    case 73: if (stack.pop() <= stack.pop()) { gt = 85; continue; } // 162 0 12
   2.843 +    case 76: stack.push(arg0); // 42
   2.844 +    case 77: stack.push(arg2); // 28
   2.845 +    case 78: stack.push(arg1); // 27
   2.846 +    case 79: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.substringLjava_lang_StringII(self, v0, v1)); } // 182 1 147
   2.847 +    case 82: gt = 86; continue; // 167 0 4
   2.848 +    case 85: stack.push(arg0); // 42
   2.849 +    case 86: return stack.pop(); // 176
   2.850 +  }
   2.851 +}
   2.852 +*/
   2.853 +
   2.854 +/*
   2.855 +function java_lang_String_formatLjava_lang_StringLjava_lang_StringLjava_lang_Object(arg0,arg1) {
   2.856 +  var stack = new Array();
   2.857 +  var gt = 0;
   2.858 +  for(;;) switch(gt) {
   2.859 +    case 0: stack.push(new java_util_Formatter); // 187 0 211
   2.860 +    case 3: stack.push(stack[stack.length - 1]); // 89
   2.861 +    case 4: { java_util_Formatter_consV(stack.pop()); } // 183 1 174
   2.862 +    case 7: stack.push(arg0); // 42
   2.863 +    case 8: stack.push(arg1); // 43
   2.864 +    case 9: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.formatALjava_util_FormatterLjava_lang_StringALjava_lang_Object(self, v0, v1)); } // 182 1 177
   2.865 +    case 12: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 175
   2.866 +    case 15: return stack.pop(); // 176
   2.867 +  }
   2.868 +}
   2.869 +function java_lang_String_formatLjava_lang_StringLjava_util_LocaleLjava_lang_StringLjava_lang_Object(arg0,arg1,arg2) {
   2.870 +  var stack = new Array();
   2.871 +  var gt = 0;
   2.872 +  for(;;) switch(gt) {
   2.873 +    case 0: stack.push(new java_util_Formatter); // 187 0 211
   2.874 +    case 3: stack.push(stack[stack.length - 1]); // 89
   2.875 +    case 4: stack.push(arg0); // 42
   2.876 +    case 5: { var v0 = stack.pop(); java_util_Formatter_consVLjava_util_Locale(stack.pop(), v0); } // 183 1 176
   2.877 +    case 8: stack.push(arg1); // 43
   2.878 +    case 9: stack.push(arg2); // 44
   2.879 +    case 10: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.formatALjava_util_FormatterLjava_lang_StringALjava_lang_Object(self, v0, v1)); } // 182 1 177
   2.880 +    case 13: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 175
   2.881 +    case 16: return stack.pop(); // 176
   2.882 +  }
   2.883 +}
   2.884 +function java_lang_String_valueOfLjava_lang_StringLjava_lang_Object(arg0) {
   2.885 +  var stack = new Array();
   2.886 +  var gt = 0;
   2.887 +  for(;;) switch(gt) {
   2.888 +    case 0: stack.push(arg0); // 42
   2.889 +    case 1: if (stack.pop()) { gt = 9; continue; } // 199 0 8
   2.890 +    case 4: stack.push("null"); // 18 10
   2.891 +    case 6: gt = 13; continue; // 167 0 7
   2.892 +    case 9: stack.push(arg0); // 42
   2.893 +    case 10: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 132
   2.894 +    case 13: return stack.pop(); // 176
   2.895 +  }
   2.896 +}
   2.897 +function java_lang_String_valueOfLjava_lang_StringAC(arg0) {
   2.898 +  var stack = new Array();
   2.899 +  var gt = 0;
   2.900 +  for(;;) switch(gt) {
   2.901 +    case 0: stack.push(new java_lang_String); // 187 0 200
   2.902 +    case 3: stack.push(stack[stack.length - 1]); // 89
   2.903 +    case 4: stack.push(arg0); // 42
   2.904 +    case 5: { var v0 = stack.pop(); java_lang_String_consVAC(stack.pop(), v0); } // 183 1 142
   2.905 +    case 8: return stack.pop(); // 176
   2.906 +  }
   2.907 +}
   2.908 +function java_lang_String_valueOfLjava_lang_StringACII(arg0,arg1,arg2) {
   2.909 +  var stack = new Array();
   2.910 +  var gt = 0;
   2.911 +  for(;;) switch(gt) {
   2.912 +    case 0: stack.push(new java_lang_String); // 187 0 200
   2.913 +    case 3: stack.push(stack[stack.length - 1]); // 89
   2.914 +    case 4: stack.push(arg0); // 42
   2.915 +    case 5: stack.push(arg1); // 27
   2.916 +    case 6: stack.push(arg2); // 28
   2.917 +    case 7: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVACAIAI(stack.pop(), v0, v1, v2); } // 183 1 143
   2.918 +    case 10: return stack.pop(); // 176
   2.919 +  }
   2.920 +}
   2.921 +function java_lang_String_copyValueOfLjava_lang_StringACII(arg0,arg1,arg2) {
   2.922 +  var stack = new Array();
   2.923 +  var gt = 0;
   2.924 +  for(;;) switch(gt) {
   2.925 +    case 0: stack.push(new java_lang_String); // 187 0 200
   2.926 +    case 3: stack.push(stack[stack.length - 1]); // 89
   2.927 +    case 4: stack.push(arg0); // 42
   2.928 +    case 5: stack.push(arg1); // 27
   2.929 +    case 6: stack.push(arg2); // 28
   2.930 +    case 7: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVACAIAI(stack.pop(), v0, v1, v2); } // 183 1 143
   2.931 +    case 10: return stack.pop(); // 176
   2.932 +  }
   2.933 +}
   2.934 +function java_lang_String_copyValueOfLjava_lang_StringAC(arg0) {
   2.935 +  var stack = new Array();
   2.936 +  var gt = 0;
   2.937 +  for(;;) switch(gt) {
   2.938 +    case 0: stack.push(arg0); // 42
   2.939 +    case 1: stack.push(0); // 3
   2.940 +    case 2: stack.push(arg0); // 42
   2.941 +    case 3: stack.push(stack.pop().length); // 190
   2.942 +    case 4: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_String_copyValueOfALjava_lang_StringACAIAI(v0, v1, v2)); } // 184 1 155
   2.943 +    case 7: return stack.pop(); // 176
   2.944 +  }
   2.945 +}
   2.946 +function java_lang_String_valueOfLjava_lang_StringZ(arg0) {
   2.947 +  var stack = new Array();
   2.948 +  var gt = 0;
   2.949 +  for(;;) switch(gt) {
   2.950 +    case 0: stack.push(arg0); // 26
   2.951 +    case 1: if (stack.pop() == 0) { gt = 9; continue; } // 153 0 8
   2.952 +    case 4: stack.push("true"); // 18 12
   2.953 +    case 6: gt = 11; continue; // 167 0 5
   2.954 +    case 9: stack.push("false"); // 18 8
   2.955 +    case 11: return stack.pop(); // 176
   2.956 +  }
   2.957 +}
   2.958 +function java_lang_String_valueOfLjava_lang_StringC(arg0) {
   2.959 +  var arg1;
   2.960 +  var stack = new Array();
   2.961 +  var gt = 0;
   2.962 +  for(;;) switch(gt) {
   2.963 +    case 0: stack.push(1); // 4
   2.964 +    case 1: stack.push(new Array(stack.pop())); // 188 5
   2.965 +    case 3: stack.push(stack[stack.length - 1]); // 89
   2.966 +    case 4: stack.push(0); // 3
   2.967 +    case 5: stack.push(arg0); // 26
   2.968 +    case 6: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
   2.969 +    case 7: arg1 = stack.pop(); // 76
   2.970 +    case 8: stack.push(new java_lang_String); // 187 0 200
   2.971 +    case 11: stack.push(stack[stack.length - 1]); // 89
   2.972 +    case 12: stack.push(0); // 3
   2.973 +    case 13: stack.push(1); // 4
   2.974 +    case 14: stack.push(arg1); // 43
   2.975 +    case 15: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
   2.976 +    case 18: return stack.pop(); // 176
   2.977 +  }
   2.978 +}
   2.979 +function java_lang_String_valueOfLjava_lang_StringJ(arg0) {
   2.980 +  var arg1;
   2.981 +  var stack = new Array();
   2.982 +  var gt = 0;
   2.983 +  for(;;) switch(gt) {
   2.984 +    case 0: stack.push(arg0); // 30
   2.985 +    case 1: stack.push(10); // 16 10
   2.986 +    case 3: { var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_Long_toStringLjava_lang_StringJI(v0, v1)); } // 184 1 126
   2.987 +    case 6: return stack.pop(); // 176
   2.988 +  }
   2.989 +}
   2.990 +function java_lang_String_valueOfLjava_lang_StringF(arg0) {
   2.991 +  var stack = new Array();
   2.992 +  var gt = 0;
   2.993 +  for(;;) switch(gt) {
   2.994 +    case 0: stack.push(arg0); // 34
   2.995 +    case 1: { var v0 = stack.pop(); stack.push(java_lang_Float_toStringLjava_lang_StringF(v0)); } // 184 1 122
   2.996 +    case 4: return stack.pop(); // 176
   2.997 +  }
   2.998 +}
   2.999 +function java_lang_String_valueOfLjava_lang_StringD(arg0) {
  2.1000 +  var arg1;
  2.1001 +  var stack = new Array();
  2.1002 +  var gt = 0;
  2.1003 +  for(;;) switch(gt) {
  2.1004 +    case 0: stack.push(arg0); // 38
  2.1005 +    case 1: { var v0 = stack.pop(); stack.push(java_lang_Double_toStringLjava_lang_StringD(v0)); } // 184 1 121
  2.1006 +    case 4: return stack.pop(); // 176
  2.1007 +  }
  2.1008 +}
  2.1009 +function java_lang_String_internLjava_lang_String(arg0) {
  2.1010 +  // no code found for null 
  2.1011 +}
  2.1012 +function java_lang_String_compareToILjava_lang_Object(arg0,arg1) {
  2.1013 +  var arg2;
  2.1014 +;
  2.1015 +  var stack = new Array(2);
  2.1016 +  var gt = 0;
  2.1017 +  for(;;) switch(gt) {
  2.1018 +    case 0: stack.push(arg0); // 42
  2.1019 +    case 1: stack.push(arg1); // 43
  2.1020 +    case 2: if(stack[stack.length - 1].$instOf_java_lang_String != 1) throw {}; // 192 0 200
  2.1021 +    case 5: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.compareToILjava_lang_String(self, v0)); } // 182 1 148
  2.1022 +    case 8: return stack.pop(); // 172
  2.1023 +  }
  2.1024 +}
  2.1025 +function java_lang_String_classV() {
  2.1026 +  var stack = new Array();
  2.1027 +  var gt = 0;
  2.1028 +  for(;;) switch(gt) {
  2.1029 +    case 0: stack.push(0); // 3
  2.1030 +    case 1: stack.push(new Array(stack.pop())); // 189 0 183
  2.1031 +    case 4: java_lang_String_serialPersistentFields = stack.pop(); // 179 1 101
  2.1032 +    case 7: stack.push(new java_lang_String$CaseInsensitiveComparator); // 187 0 202
  2.1033 +    case 10: stack.push(stack[stack.length - 1]); // 89
  2.1034 +    case 11:  // 1
  2.1035 +    case 12: { var v0 = stack.pop(); java_lang_String$CaseInsensitiveComparator_consVLjava_lang_String$1(stack.pop(), v0); } // 183 1 160
  2.1036 +    case 15: java_lang_String_CASE_INSENSITIVE_ORDER = stack.pop(); // 179 1 102
  2.1037 +    case 18: return; // 177
  2.1038 +  }
  2.1039 +}
  2.1040 +*/
  2.1041 +
  2.1042  /*
  2.1043  function java_lang_String_contentEqualsZLjava_lang_StringBuffer(arg0,arg1) {
  2.1044    var arg2;
  2.1045 @@ -1255,1010 +2284,6 @@
  2.1046    }
  2.1047  }
  2.1048  */
  2.1049 -function java_lang_String_substringLjava_lang_StringI(arg0,arg1) {
  2.1050 -    return arg0.toString().substring(arg1);
  2.1051 -}
  2.1052 -function java_lang_String_substringLjava_lang_StringII(arg0,arg1,arg2) {
  2.1053 -    return arg0.toString().substring(arg1, arg2);
  2.1054 -}
  2.1055 -
  2.1056 -function java_lang_String_replaceLjava_lang_StringCC(arg0,arg1,arg2) {
  2.1057 -    if (typeof arg1 === 'number') arg1 = String.fromCharCode(arg1);
  2.1058 -    if (typeof arg2 === 'number') arg2 = String.fromCharCode(arg2);
  2.1059 -    var s = arg0.toString();
  2.1060 -    for (;;) {
  2.1061 -        var ret = s.replace(arg1, arg2);
  2.1062 -        if (ret === s) {
  2.1063 -            return ret;
  2.1064 -        }
  2.1065 -        s = ret;
  2.1066 -    }
  2.1067 -}
  2.1068 -function java_lang_String_containsZLjava_lang_CharSequence(arg0,arg1) {
  2.1069 -    return arg0.toString().indexOf(arg1.toString()) >= 0;
  2.1070 -}
  2.1071 -
  2.1072 -/*
  2.1073 -function java_lang_String_subSequenceLjava_lang_CharSequenceII(arg0,arg1,arg2) {
  2.1074 -  var arg3;
  2.1075 -;
  2.1076 -  var stack = new Array(3);
  2.1077 -  var gt = 0;
  2.1078 -  for(;;) switch(gt) {
  2.1079 -    case 0: stack.push(arg0); // 42
  2.1080 -    case 1: stack.push(arg1); // 27
  2.1081 -    case 2: stack.push(arg2); // 28
  2.1082 -    case 3: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.substringLjava_lang_StringII(self, v0, v1)); } // 182 1 147
  2.1083 -    case 6: return stack.pop(); // 176
  2.1084 -  }
  2.1085 -}
  2.1086 -function java_lang_String_concatLjava_lang_StringLjava_lang_String(arg0,arg1) {
  2.1087 -  var arg2;
  2.1088 -  var arg3;
  2.1089 -  var arg4;
  2.1090 -;
  2.1091 -  var stack = new Array(5);
  2.1092 -  var gt = 0;
  2.1093 -  for(;;) switch(gt) {
  2.1094 -    case 0: stack.push(arg1); // 43
  2.1095 -    case 1: { var self = stack.pop(); stack.push(self.lengthI(self)); } // 182 1 133
  2.1096 -    case 4: arg2 = stack.pop(); // 61
  2.1097 -    case 5: stack.push(arg2); // 28
  2.1098 -    case 6: if (stack.pop() != 0) { gt = 11; continue; } // 154 0 5
  2.1099 -    case 9: stack.push(arg0); // 42
  2.1100 -    case 10: return stack.pop(); // 176
  2.1101 -    case 11: stack.push(arg0); // 42
  2.1102 -    case 12: stack.push(stack.pop().count); // 180 1 97
  2.1103 -    case 15: stack.push(arg2); // 28
  2.1104 -    case 16: stack.push(stack.pop() + stack.pop()); // 96
  2.1105 -    case 17: stack.push(new Array(stack.pop())); // 188 5
  2.1106 -    case 19: arg3 = stack.pop(); // 78
  2.1107 -    case 20: stack.push(arg0); // 42
  2.1108 -    case 21: stack.push(0); // 3
  2.1109 -    case 22: stack.push(arg0); // 42
  2.1110 -    case 23: stack.push(stack.pop().count); // 180 1 97
  2.1111 -    case 26: stack.push(arg3); // 45
  2.1112 -    case 27: stack.push(0); // 3
  2.1113 -    case 28: { var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); self.getCharsVIIACAI(self, v0, v1, v2, v3); } // 182 1 138
  2.1114 -    case 31: stack.push(arg1); // 43
  2.1115 -    case 32: stack.push(0); // 3
  2.1116 -    case 33: stack.push(arg2); // 28
  2.1117 -    case 34: stack.push(arg3); // 45
  2.1118 -    case 35: stack.push(arg0); // 42
  2.1119 -    case 36: stack.push(stack.pop().count); // 180 1 97
  2.1120 -    case 39: { var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); self.getCharsVIIACAI(self, v0, v1, v2, v3); } // 182 1 138
  2.1121 -    case 42: stack.push(new java_lang_String); // 187 0 200
  2.1122 -    case 45: stack.push(stack[stack.length - 1]); // 89
  2.1123 -    case 46: stack.push(0); // 3
  2.1124 -    case 47: stack.push(arg0); // 42
  2.1125 -    case 48: stack.push(stack.pop().count); // 180 1 97
  2.1126 -    case 51: stack.push(arg2); // 28
  2.1127 -    case 52: stack.push(stack.pop() + stack.pop()); // 96
  2.1128 -    case 53: stack.push(arg3); // 45
  2.1129 -    case 54: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
  2.1130 -    case 57: return stack.pop(); // 176
  2.1131 -  }
  2.1132 -}
  2.1133 -function java_lang_String_matchesZLjava_lang_String(arg0,arg1) {
  2.1134 -  var arg2;
  2.1135 -;
  2.1136 -  var stack = new Array(2);
  2.1137 -  var gt = 0;
  2.1138 -  for(;;) switch(gt) {
  2.1139 -    case 0: stack.push(arg1); // 43
  2.1140 -    case 1: stack.push(arg0); // 42
  2.1141 -    case 2: { var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_util_regex_Pattern_matchesZLjava_lang_StringLjava_lang_CharSequence(v0, v1)); } // 184 1 183
  2.1142 -    case 5: return stack.pop(); // 172
  2.1143 -  }
  2.1144 -}
  2.1145 -function java_lang_String_replaceFirstLjava_lang_StringLjava_lang_StringLjava_lang_String(arg0,arg1,arg2) {
  2.1146 -  var arg3;
  2.1147 -;
  2.1148 -  var stack = new Array(2);
  2.1149 -  var gt = 0;
  2.1150 -  for(;;) switch(gt) {
  2.1151 -    case 0: stack.push(arg1); // 43
  2.1152 -    case 1: { var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_String(v0)); } // 184 1 186
  2.1153 -    case 4: stack.push(arg0); // 42
  2.1154 -    case 5: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.matcherLjava_util_regex_MatcherLjava_lang_CharSequence(self, v0)); } // 182 1 185
  2.1155 -    case 8: stack.push(arg2); // 44
  2.1156 -    case 9: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.replaceFirstLjava_lang_StringLjava_lang_String(self, v0)); } // 182 1 182
  2.1157 -    case 12: return stack.pop(); // 176
  2.1158 -  }
  2.1159 -}
  2.1160 -function java_lang_String_replaceAllLjava_lang_StringLjava_lang_StringLjava_lang_String(arg0,arg1,arg2) {
  2.1161 -  var arg3;
  2.1162 -;
  2.1163 -  var stack = new Array(2);
  2.1164 -  var gt = 0;
  2.1165 -  for(;;) switch(gt) {
  2.1166 -    case 0: stack.push(arg1); // 43
  2.1167 -    case 1: { var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_String(v0)); } // 184 1 186
  2.1168 -    case 4: stack.push(arg0); // 42
  2.1169 -    case 5: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.matcherLjava_util_regex_MatcherLjava_lang_CharSequence(self, v0)); } // 182 1 185
  2.1170 -    case 8: stack.push(arg2); // 44
  2.1171 -    case 9: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.replaceAllLjava_lang_StringLjava_lang_String(self, v0)); } // 182 1 181
  2.1172 -    case 12: return stack.pop(); // 176
  2.1173 -  }
  2.1174 -}
  2.1175 -function java_lang_String_replaceLjava_lang_StringLjava_lang_CharSequenceLjava_lang_CharSequence(arg0,arg1,arg2) {
  2.1176 -  var arg3;
  2.1177 -;
  2.1178 -  var stack = new Array(2);
  2.1179 -  var gt = 0;
  2.1180 -  for(;;) switch(gt) {
  2.1181 -    case 0: stack.push(arg1); // 43
  2.1182 -    case 1: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 132
  2.1183 -    case 4: stack.push(16); // 16 16
  2.1184 -    case 6: { var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_StringI(v0, v1)); } // 184 1 187
  2.1185 -    case 9: stack.push(arg0); // 42
  2.1186 -    case 10: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.matcherLjava_util_regex_MatcherLjava_lang_CharSequence(self, v0)); } // 182 1 185
  2.1187 -    case 13: stack.push(arg2); // 44
  2.1188 -    case 14: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 132
  2.1189 -    case 17: { var v0 = stack.pop(); stack.push(java_util_regex_Matcher_quoteReplacementLjava_lang_StringLjava_lang_String(v0)); } // 184 1 180
  2.1190 -    case 20: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.replaceAllLjava_lang_StringLjava_lang_String(self, v0)); } // 182 1 181
  2.1191 -    case 23: return stack.pop(); // 176
  2.1192 -  }
  2.1193 -}
  2.1194 -function java_lang_String_splitALjava_lang_StringLjava_lang_StringI(arg0,arg1,arg2) {
  2.1195 -  var arg3;
  2.1196 -;
  2.1197 -  var stack = new Array(3);
  2.1198 -  var gt = 0;
  2.1199 -  for(;;) switch(gt) {
  2.1200 -    case 0: stack.push(arg1); // 43
  2.1201 -    case 1: { var v0 = stack.pop(); stack.push(java_util_regex_Pattern_compileLjava_util_regex_PatternLjava_lang_String(v0)); } // 184 1 186
  2.1202 -    case 4: stack.push(arg0); // 42
  2.1203 -    case 5: stack.push(arg2); // 28
  2.1204 -    case 6: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.splitALjava_lang_StringLjava_lang_CharSequenceI(self, v0, v1)); } // 182 1 184
  2.1205 -    case 9: return stack.pop(); // 176
  2.1206 -  }
  2.1207 -}
  2.1208 -function java_lang_String_splitALjava_lang_StringLjava_lang_String(arg0,arg1) {
  2.1209 -  var arg2;
  2.1210 -;
  2.1211 -  var stack = new Array(3);
  2.1212 -  var gt = 0;
  2.1213 -  for(;;) switch(gt) {
  2.1214 -    case 0: stack.push(arg0); // 42
  2.1215 -    case 1: stack.push(arg1); // 43
  2.1216 -    case 2: stack.push(0); // 3
  2.1217 -    case 3: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.splitALjava_lang_StringLjava_lang_StringI(self, v0, v1)); } // 182 1 157
  2.1218 -    case 6: return stack.pop(); // 176
  2.1219 -  }
  2.1220 -}
  2.1221 -function java_lang_String_toLowerCaseLjava_lang_StringLjava_util_Locale(arg0,arg1) {
  2.1222 -  var arg2;
  2.1223 -  var arg3;
  2.1224 -  var arg4;
  2.1225 -  var arg5;
  2.1226 -  var arg6;
  2.1227 -  var arg7;
  2.1228 -  var arg8;
  2.1229 -  var arg9;
  2.1230 -  var arg10;
  2.1231 -  var arg11;
  2.1232 -  var arg12;
  2.1233 -  var arg13;
  2.1234 -  var arg14;
  2.1235 -;
  2.1236 -  var stack = new Array(6);
  2.1237 -  var gt = 0;
  2.1238 -  for(;;) switch(gt) {
  2.1239 -    case 0: stack.push(arg1); // 43
  2.1240 -    case 1: if (stack.pop()) { gt = 12; continue; } // 199 0 11
  2.1241 -    case 4: stack.push(new java_lang_NullPointerException); // 187 0 198
  2.1242 -    case 7: stack.push(stack[stack.length - 1]); // 89
  2.1243 -    case 8: { java_lang_NullPointerException_consV(stack.pop()); } // 183 1 128
  2.1244 -    case 11:  // 191
  2.1245 -    case 12: stack.push(0); // 3
  2.1246 -    case 13: arg2 = stack.pop(); // 61
  2.1247 -    case 14: stack.push(arg2); // 28
  2.1248 -    case 15: stack.push(arg0); // 42
  2.1249 -    case 16: stack.push(stack.pop().count); // 180 1 97
  2.1250 -    case 19: if (stack.pop() <= stack.pop()) { gt = 94; continue; } // 162 0 75
  2.1251 -    case 22: stack.push(arg0); // 42
  2.1252 -    case 23: stack.push(stack.pop().value); // 180 1 100
  2.1253 -    case 26: stack.push(arg0); // 42
  2.1254 -    case 27: stack.push(stack.pop().offset); // 180 1 99
  2.1255 -    case 30: stack.push(arg2); // 28
  2.1256 -    case 31: stack.push(stack.pop() + stack.pop()); // 96
  2.1257 -    case 32: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1258 -    case 33: arg3 = stack.pop(); // 62
  2.1259 -    case 34: stack.push(arg3); // 29
  2.1260 -    case 35: stack.push(55296); // 18 1
  2.1261 -    case 37: if (stack.pop() > stack.pop()) { gt = 77; continue; } // 161 0 40
  2.1262 -    case 40: stack.push(arg3); // 29
  2.1263 -    case 41: stack.push(56319); // 18 2
  2.1264 -    case 43: if (stack.pop() < stack.pop()) { gt = 77; continue; } // 163 0 34
  2.1265 -    case 46: stack.push(arg0); // 42
  2.1266 -    case 47: stack.push(arg2); // 28
  2.1267 -    case 48: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
  2.1268 -    case 51: arg4 = stack.pop() // 54 4
  2.1269 -    case 53: stack.push(arg4); // 21 4
  2.1270 -    case 55: stack.push(arg4); // 21 4
  2.1271 -    case 57: { var v0 = stack.pop(); stack.push(java_lang_Character_toLowerCaseII(v0)); } // 184 1 107
  2.1272 -    case 60: if (stack.pop() == stack.pop()) { gt = 66; continue; } // 159 0 6
  2.1273 -    case 63: gt = 96; continue; // 167 0 33
  2.1274 -    case 66: stack.push(arg2); // 28
  2.1275 -    case 67: stack.push(arg4); // 21 4
  2.1276 -    case 69: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
  2.1277 -    case 72: stack.push(stack.pop() + stack.pop()); // 96
  2.1278 -    case 73: arg2 = stack.pop(); // 61
  2.1279 -    case 74: gt = 91; continue; // 167 0 17
  2.1280 -    case 77: stack.push(arg3); // 29
  2.1281 -    case 78: stack.push(arg3); // 29
  2.1282 -    case 79: { var v0 = stack.pop(); stack.push(java_lang_Character_toLowerCaseCC(v0)); } // 184 1 104
  2.1283 -    case 82: if (stack.pop() == stack.pop()) { gt = 88; continue; } // 159 0 6
  2.1284 -    case 85: gt = 96; continue; // 167 0 11
  2.1285 -    case 88: arg2++; // 132 2 1
  2.1286 -    case 91: gt = 14; continue; // 167 255 179
  2.1287 -    case 94: stack.push(arg0); // 42
  2.1288 -    case 95: return stack.pop(); // 176
  2.1289 -    case 96: stack.push(arg0); // 42
  2.1290 -    case 97: stack.push(stack.pop().count); // 180 1 97
  2.1291 -    case 100: stack.push(new Array(stack.pop())); // 188 5
  2.1292 -    case 102: arg3 = stack.pop(); // 78
  2.1293 -    case 103: stack.push(0); // 3
  2.1294 -    case 104: arg4 = stack.pop() // 54 4
  2.1295 -    case 106: stack.push(arg0); // 42
  2.1296 -    case 107: stack.push(stack.pop().value); // 180 1 100
  2.1297 -    case 110: stack.push(arg0); // 42
  2.1298 -    case 111: stack.push(stack.pop().offset); // 180 1 99
  2.1299 -    case 114: stack.push(arg3); // 45
  2.1300 -    case 115: stack.push(0); // 3
  2.1301 -    case 116: stack.push(arg2); // 28
  2.1302 -    case 117: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
  2.1303 -    case 120: stack.push(arg1); // 43
  2.1304 -    case 121: { var self = stack.pop(); stack.push(self.getLanguageLjava_lang_String(self)); } // 182 1 178
  2.1305 -    case 124: arg5 = stack.pop() // 58 5
  2.1306 -    case 126: stack.push(arg5); // 25 5
  2.1307 -    case 128: stack.push("tr"); // 18 11
  2.1308 -    case 130:  // 165
  2.1309 -    case 131:  // 0
  2.1310 -    case 132: stack.push(6405); // 17 25 5
  2.1311 -    case 135: stack.push("az"); // 18 5
  2.1312 -    case 137:  // 165
  2.1313 -    case 138:  // 0
  2.1314 -    case 139: stack.push(1); // 10
  2.1315 -    case 140: stack.push(arg5); // 25 5
  2.1316 -    case 142: stack.push("lt"); // 18 9
  2.1317 -    case 144:  // 166
  2.1318 -    case 145:  // 0
  2.1319 -    case 146: stack.push(4); // 7
  2.1320 -    case 147: stack.push(1); // 4
  2.1321 -    case 148: gt = 152; continue; // 167 0 4
  2.1322 -    case 151: stack.push(0); // 3
  2.1323 -    case 152: arg6 = stack.pop() // 54 6
  2.1324 -    case 154: stack.push(arg2); // 28
  2.1325 -    case 155: arg11 = stack.pop() // 54 11
  2.1326 -    case 157: stack.push(arg11); // 21 11
  2.1327 -    case 159: stack.push(arg0); // 42
  2.1328 -    case 160: stack.push(stack.pop().count); // 180 1 97
  2.1329 -    case 163: if (stack.pop() <= stack.pop()) { gt = 419; continue; } // 162 1 0
  2.1330 -    case 166: stack.push(arg0); // 42
  2.1331 -    case 167: stack.push(stack.pop().value); // 180 1 100
  2.1332 -    case 170: stack.push(arg0); // 42
  2.1333 -    case 171: stack.push(stack.pop().offset); // 180 1 99
  2.1334 -    case 174: stack.push(arg11); // 21 11
  2.1335 -    case 176: stack.push(stack.pop() + stack.pop()); // 96
  2.1336 -    case 177: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1337 -    case 178: arg9 = stack.pop() // 54 9
  2.1338 -    case 180: stack.push(arg9); // 21 9
  2.1339 -    case 182: // number conversion  // 146
  2.1340 -    case 183: stack.push(55296); // 18 1
  2.1341 -    case 185: if (stack.pop() > stack.pop()) { gt = 214; continue; } // 161 0 29
  2.1342 -    case 188: stack.push(arg9); // 21 9
  2.1343 -    case 190: // number conversion  // 146
  2.1344 -    case 191: stack.push(56319); // 18 2
  2.1345 -    case 193: if (stack.pop() < stack.pop()) { gt = 214; continue; } // 163 0 21
  2.1346 -    case 196: stack.push(arg0); // 42
  2.1347 -    case 197: stack.push(arg11); // 21 11
  2.1348 -    case 199: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
  2.1349 -    case 202: arg9 = stack.pop() // 54 9
  2.1350 -    case 204: stack.push(arg9); // 21 9
  2.1351 -    case 206: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
  2.1352 -    case 209: arg10 = stack.pop() // 54 10
  2.1353 -    case 211: gt = 217; continue; // 167 0 6
  2.1354 -    case 214: stack.push(1); // 4
  2.1355 -    case 215: arg10 = stack.pop() // 54 10
  2.1356 -    case 217: stack.push(arg6); // 21 6
  2.1357 -    case 219: if (stack.pop() != 0) { gt = 230; continue; } // 154 0 11
  2.1358 -    case 222: stack.push(arg9); // 21 9
  2.1359 -    case 224: stack.push(931); // 17 3 163
  2.1360 -    case 227: if (stack.pop() != stack.pop()) { gt = 242; continue; } // 160 0 15
  2.1361 -    case 230: stack.push(arg0); // 42
  2.1362 -    case 231: stack.push(arg11); // 21 11
  2.1363 -    case 233: stack.push(arg1); // 43
  2.1364 -    case 234: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toLowerCaseExILjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 117
  2.1365 -    case 237: arg8 = stack.pop() // 54 8
  2.1366 -    case 239: gt = 249; continue; // 167 0 10
  2.1367 -    case 242: stack.push(arg9); // 21 9
  2.1368 -    case 244: { var v0 = stack.pop(); stack.push(java_lang_Character_toLowerCaseII(v0)); } // 184 1 107
  2.1369 -    case 247: arg8 = stack.pop() // 54 8
  2.1370 -    case 249: stack.push(arg8); // 21 8
  2.1371 -    case 251:  // 2
  2.1372 -    case 252: if (stack.pop() == stack.pop()) { gt = 262; continue; } // 159 0 10
  2.1373 -    case 255: stack.push(arg8); // 21 8
  2.1374 -    case 257: stack.push(65536); // 18 3
  2.1375 -    case 259: if (stack.pop() > stack.pop()) { gt = 399; continue; } // 161 0 140
  2.1376 -    case 262: stack.push(arg8); // 21 8
  2.1377 -    case 264:  // 2
  2.1378 -    case 265: if (stack.pop() != stack.pop()) { gt = 280; continue; } // 160 0 15
  2.1379 -    case 268: stack.push(arg0); // 42
  2.1380 -    case 269: stack.push(arg11); // 21 11
  2.1381 -    case 271: stack.push(arg1); // 43
  2.1382 -    case 272: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toLowerCaseCharArrayACLjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 119
  2.1383 -    case 275: arg7 = stack.pop() // 58 7
  2.1384 -    case 277: gt = 315; continue; // 167 0 38
  2.1385 -    case 280: stack.push(arg10); // 21 10
  2.1386 -    case 282: stack.push(2); // 5
  2.1387 -    case 283: if (stack.pop() != stack.pop()) { gt = 308; continue; } // 160 0 25
  2.1388 -    case 286: stack.push(arg4); // 21 4
  2.1389 -    case 288: stack.push(arg8); // 21 8
  2.1390 -    case 290: stack.push(arg3); // 45
  2.1391 -    case 291: stack.push(arg11); // 21 11
  2.1392 -    case 293: stack.push(arg4); // 21 4
  2.1393 -    case 295: stack.push(stack.pop() + stack.pop()); // 96
  2.1394 -    case 296: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_Character_toCharsAIIACAI(v0, v1, v2)); } // 184 1 111
  2.1395 -    case 299: stack.push(arg10); // 21 10
  2.1396 -    case 301: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
  2.1397 -    case 302: stack.push(stack.pop() + stack.pop()); // 96
  2.1398 -    case 303: arg4 = stack.pop() // 54 4
  2.1399 -    case 305: gt = 409; continue; // 167 0 104
  2.1400 -    case 308: stack.push(arg8); // 21 8
  2.1401 -    case 310: { var v0 = stack.pop(); stack.push(java_lang_Character_toCharsACI(v0)); } // 184 1 109
  2.1402 -    case 313: arg7 = stack.pop() // 58 7
  2.1403 -    case 315: stack.push(arg7); // 25 7
  2.1404 -    case 317: stack.push(stack.pop().length); // 190
  2.1405 -    case 318: arg12 = stack.pop() // 54 12
  2.1406 -    case 320: stack.push(arg12); // 21 12
  2.1407 -    case 322: stack.push(arg10); // 21 10
  2.1408 -    case 324: if (stack.pop() >= stack.pop()) { gt = 355; continue; } // 164 0 31
  2.1409 -    case 327: stack.push(arg3); // 45
  2.1410 -    case 328: stack.push(stack.pop().length); // 190
  2.1411 -    case 329: stack.push(arg12); // 21 12
  2.1412 -    case 331: stack.push(stack.pop() + stack.pop()); // 96
  2.1413 -    case 332: stack.push(arg10); // 21 10
  2.1414 -    case 334: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
  2.1415 -    case 335: stack.push(new Array(stack.pop())); // 188 5
  2.1416 -    case 337: arg13 = stack.pop() // 58 13
  2.1417 -    case 339: stack.push(arg3); // 45
  2.1418 -    case 340: stack.push(0); // 3
  2.1419 -    case 341: stack.push(arg13); // 25 13
  2.1420 -    case 343: stack.push(0); // 3
  2.1421 -    case 344: stack.push(arg11); // 21 11
  2.1422 -    case 346: stack.push(arg4); // 21 4
  2.1423 -    case 348: stack.push(stack.pop() + stack.pop()); // 96
  2.1424 -    case 349: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
  2.1425 -    case 352: stack.push(arg13); // 25 13
  2.1426 -    case 354: arg3 = stack.pop(); // 78
  2.1427 -    case 355: stack.push(0); // 3
  2.1428 -    case 356: arg13 = stack.pop() // 54 13
  2.1429 -    case 358: stack.push(arg13); // 21 13
  2.1430 -    case 360: stack.push(arg12); // 21 12
  2.1431 -    case 362: if (stack.pop() <= stack.pop()) { gt = 386; continue; } // 162 0 24
  2.1432 -    case 365: stack.push(arg3); // 45
  2.1433 -    case 366: stack.push(arg11); // 21 11
  2.1434 -    case 368: stack.push(arg4); // 21 4
  2.1435 -    case 370: stack.push(stack.pop() + stack.pop()); // 96
  2.1436 -    case 371: stack.push(arg13); // 21 13
  2.1437 -    case 373: stack.push(stack.pop() + stack.pop()); // 96
  2.1438 -    case 374: stack.push(arg7); // 25 7
  2.1439 -    case 376: stack.push(arg13); // 21 13
  2.1440 -    case 378: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1441 -    case 379: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
  2.1442 -    case 380: arg13++; // 132 13 1
  2.1443 -    case 383: gt = 358; continue; // 167 255 231
  2.1444 -    case 386: stack.push(arg4); // 21 4
  2.1445 -    case 388: stack.push(arg12); // 21 12
  2.1446 -    case 390: stack.push(arg10); // 21 10
  2.1447 -    case 392: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
  2.1448 -    case 393: stack.push(stack.pop() + stack.pop()); // 96
  2.1449 -    case 394: arg4 = stack.pop() // 54 4
  2.1450 -    case 396: gt = 409; continue; // 167 0 13
  2.1451 -    case 399: stack.push(arg3); // 45
  2.1452 -    case 400: stack.push(arg11); // 21 11
  2.1453 -    case 402: stack.push(arg4); // 21 4
  2.1454 -    case 404: stack.push(stack.pop() + stack.pop()); // 96
  2.1455 -    case 405: stack.push(arg8); // 21 8
  2.1456 -    case 407: // number conversion  // 146
  2.1457 -    case 408: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
  2.1458 -    case 409: stack.push(arg11); // 21 11
  2.1459 -    case 411: stack.push(arg10); // 21 10
  2.1460 -    case 413: stack.push(stack.pop() + stack.pop()); // 96
  2.1461 -    case 414: arg11 = stack.pop() // 54 11
  2.1462 -    case 416: gt = 157; continue; // 167 254 253
  2.1463 -    case 419: stack.push(new java_lang_String); // 187 0 200
  2.1464 -    case 422: stack.push(stack[stack.length - 1]); // 89
  2.1465 -    case 423: stack.push(0); // 3
  2.1466 -    case 424: stack.push(arg0); // 42
  2.1467 -    case 425: stack.push(stack.pop().count); // 180 1 97
  2.1468 -    case 428: stack.push(arg4); // 21 4
  2.1469 -    case 430: stack.push(stack.pop() + stack.pop()); // 96
  2.1470 -    case 431: stack.push(arg3); // 45
  2.1471 -    case 432: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
  2.1472 -    case 435: return stack.pop(); // 176
  2.1473 -  }
  2.1474 -}
  2.1475 -function java_lang_String_toLowerCaseLjava_lang_String(arg0) {
  2.1476 -  var arg1;
  2.1477 -;
  2.1478 -  var stack = new Array(2);
  2.1479 -  var gt = 0;
  2.1480 -  for(;;) switch(gt) {
  2.1481 -    case 0: stack.push(arg0); // 42
  2.1482 -    case 1: { stack.push(java_util_Locale_getDefaultLjava_util_Locale()); } // 184 1 179
  2.1483 -    case 4: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.toLowerCaseLjava_lang_StringLjava_util_Locale(self, v0)); } // 182 1 158
  2.1484 -    case 7: return stack.pop(); // 176
  2.1485 -  }
  2.1486 -}
  2.1487 -function java_lang_String_toUpperCaseLjava_lang_StringLjava_util_Locale(arg0,arg1) {
  2.1488 -  var arg2;
  2.1489 -  var arg3;
  2.1490 -  var arg4;
  2.1491 -  var arg5;
  2.1492 -  var arg6;
  2.1493 -  var arg7;
  2.1494 -  var arg8;
  2.1495 -  var arg9;
  2.1496 -  var arg10;
  2.1497 -  var arg11;
  2.1498 -  var arg12;
  2.1499 -  var arg13;
  2.1500 -  var arg14;
  2.1501 -;
  2.1502 -  var stack = new Array(6);
  2.1503 -  var gt = 0;
  2.1504 -  for(;;) switch(gt) {
  2.1505 -    case 0: stack.push(arg1); // 43
  2.1506 -    case 1: if (stack.pop()) { gt = 12; continue; } // 199 0 11
  2.1507 -    case 4: stack.push(new java_lang_NullPointerException); // 187 0 198
  2.1508 -    case 7: stack.push(stack[stack.length - 1]); // 89
  2.1509 -    case 8: { java_lang_NullPointerException_consV(stack.pop()); } // 183 1 128
  2.1510 -    case 11:  // 191
  2.1511 -    case 12: stack.push(0); // 3
  2.1512 -    case 13: arg2 = stack.pop(); // 61
  2.1513 -    case 14: stack.push(arg2); // 28
  2.1514 -    case 15: stack.push(arg0); // 42
  2.1515 -    case 16: stack.push(stack.pop().count); // 180 1 97
  2.1516 -    case 19: if (stack.pop() <= stack.pop()) { gt = 93; continue; } // 162 0 74
  2.1517 -    case 22: stack.push(arg0); // 42
  2.1518 -    case 23: stack.push(stack.pop().value); // 180 1 100
  2.1519 -    case 26: stack.push(arg0); // 42
  2.1520 -    case 27: stack.push(stack.pop().offset); // 180 1 99
  2.1521 -    case 30: stack.push(arg2); // 28
  2.1522 -    case 31: stack.push(stack.pop() + stack.pop()); // 96
  2.1523 -    case 32: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1524 -    case 33: arg3 = stack.pop(); // 62
  2.1525 -    case 34: stack.push(arg3); // 29
  2.1526 -    case 35: stack.push(55296); // 18 1
  2.1527 -    case 37: if (stack.pop() > stack.pop()) { gt = 61; continue; } // 161 0 24
  2.1528 -    case 40: stack.push(arg3); // 29
  2.1529 -    case 41: stack.push(56319); // 18 2
  2.1530 -    case 43: if (stack.pop() < stack.pop()) { gt = 61; continue; } // 163 0 18
  2.1531 -    case 46: stack.push(arg0); // 42
  2.1532 -    case 47: stack.push(arg2); // 28
  2.1533 -    case 48: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
  2.1534 -    case 51: arg3 = stack.pop(); // 62
  2.1535 -    case 52: stack.push(arg3); // 29
  2.1536 -    case 53: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
  2.1537 -    case 56: arg4 = stack.pop() // 54 4
  2.1538 -    case 58: gt = 64; continue; // 167 0 6
  2.1539 -    case 61: stack.push(1); // 4
  2.1540 -    case 62: arg4 = stack.pop() // 54 4
  2.1541 -    case 64: stack.push(arg3); // 29
  2.1542 -    case 65: { var v0 = stack.pop(); stack.push(java_lang_Character_toUpperCaseExII(v0)); } // 184 1 108
  2.1543 -    case 68: arg5 = stack.pop() // 54 5
  2.1544 -    case 70: stack.push(arg5); // 21 5
  2.1545 -    case 72:  // 2
  2.1546 -    case 73: if (stack.pop() == stack.pop()) { gt = 95; continue; } // 159 0 22
  2.1547 -    case 76: stack.push(arg3); // 29
  2.1548 -    case 77: stack.push(arg5); // 21 5
  2.1549 -    case 79: if (stack.pop() == stack.pop()) { gt = 85; continue; } // 159 0 6
  2.1550 -    case 82: gt = 95; continue; // 167 0 13
  2.1551 -    case 85: stack.push(arg2); // 28
  2.1552 -    case 86: stack.push(arg4); // 21 4
  2.1553 -    case 88: stack.push(stack.pop() + stack.pop()); // 96
  2.1554 -    case 89: arg2 = stack.pop(); // 61
  2.1555 -    case 90: gt = 14; continue; // 167 255 180
  2.1556 -    case 93: stack.push(arg0); // 42
  2.1557 -    case 94: return stack.pop(); // 176
  2.1558 -    case 95: stack.push(arg0); // 42
  2.1559 -    case 96: stack.push(stack.pop().count); // 180 1 97
  2.1560 -    case 99: stack.push(new Array(stack.pop())); // 188 5
  2.1561 -    case 101: arg3 = stack.pop(); // 78
  2.1562 -    case 102: stack.push(0); // 3
  2.1563 -    case 103: arg4 = stack.pop() // 54 4
  2.1564 -    case 105: stack.push(arg0); // 42
  2.1565 -    case 106: stack.push(stack.pop().value); // 180 1 100
  2.1566 -    case 109: stack.push(arg0); // 42
  2.1567 -    case 110: stack.push(stack.pop().offset); // 180 1 99
  2.1568 -    case 113: stack.push(arg3); // 45
  2.1569 -    case 114: stack.push(0); // 3
  2.1570 -    case 115: stack.push(arg2); // 28
  2.1571 -    case 116: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
  2.1572 -    case 119: stack.push(arg1); // 43
  2.1573 -    case 120: { var self = stack.pop(); stack.push(self.getLanguageLjava_lang_String(self)); } // 182 1 178
  2.1574 -    case 123: arg5 = stack.pop() // 58 5
  2.1575 -    case 125: stack.push(arg5); // 25 5
  2.1576 -    case 127: stack.push("tr"); // 18 11
  2.1577 -    case 129:  // 165
  2.1578 -    case 130:  // 0
  2.1579 -    case 131: stack.push(6405); // 17 25 5
  2.1580 -    case 134: stack.push("az"); // 18 5
  2.1581 -    case 136:  // 165
  2.1582 -    case 137:  // 0
  2.1583 -    case 138: stack.push(1); // 10
  2.1584 -    case 139: stack.push(arg5); // 25 5
  2.1585 -    case 141: stack.push("lt"); // 18 9
  2.1586 -    case 143:  // 166
  2.1587 -    case 144:  // 0
  2.1588 -    case 145: stack.push(4); // 7
  2.1589 -    case 146: stack.push(1); // 4
  2.1590 -    case 147: gt = 151; continue; // 167 0 4
  2.1591 -    case 150: stack.push(0); // 3
  2.1592 -    case 151: arg6 = stack.pop() // 54 6
  2.1593 -    case 153: stack.push(arg2); // 28
  2.1594 -    case 154: arg11 = stack.pop() // 54 11
  2.1595 -    case 156: stack.push(arg11); // 21 11
  2.1596 -    case 158: stack.push(arg0); // 42
  2.1597 -    case 159: stack.push(stack.pop().count); // 180 1 97
  2.1598 -    case 162: if (stack.pop() <= stack.pop()) { gt = 425; continue; } // 162 1 7
  2.1599 -    case 165: stack.push(arg0); // 42
  2.1600 -    case 166: stack.push(stack.pop().value); // 180 1 100
  2.1601 -    case 169: stack.push(arg0); // 42
  2.1602 -    case 170: stack.push(stack.pop().offset); // 180 1 99
  2.1603 -    case 173: stack.push(arg11); // 21 11
  2.1604 -    case 175: stack.push(stack.pop() + stack.pop()); // 96
  2.1605 -    case 176: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1606 -    case 177: arg9 = stack.pop() // 54 9
  2.1607 -    case 179: stack.push(arg9); // 21 9
  2.1608 -    case 181: // number conversion  // 146
  2.1609 -    case 182: stack.push(55296); // 18 1
  2.1610 -    case 184: if (stack.pop() > stack.pop()) { gt = 213; continue; } // 161 0 29
  2.1611 -    case 187: stack.push(arg9); // 21 9
  2.1612 -    case 189: // number conversion  // 146
  2.1613 -    case 190: stack.push(56319); // 18 2
  2.1614 -    case 192: if (stack.pop() < stack.pop()) { gt = 213; continue; } // 163 0 21
  2.1615 -    case 195: stack.push(arg0); // 42
  2.1616 -    case 196: stack.push(arg11); // 21 11
  2.1617 -    case 198: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.codePointAtII(self, v0)); } // 182 1 134
  2.1618 -    case 201: arg9 = stack.pop() // 54 9
  2.1619 -    case 203: stack.push(arg9); // 21 9
  2.1620 -    case 205: { var v0 = stack.pop(); stack.push(java_lang_Character_charCountII(v0)); } // 184 1 106
  2.1621 -    case 208: arg10 = stack.pop() // 54 10
  2.1622 -    case 210: gt = 216; continue; // 167 0 6
  2.1623 -    case 213: stack.push(1); // 4
  2.1624 -    case 214: arg10 = stack.pop() // 54 10
  2.1625 -    case 216: stack.push(arg6); // 21 6
  2.1626 -    case 218: if (stack.pop() == 0) { gt = 233; continue; } // 153 0 15
  2.1627 -    case 221: stack.push(arg0); // 42
  2.1628 -    case 222: stack.push(arg11); // 21 11
  2.1629 -    case 224: stack.push(arg1); // 43
  2.1630 -    case 225: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toUpperCaseExILjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 118
  2.1631 -    case 228: arg8 = stack.pop() // 54 8
  2.1632 -    case 230: gt = 240; continue; // 167 0 10
  2.1633 -    case 233: stack.push(arg9); // 21 9
  2.1634 -    case 235: { var v0 = stack.pop(); stack.push(java_lang_Character_toUpperCaseExII(v0)); } // 184 1 108
  2.1635 -    case 238: arg8 = stack.pop() // 54 8
  2.1636 -    case 240: stack.push(arg8); // 21 8
  2.1637 -    case 242:  // 2
  2.1638 -    case 243: if (stack.pop() == stack.pop()) { gt = 253; continue; } // 159 0 10
  2.1639 -    case 246: stack.push(arg8); // 21 8
  2.1640 -    case 248: stack.push(65536); // 18 3
  2.1641 -    case 250: if (stack.pop() > stack.pop()) { gt = 405; continue; } // 161 0 155
  2.1642 -    case 253: stack.push(arg8); // 21 8
  2.1643 -    case 255:  // 2
  2.1644 -    case 256: if (stack.pop() != stack.pop()) { gt = 286; continue; } // 160 0 30
  2.1645 -    case 259: stack.push(arg6); // 21 6
  2.1646 -    case 261: if (stack.pop() == 0) { gt = 276; continue; } // 153 0 15
  2.1647 -    case 264: stack.push(arg0); // 42
  2.1648 -    case 265: stack.push(arg11); // 21 11
  2.1649 -    case 267: stack.push(arg1); // 43
  2.1650 -    case 268: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_ConditionalSpecialCasing_toUpperCaseCharArrayACLjava_lang_StringILjava_util_Locale(v0, v1, v2)); } // 184 1 120
  2.1651 -    case 271: arg7 = stack.pop() // 58 7
  2.1652 -    case 273: gt = 321; continue; // 167 0 48
  2.1653 -    case 276: stack.push(arg9); // 21 9
  2.1654 -    case 278: { var v0 = stack.pop(); stack.push(java_lang_Character_toUpperCaseCharArrayACI(v0)); } // 184 1 110
  2.1655 -    case 281: arg7 = stack.pop() // 58 7
  2.1656 -    case 283: gt = 321; continue; // 167 0 38
  2.1657 -    case 286: stack.push(arg10); // 21 10
  2.1658 -    case 288: stack.push(2); // 5
  2.1659 -    case 289: if (stack.pop() != stack.pop()) { gt = 314; continue; } // 160 0 25
  2.1660 -    case 292: stack.push(arg4); // 21 4
  2.1661 -    case 294: stack.push(arg8); // 21 8
  2.1662 -    case 296: stack.push(arg3); // 45
  2.1663 -    case 297: stack.push(arg11); // 21 11
  2.1664 -    case 299: stack.push(arg4); // 21 4
  2.1665 -    case 301: stack.push(stack.pop() + stack.pop()); // 96
  2.1666 -    case 302: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_Character_toCharsAIIACAI(v0, v1, v2)); } // 184 1 111
  2.1667 -    case 305: stack.push(arg10); // 21 10
  2.1668 -    case 307: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
  2.1669 -    case 308: stack.push(stack.pop() + stack.pop()); // 96
  2.1670 -    case 309: arg4 = stack.pop() // 54 4
  2.1671 -    case 311: gt = 415; continue; // 167 0 104
  2.1672 -    case 314: stack.push(arg8); // 21 8
  2.1673 -    case 316: { var v0 = stack.pop(); stack.push(java_lang_Character_toCharsACI(v0)); } // 184 1 109
  2.1674 -    case 319: arg7 = stack.pop() // 58 7
  2.1675 -    case 321: stack.push(arg7); // 25 7
  2.1676 -    case 323: stack.push(stack.pop().length); // 190
  2.1677 -    case 324: arg12 = stack.pop() // 54 12
  2.1678 -    case 326: stack.push(arg12); // 21 12
  2.1679 -    case 328: stack.push(arg10); // 21 10
  2.1680 -    case 330: if (stack.pop() >= stack.pop()) { gt = 361; continue; } // 164 0 31
  2.1681 -    case 333: stack.push(arg3); // 45
  2.1682 -    case 334: stack.push(stack.pop().length); // 190
  2.1683 -    case 335: stack.push(arg12); // 21 12
  2.1684 -    case 337: stack.push(stack.pop() + stack.pop()); // 96
  2.1685 -    case 338: stack.push(arg10); // 21 10
  2.1686 -    case 340: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
  2.1687 -    case 341: stack.push(new Array(stack.pop())); // 188 5
  2.1688 -    case 343: arg13 = stack.pop() // 58 13
  2.1689 -    case 345: stack.push(arg3); // 45
  2.1690 -    case 346: stack.push(0); // 3
  2.1691 -    case 347: stack.push(arg13); // 25 13
  2.1692 -    case 349: stack.push(0); // 3
  2.1693 -    case 350: stack.push(arg11); // 21 11
  2.1694 -    case 352: stack.push(arg4); // 21 4
  2.1695 -    case 354: stack.push(stack.pop() + stack.pop()); // 96
  2.1696 -    case 355: { var v4 = stack.pop(); var v3 = stack.pop(); var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_System_arraycopyVLjava_lang_ObjectILjava_lang_ObjectII(v0, v1, v2, v3, v4); } // 184 1 171
  2.1697 -    case 358: stack.push(arg13); // 25 13
  2.1698 -    case 360: arg3 = stack.pop(); // 78
  2.1699 -    case 361: stack.push(0); // 3
  2.1700 -    case 362: arg13 = stack.pop() // 54 13
  2.1701 -    case 364: stack.push(arg13); // 21 13
  2.1702 -    case 366: stack.push(arg12); // 21 12
  2.1703 -    case 368: if (stack.pop() <= stack.pop()) { gt = 392; continue; } // 162 0 24
  2.1704 -    case 371: stack.push(arg3); // 45
  2.1705 -    case 372: stack.push(arg11); // 21 11
  2.1706 -    case 374: stack.push(arg4); // 21 4
  2.1707 -    case 376: stack.push(stack.pop() + stack.pop()); // 96
  2.1708 -    case 377: stack.push(arg13); // 21 13
  2.1709 -    case 379: stack.push(stack.pop() + stack.pop()); // 96
  2.1710 -    case 380: stack.push(arg7); // 25 7
  2.1711 -    case 382: stack.push(arg13); // 21 13
  2.1712 -    case 384: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1713 -    case 385: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
  2.1714 -    case 386: arg13++; // 132 13 1
  2.1715 -    case 389: gt = 364; continue; // 167 255 231
  2.1716 -    case 392: stack.push(arg4); // 21 4
  2.1717 -    case 394: stack.push(arg12); // 21 12
  2.1718 -    case 396: stack.push(arg10); // 21 10
  2.1719 -    case 398: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
  2.1720 -    case 399: stack.push(stack.pop() + stack.pop()); // 96
  2.1721 -    case 400: arg4 = stack.pop() // 54 4
  2.1722 -    case 402: gt = 415; continue; // 167 0 13
  2.1723 -    case 405: stack.push(arg3); // 45
  2.1724 -    case 406: stack.push(arg11); // 21 11
  2.1725 -    case 408: stack.push(arg4); // 21 4
  2.1726 -    case 410: stack.push(stack.pop() + stack.pop()); // 96
  2.1727 -    case 411: stack.push(arg8); // 21 8
  2.1728 -    case 413: // number conversion  // 146
  2.1729 -    case 414: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
  2.1730 -    case 415: stack.push(arg11); // 21 11
  2.1731 -    case 417: stack.push(arg10); // 21 10
  2.1732 -    case 419: stack.push(stack.pop() + stack.pop()); // 96
  2.1733 -    case 420: arg11 = stack.pop() // 54 11
  2.1734 -    case 422: gt = 156; continue; // 167 254 246
  2.1735 -    case 425: stack.push(new java_lang_String); // 187 0 200
  2.1736 -    case 428: stack.push(stack[stack.length - 1]); // 89
  2.1737 -    case 429: stack.push(0); // 3
  2.1738 -    case 430: stack.push(arg0); // 42
  2.1739 -    case 431: stack.push(stack.pop().count); // 180 1 97
  2.1740 -    case 434: stack.push(arg4); // 21 4
  2.1741 -    case 436: stack.push(stack.pop() + stack.pop()); // 96
  2.1742 -    case 437: stack.push(arg3); // 45
  2.1743 -    case 438: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
  2.1744 -    case 441: return stack.pop(); // 176
  2.1745 -  }
  2.1746 -}
  2.1747 -function java_lang_String_toUpperCaseLjava_lang_String(arg0) {
  2.1748 -  var arg1;
  2.1749 -;
  2.1750 -  var stack = new Array(2);
  2.1751 -  var gt = 0;
  2.1752 -  for(;;) switch(gt) {
  2.1753 -    case 0: stack.push(arg0); // 42
  2.1754 -    case 1: { stack.push(java_util_Locale_getDefaultLjava_util_Locale()); } // 184 1 179
  2.1755 -    case 4: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.toUpperCaseLjava_lang_StringLjava_util_Locale(self, v0)); } // 182 1 159
  2.1756 -    case 7: return stack.pop(); // 176
  2.1757 -  }
  2.1758 -}
  2.1759 -function java_lang_String_trimLjava_lang_String(arg0) {
  2.1760 -  var arg1;
  2.1761 -  var arg2;
  2.1762 -  var arg3;
  2.1763 -  var arg4;
  2.1764 -  var arg5;
  2.1765 -;
  2.1766 -  var stack = new Array(3);
  2.1767 -  var gt = 0;
  2.1768 -  for(;;) switch(gt) {
  2.1769 -    case 0: stack.push(arg0); // 42
  2.1770 -    case 1: stack.push(stack.pop().count); // 180 1 97
  2.1771 -    case 4: arg1 = stack.pop(); // 60
  2.1772 -    case 5: stack.push(0); // 3
  2.1773 -    case 6: arg2 = stack.pop(); // 61
  2.1774 -    case 7: stack.push(arg0); // 42
  2.1775 -    case 8: stack.push(stack.pop().offset); // 180 1 99
  2.1776 -    case 11: arg3 = stack.pop(); // 62
  2.1777 -    case 12: stack.push(arg0); // 42
  2.1778 -    case 13: stack.push(stack.pop().value); // 180 1 100
  2.1779 -    case 16: arg4 = stack.pop() // 58 4
  2.1780 -    case 18: stack.push(arg2); // 28
  2.1781 -    case 19: stack.push(arg1); // 27
  2.1782 -    case 20: if (stack.pop() <= stack.pop()) { gt = 40; continue; } // 162 0 20
  2.1783 -    case 23: stack.push(arg4); // 25 4
  2.1784 -    case 25: stack.push(arg3); // 29
  2.1785 -    case 26: stack.push(arg2); // 28
  2.1786 -    case 27: stack.push(stack.pop() + stack.pop()); // 96
  2.1787 -    case 28: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1788 -    case 29: stack.push(32); // 16 32
  2.1789 -    case 31: if (stack.pop() < stack.pop()) { gt = 40; continue; } // 163 0 9
  2.1790 -    case 34: arg2++; // 132 2 1
  2.1791 -    case 37: gt = 18; continue; // 167 255 237
  2.1792 -    case 40: stack.push(arg2); // 28
  2.1793 -    case 41: stack.push(arg1); // 27
  2.1794 -    case 42: if (stack.pop() <= stack.pop()) { gt = 64; continue; } // 162 0 22
  2.1795 -    case 45: stack.push(arg4); // 25 4
  2.1796 -    case 47: stack.push(arg3); // 29
  2.1797 -    case 48: stack.push(arg1); // 27
  2.1798 -    case 49: stack.push(stack.pop() + stack.pop()); // 96
  2.1799 -    case 50: stack.push(1); // 4
  2.1800 -    case 51: { var tmp = stack.pop(); stack.push(stack.pop() - tmp); } // 100
  2.1801 -    case 52: { var indx = stack.pop(); stack.push(stack.pop()[indx]); } // 52
  2.1802 -    case 53: stack.push(32); // 16 32
  2.1803 -    case 55: if (stack.pop() < stack.pop()) { gt = 64; continue; } // 163 0 9
  2.1804 -    case 58: arg1 += 255; // 132 1 255
  2.1805 -    case 61: gt = 40; continue; // 167 255 235
  2.1806 -    case 64: stack.push(arg2); // 28
  2.1807 -    case 65: if (stack.pop() > 0) { gt = 76; continue; } // 157 0 11
  2.1808 -    case 68: stack.push(arg1); // 27
  2.1809 -    case 69: stack.push(arg0); // 42
  2.1810 -    case 70: stack.push(stack.pop().count); // 180 1 97
  2.1811 -    case 73: if (stack.pop() <= stack.pop()) { gt = 85; continue; } // 162 0 12
  2.1812 -    case 76: stack.push(arg0); // 42
  2.1813 -    case 77: stack.push(arg2); // 28
  2.1814 -    case 78: stack.push(arg1); // 27
  2.1815 -    case 79: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.substringLjava_lang_StringII(self, v0, v1)); } // 182 1 147
  2.1816 -    case 82: gt = 86; continue; // 167 0 4
  2.1817 -    case 85: stack.push(arg0); // 42
  2.1818 -    case 86: return stack.pop(); // 176
  2.1819 -  }
  2.1820 -}
  2.1821 -*/
  2.1822 -function java_lang_String_toStringLjava_lang_String(arg0) {
  2.1823 -    return arg0.toString();
  2.1824 -}
  2.1825 -function java_lang_String_toCharArrayAC(arg0) {
  2.1826 -    return arg0.toString().split('');
  2.1827 -}
  2.1828 -/*
  2.1829 -function java_lang_String_formatLjava_lang_StringLjava_lang_StringLjava_lang_Object(arg0,arg1) {
  2.1830 -  var stack = new Array();
  2.1831 -  var gt = 0;
  2.1832 -  for(;;) switch(gt) {
  2.1833 -    case 0: stack.push(new java_util_Formatter); // 187 0 211
  2.1834 -    case 3: stack.push(stack[stack.length - 1]); // 89
  2.1835 -    case 4: { java_util_Formatter_consV(stack.pop()); } // 183 1 174
  2.1836 -    case 7: stack.push(arg0); // 42
  2.1837 -    case 8: stack.push(arg1); // 43
  2.1838 -    case 9: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.formatALjava_util_FormatterLjava_lang_StringALjava_lang_Object(self, v0, v1)); } // 182 1 177
  2.1839 -    case 12: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 175
  2.1840 -    case 15: return stack.pop(); // 176
  2.1841 -  }
  2.1842 -}
  2.1843 -function java_lang_String_formatLjava_lang_StringLjava_util_LocaleLjava_lang_StringLjava_lang_Object(arg0,arg1,arg2) {
  2.1844 -  var stack = new Array();
  2.1845 -  var gt = 0;
  2.1846 -  for(;;) switch(gt) {
  2.1847 -    case 0: stack.push(new java_util_Formatter); // 187 0 211
  2.1848 -    case 3: stack.push(stack[stack.length - 1]); // 89
  2.1849 -    case 4: stack.push(arg0); // 42
  2.1850 -    case 5: { var v0 = stack.pop(); java_util_Formatter_consVLjava_util_Locale(stack.pop(), v0); } // 183 1 176
  2.1851 -    case 8: stack.push(arg1); // 43
  2.1852 -    case 9: stack.push(arg2); // 44
  2.1853 -    case 10: { var v1 = stack.pop(); var v0 = stack.pop(); var self = stack.pop(); stack.push(self.formatALjava_util_FormatterLjava_lang_StringALjava_lang_Object(self, v0, v1)); } // 182 1 177
  2.1854 -    case 13: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 175
  2.1855 -    case 16: return stack.pop(); // 176
  2.1856 -  }
  2.1857 -}
  2.1858 -function java_lang_String_valueOfLjava_lang_StringLjava_lang_Object(arg0) {
  2.1859 -  var stack = new Array();
  2.1860 -  var gt = 0;
  2.1861 -  for(;;) switch(gt) {
  2.1862 -    case 0: stack.push(arg0); // 42
  2.1863 -    case 1: if (stack.pop()) { gt = 9; continue; } // 199 0 8
  2.1864 -    case 4: stack.push("null"); // 18 10
  2.1865 -    case 6: gt = 13; continue; // 167 0 7
  2.1866 -    case 9: stack.push(arg0); // 42
  2.1867 -    case 10: { var self = stack.pop(); stack.push(self.toStringLjava_lang_String(self)); } // 182 1 132
  2.1868 -    case 13: return stack.pop(); // 176
  2.1869 -  }
  2.1870 -}
  2.1871 -function java_lang_String_valueOfLjava_lang_StringAC(arg0) {
  2.1872 -  var stack = new Array();
  2.1873 -  var gt = 0;
  2.1874 -  for(;;) switch(gt) {
  2.1875 -    case 0: stack.push(new java_lang_String); // 187 0 200
  2.1876 -    case 3: stack.push(stack[stack.length - 1]); // 89
  2.1877 -    case 4: stack.push(arg0); // 42
  2.1878 -    case 5: { var v0 = stack.pop(); java_lang_String_consVAC(stack.pop(), v0); } // 183 1 142
  2.1879 -    case 8: return stack.pop(); // 176
  2.1880 -  }
  2.1881 -}
  2.1882 -function java_lang_String_valueOfLjava_lang_StringACII(arg0,arg1,arg2) {
  2.1883 -  var stack = new Array();
  2.1884 -  var gt = 0;
  2.1885 -  for(;;) switch(gt) {
  2.1886 -    case 0: stack.push(new java_lang_String); // 187 0 200
  2.1887 -    case 3: stack.push(stack[stack.length - 1]); // 89
  2.1888 -    case 4: stack.push(arg0); // 42
  2.1889 -    case 5: stack.push(arg1); // 27
  2.1890 -    case 6: stack.push(arg2); // 28
  2.1891 -    case 7: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVACAIAI(stack.pop(), v0, v1, v2); } // 183 1 143
  2.1892 -    case 10: return stack.pop(); // 176
  2.1893 -  }
  2.1894 -}
  2.1895 -function java_lang_String_copyValueOfLjava_lang_StringACII(arg0,arg1,arg2) {
  2.1896 -  var stack = new Array();
  2.1897 -  var gt = 0;
  2.1898 -  for(;;) switch(gt) {
  2.1899 -    case 0: stack.push(new java_lang_String); // 187 0 200
  2.1900 -    case 3: stack.push(stack[stack.length - 1]); // 89
  2.1901 -    case 4: stack.push(arg0); // 42
  2.1902 -    case 5: stack.push(arg1); // 27
  2.1903 -    case 6: stack.push(arg2); // 28
  2.1904 -    case 7: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVACAIAI(stack.pop(), v0, v1, v2); } // 183 1 143
  2.1905 -    case 10: return stack.pop(); // 176
  2.1906 -  }
  2.1907 -}
  2.1908 -function java_lang_String_copyValueOfLjava_lang_StringAC(arg0) {
  2.1909 -  var stack = new Array();
  2.1910 -  var gt = 0;
  2.1911 -  for(;;) switch(gt) {
  2.1912 -    case 0: stack.push(arg0); // 42
  2.1913 -    case 1: stack.push(0); // 3
  2.1914 -    case 2: stack.push(arg0); // 42
  2.1915 -    case 3: stack.push(stack.pop().length); // 190
  2.1916 -    case 4: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_String_copyValueOfALjava_lang_StringACAIAI(v0, v1, v2)); } // 184 1 155
  2.1917 -    case 7: return stack.pop(); // 176
  2.1918 -  }
  2.1919 -}
  2.1920 -function java_lang_String_valueOfLjava_lang_StringZ(arg0) {
  2.1921 -  var stack = new Array();
  2.1922 -  var gt = 0;
  2.1923 -  for(;;) switch(gt) {
  2.1924 -    case 0: stack.push(arg0); // 26
  2.1925 -    case 1: if (stack.pop() == 0) { gt = 9; continue; } // 153 0 8
  2.1926 -    case 4: stack.push("true"); // 18 12
  2.1927 -    case 6: gt = 11; continue; // 167 0 5
  2.1928 -    case 9: stack.push("false"); // 18 8
  2.1929 -    case 11: return stack.pop(); // 176
  2.1930 -  }
  2.1931 -}
  2.1932 -function java_lang_String_valueOfLjava_lang_StringC(arg0) {
  2.1933 -  var arg1;
  2.1934 -  var stack = new Array();
  2.1935 -  var gt = 0;
  2.1936 -  for(;;) switch(gt) {
  2.1937 -    case 0: stack.push(1); // 4
  2.1938 -    case 1: stack.push(new Array(stack.pop())); // 188 5
  2.1939 -    case 3: stack.push(stack[stack.length - 1]); // 89
  2.1940 -    case 4: stack.push(0); // 3
  2.1941 -    case 5: stack.push(arg0); // 26
  2.1942 -    case 6: { var value = stack.pop(); var indx = stack.pop(); stack.pop()[indx] = value; } // 85
  2.1943 -    case 7: arg1 = stack.pop(); // 76
  2.1944 -    case 8: stack.push(new java_lang_String); // 187 0 200
  2.1945 -    case 11: stack.push(stack[stack.length - 1]); // 89
  2.1946 -    case 12: stack.push(0); // 3
  2.1947 -    case 13: stack.push(1); // 4
  2.1948 -    case 14: stack.push(arg1); // 43
  2.1949 -    case 15: { var v2 = stack.pop(); var v1 = stack.pop(); var v0 = stack.pop(); java_lang_String_consVIIAC(stack.pop(), v0, v1, v2); } // 183 1 137
  2.1950 -    case 18: return stack.pop(); // 176
  2.1951 -  }
  2.1952 -}
  2.1953 -function java_lang_String_valueOfLjava_lang_StringJ(arg0) {
  2.1954 -  var arg1;
  2.1955 -  var stack = new Array();
  2.1956 -  var gt = 0;
  2.1957 -  for(;;) switch(gt) {
  2.1958 -    case 0: stack.push(arg0); // 30
  2.1959 -    case 1: stack.push(10); // 16 10
  2.1960 -    case 3: { var v1 = stack.pop(); var v0 = stack.pop(); stack.push(java_lang_Long_toStringLjava_lang_StringJI(v0, v1)); } // 184 1 126
  2.1961 -    case 6: return stack.pop(); // 176
  2.1962 -  }
  2.1963 -}
  2.1964 -function java_lang_String_valueOfLjava_lang_StringF(arg0) {
  2.1965 -  var stack = new Array();
  2.1966 -  var gt = 0;
  2.1967 -  for(;;) switch(gt) {
  2.1968 -    case 0: stack.push(arg0); // 34
  2.1969 -    case 1: { var v0 = stack.pop(); stack.push(java_lang_Float_toStringLjava_lang_StringF(v0)); } // 184 1 122
  2.1970 -    case 4: return stack.pop(); // 176
  2.1971 -  }
  2.1972 -}
  2.1973 -function java_lang_String_valueOfLjava_lang_StringD(arg0) {
  2.1974 -  var arg1;
  2.1975 -  var stack = new Array();
  2.1976 -  var gt = 0;
  2.1977 -  for(;;) switch(gt) {
  2.1978 -    case 0: stack.push(arg0); // 38
  2.1979 -    case 1: { var v0 = stack.pop(); stack.push(java_lang_Double_toStringLjava_lang_StringD(v0)); } // 184 1 121
  2.1980 -    case 4: return stack.pop(); // 176
  2.1981 -  }
  2.1982 -}
  2.1983 -function java_lang_String_internLjava_lang_String(arg0) {
  2.1984 -  // no code found for null 
  2.1985 -}
  2.1986 -function java_lang_String_compareToILjava_lang_Object(arg0,arg1) {
  2.1987 -  var arg2;
  2.1988 -;
  2.1989 -  var stack = new Array(2);
  2.1990 -  var gt = 0;
  2.1991 -  for(;;) switch(gt) {
  2.1992 -    case 0: stack.push(arg0); // 42
  2.1993 -    case 1: stack.push(arg1); // 43
  2.1994 -    case 2: if(stack[stack.length - 1].$instOf_java_lang_String != 1) throw {}; // 192 0 200
  2.1995 -    case 5: { var v0 = stack.pop(); var self = stack.pop(); stack.push(self.compareToILjava_lang_String(self, v0)); } // 182 1 148
  2.1996 -    case 8: return stack.pop(); // 172
  2.1997 -  }
  2.1998 -}
  2.1999 -function java_lang_String_classV() {
  2.2000 -  var stack = new Array();
  2.2001 -  var gt = 0;
  2.2002 -  for(;;) switch(gt) {
  2.2003 -    case 0: stack.push(0); // 3
  2.2004 -    case 1: stack.push(new Array(stack.pop())); // 189 0 183
  2.2005 -    case 4: java_lang_String_serialPersistentFields = stack.pop(); // 179 1 101
  2.2006 -    case 7: stack.push(new java_lang_String$CaseInsensitiveComparator); // 187 0 202
  2.2007 -    case 10: stack.push(stack[stack.length - 1]); // 89
  2.2008 -    case 11:  // 1
  2.2009 -    case 12: { var v0 = stack.pop(); java_lang_String$CaseInsensitiveComparator_consVLjava_lang_String$1(stack.pop(), v0); } // 183 1 160
  2.2010 -    case 15: java_lang_String_CASE_INSENSITIVE_ORDER = stack.pop(); // 179 1 102
  2.2011 -    case 18: return; // 177
  2.2012 -  }
  2.2013 -}
  2.2014 -*/
  2.2015 -var java_lang_String_serialVersionUID = 0;
  2.2016 -var java_lang_String_serialPersistentFields = 0;
  2.2017 -var java_lang_String_CASE_INSENSITIVE_ORDER = 0;
  2.2018 -function java_lang_String() {
  2.2019 -  /** the real value of this 'string' we delegate to */
  2.2020 -  this.r = '';
  2.2021 -}
  2.2022 -java_lang_String.prototype = new String;
  2.2023 -java_lang_String.prototype.toString = function() { return this.r; };;
  2.2024 -//java_lang_String_classV();
  2.2025 -
  2.2026 -/* new method for JavaScript String */
  2.2027 -String.prototype.consVAC = java_lang_String_consVAC;
  2.2028 -String.prototype.consVACII = java_lang_String_consVACII;
  2.2029 -String.prototype.charAtCI = java_lang_String_charAtCI;
  2.2030 -String.prototype.lengthI = java_lang_String_lengthI;
  2.2031 -String.prototype.isEmptyZ = java_lang_String_isEmptyZ;
  2.2032 -String.prototype.getCharsVIIACI = java_lang_String_getCharsVIIACAI;
  2.2033 -String.prototype.getCharsVACI = java_lang_String_getCharsVACI;
  2.2034 -String.prototype.toStringLjava_lang_String = java_lang_String_toStringLjava_lang_String;
  2.2035 -String.prototype.substringLjava_lang_StringI = java_lang_String_substringLjava_lang_StringI;
  2.2036 -String.prototype.substringLjava_lang_StringII = java_lang_String_substringLjava_lang_StringII;
  2.2037 -String.prototype.replaceLjava_lang_StringCC = java_lang_String_replaceLjava_lang_StringCC;
  2.2038 -String.prototype.containsZLjava_lang_CharSequence = java_lang_String_containsZLjava_lang_CharSequence;
  2.2039 -String.prototype.equalsZLjava_lang_Object = java_lang_String_equalsZLjava_lang_Object;
  2.2040 -String.prototype.hashCodeI = java_lang_String_hashCodeI;
  2.2041 -String.prototype.toCharArrayAC = java_lang_String_toCharArrayAC;
  2.2042 -String.prototype.valueOfLjava_lang_StringI=java_lang_String_valueOfLjava_lang_StringI;
  2.2043 -String.prototype.startsWithZLjava_lang_StringI = java_lang_String_startsWithZLjava_lang_StringI;
  2.2044 -String.prototype.startsWithZLjava_lang_String=java_lang_String_startsWithZLjava_lang_String;
  2.2045 -String.prototype.endsWithZLjava_lang_String=java_lang_String_endsWithZLjava_lang_String;
  2.2046 -String.prototype.indexOfII=java_lang_String_indexOfII;
  2.2047 -String.prototype.indexOfIII=java_lang_String_indexOfIII;
  2.2048 -
  2.2049 -String.prototype.$instOf_java_lang_String = true;
  2.2050 -String.prototype.$instOf_java_io_Serializable = true;
  2.2051 -String.prototype.$instOf_java_lang_Comparable = true;
  2.2052 -String.prototype.$instOf_java_lang_CharSequence = true;
  2.2053  
  2.2054  /*
  2.2055    this.lengthI = java_lang_String_lengthI;
     3.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sun Nov 25 21:23:06 2012 +0100
     3.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Wed Nov 28 17:58:10 2012 +0100
     3.3 @@ -19,7 +19,6 @@
     3.4  
     3.5  import java.io.IOException;
     3.6  import java.io.InputStream;
     3.7 -import org.apidesign.bck2brwsr.core.JavaScriptBody;
     3.8  import org.apidesign.javap.AnnotationParser;
     3.9  import org.apidesign.javap.ClassData;
    3.10  import org.apidesign.javap.FieldData;
    3.11 @@ -50,6 +49,16 @@
    3.12       * @param resourcePath name of resources to read
    3.13       */
    3.14      protected abstract void requireScript(String resourcePath);
    3.15 +    
    3.16 +    /** Allows subclasses to redefine what field a function representing a
    3.17 +     * class gets assigned. By default it returns the suggested name followed
    3.18 +     * by <code>" = "</code>;
    3.19 +     * 
    3.20 +     * @param className suggested name of the class
    3.21 +     */
    3.22 +    protected String assignClass(String className) {
    3.23 +        return className + " = ";
    3.24 +    }
    3.25  
    3.26      /**
    3.27       * Converts a given class file to a JavaScript version.
    3.28 @@ -74,70 +83,64 @@
    3.29              }
    3.30          }
    3.31          StringArray toInitilize = new StringArray();
    3.32 -        for (MethodData m : jc.getMethods()) {
    3.33 -            if (m.isStatic()) {
    3.34 -                generateStaticMethod(m, toInitilize);
    3.35 -            } else {
    3.36 -                generateInstanceMethod(m);
    3.37 -            }
    3.38 -        }
    3.39          final String className = className(jc);
    3.40 -        out.append("\nfunction ").append(className);
    3.41 -        out.append("() {");
    3.42 -        for (FieldData v : jc.getFields()) {
    3.43 -            if (!v.isStatic()) {
    3.44 -                out.append("\n  this.fld_").
    3.45 -                    append(v.getName()).append(initField(v));
    3.46 -            }
    3.47 -        }
    3.48 -        out.append("\n}\n\nfunction ").append(className).append("_proto() {");
    3.49 -        out.append("\n  if (").append(className).
    3.50 -            append(".prototype.$instOf_").append(className).append(") {");
    3.51 -        out.append("\n    return new ").append(className).append(";");
    3.52 -        out.append("\n  }");
    3.53 +        out.append("\n\n").append(assignClass(className));
    3.54 +        out.append("function CLS() {");
    3.55 +        out.append("\n  if (!CLS.prototype.$instOf_").append(className).append(") {");
    3.56          for (FieldData v : jc.getFields()) {
    3.57              if (v.isStatic()) {
    3.58 -                generateStaticField(v);
    3.59 +                out.append("\n  CLS.").append(v.getName()).append(initField(v));
    3.60              }
    3.61          }
    3.62          // ClassName sc = jc.getSuperClass();
    3.63          String sc = jc.getSuperClassName(); // with _
    3.64          if (sc != null) {
    3.65 -            out.append("\n  var p = ").append(className)
    3.66 -               .append(".prototype = ").
    3.67 -                append(sc.replace('/', '_')).append("_proto();");
    3.68 +            out.append("\n    var p = CLS.prototype = ").
    3.69 +                append(sc.replace('/', '_')).append("(true);");
    3.70          } else {
    3.71 -            out.append("\n  var p = ").append(className).append(".prototype;");
    3.72 +            out.append("\n    var p = CLS.prototype;");
    3.73          }
    3.74          for (MethodData m : jc.getMethods()) {
    3.75 -            if (!m.getName().contains("<cinit>")) {
    3.76 -                generateMethodReference("\n  p.", m);
    3.77 +            if (m.isStatic()) {
    3.78 +                generateStaticMethod("\n    p.", m, toInitilize);
    3.79 +            } else {
    3.80 +                generateInstanceMethod("\n    p.", m);
    3.81              }
    3.82          }
    3.83 -        out.append("\n  p.$instOf_").append(className).append(" = true;");
    3.84 +        out.append("\n    p.$instOf_").append(className).append(" = true;");
    3.85          for (String superInterface : jc.getSuperInterfaces()) {
    3.86 -            out.append("\n  p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;");
    3.87 +            out.append("\n    p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;");
    3.88          }
    3.89 -        out.append("\n  return new ").append(className).append(";");
    3.90 +        out.append("\n      if (arguments.length === 0) {");
    3.91 +        out.append("\n        return new CLS();");
    3.92 +        out.append("\n      }");
    3.93 +        out.append("\n  }");
    3.94 +        out.append("\n  if (arguments.length === 0) {");
    3.95 +        for (FieldData v : jc.getFields()) {
    3.96 +            if (!v.isStatic()) {
    3.97 +                out.append("\n    this.fld_").
    3.98 +                    append(v.getName()).append(initField(v));
    3.99 +            }
   3.100 +        }
   3.101 +        out.append("\n    return this;");
   3.102 +        out.append("\n  }");
   3.103 +        out.append("\n  return new CLS;");
   3.104          out.append("\n}");
   3.105 -        out.append("\n").append(className).append("_proto();");
   3.106          StringBuilder sb = new StringBuilder();
   3.107          for (String init : toInitilize.toArray()) {
   3.108              sb.append("\n").append(init).append("();");
   3.109          }
   3.110          return sb.toString();
   3.111      }
   3.112 -    private void generateStaticMethod(MethodData m, StringArray toInitilize) throws IOException {
   3.113 -        if (javaScriptBody(m, true)) {
   3.114 +    private void generateStaticMethod(String prefix, MethodData m, StringArray toInitilize) throws IOException {
   3.115 +        if (javaScriptBody(prefix, m, true)) {
   3.116              return;
   3.117          }
   3.118          StringBuilder argsCnt = new StringBuilder();
   3.119          final String mn = findMethodName(m, argsCnt);
   3.120 -        out.append("\nfunction ").append(
   3.121 -            className(jc)
   3.122 -        ).append('_').append(mn);
   3.123 +        out.append(prefix).append(mn).append(" = function");
   3.124          if (mn.equals("classV")) {
   3.125 -            toInitilize.add(className(jc) + '_' + mn);
   3.126 +            toInitilize.add(className(jc) + "(true)." + mn);
   3.127          }
   3.128          out.append('(');
   3.129          String space = "";
   3.130 @@ -165,24 +168,16 @@
   3.131          } else {
   3.132              out.append("  /* no code found for ").append(m.getInternalSig()).append(" */\n");
   3.133          }
   3.134 -        out.append("}");
   3.135 +        out.append("};");
   3.136      }
   3.137      
   3.138 -    private void generateMethodReference(String prefix, MethodData m) throws IOException {
   3.139 -        final String name = findMethodName(m, new StringBuilder());
   3.140 -        out.append(prefix).append(name).append(" = ")
   3.141 -           .append(className(jc))
   3.142 -           .append('_').append(name).append(";");
   3.143 -    }
   3.144 -    
   3.145 -    private void generateInstanceMethod(MethodData m) throws IOException {
   3.146 -        if (javaScriptBody(m, false)) {
   3.147 +    private void generateInstanceMethod(String prefix, MethodData m) throws IOException {
   3.148 +        if (javaScriptBody(prefix, m, false)) {
   3.149              return;
   3.150          }
   3.151          StringBuilder argsCnt = new StringBuilder();
   3.152 -        out.append("\nfunction ").append(
   3.153 -            className(jc)
   3.154 -        ).append('_').append(findMethodName(m, argsCnt));
   3.155 +        final String mn = findMethodName(m, argsCnt);
   3.156 +        out.append(prefix).append(mn).append(" = function");
   3.157          out.append("(arg0");
   3.158          String space = ",";
   3.159          for (int index = 1, i = 0; i < argsCnt.length(); i++) {
   3.160 @@ -207,7 +202,7 @@
   3.161          } else {
   3.162              out.append("  /* no code found for ").append(m.getInternalSig()).append(" */\n");
   3.163          }
   3.164 -        out.append("}");
   3.165 +        out.append("};");
   3.166      }
   3.167  
   3.168      private void produceCode(byte[] byteCodes) throws IOException {
   3.169 @@ -846,12 +841,6 @@
   3.170          }
   3.171      }
   3.172  
   3.173 -    private void generateStaticField(FieldData v) throws IOException {
   3.174 -        out.append("\n  ")
   3.175 -           .append(className(jc))
   3.176 -           .append('.').append(v.getName()).append(initField(v));
   3.177 -    }
   3.178 -
   3.179      private String findMethodName(MethodData m, StringBuilder cnt) {
   3.180          StringBuilder name = new StringBuilder();
   3.181          if ("<init>".equals(m.getName())) { // NOI18N
   3.182 @@ -897,7 +886,7 @@
   3.183          }
   3.184          final String in = mi[0];
   3.185          out.append(in.replace('/', '_'));
   3.186 -        out.append(".prototype.");
   3.187 +        out.append("(true).");
   3.188          out.append(mn);
   3.189          out.append('(');
   3.190          String sep = "";
   3.191 @@ -980,7 +969,7 @@
   3.192          return d.replace('[', 'A');
   3.193      }
   3.194  
   3.195 -    private boolean javaScriptBody(MethodData m, boolean isStatic) throws IOException {
   3.196 +    private boolean javaScriptBody(String prefix, MethodData m, boolean isStatic) throws IOException {
   3.197          byte[] arr = m.findAnnotationData(true);
   3.198          if (arr == null) {
   3.199              return false;
   3.200 @@ -1010,9 +999,8 @@
   3.201              return false;
   3.202          }
   3.203          StringBuilder cnt = new StringBuilder();
   3.204 -        out.append("\nfunction ").append(className(jc)).append('_').
   3.205 -            append(findMethodName(m, cnt));
   3.206 -        out.append("(");
   3.207 +        out.append(prefix).append(findMethodName(m, cnt));
   3.208 +        out.append(" = function(");
   3.209          String space;
   3.210          int index;
   3.211          if (!isStatic) {                
     4.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java	Sun Nov 25 21:23:06 2012 +0100
     4.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ArrayTest.java	Wed Nov 28 17:58:10 2012 +0100
     4.3 @@ -29,7 +29,7 @@
     4.4   */
     4.5  public class ArrayTest {
     4.6      @Test public void verifySimpleIntOperation() throws Exception {
     4.7 -            assertExec("CheckTheSum", "org_apidesign_vm4brwsr_Array_simpleI", 
     4.8 +            assertExec("CheckTheSum", Array.class, "simpleI", 
     4.9              Double.valueOf(15)
    4.10          );
    4.11      }
    4.12 @@ -39,13 +39,13 @@
    4.13      }
    4.14      
    4.15      @Test public void verifyOperationsOnArrays() throws Exception {
    4.16 -        assertExec("The sum is 105", "org_apidesign_vm4brwsr_Array_sumD", 
    4.17 +        assertExec("The sum is 105", Array.class, "sumD", 
    4.18              Double.valueOf(105)
    4.19          );
    4.20      }
    4.21      
    4.22      @Test public void doesCopyArrayWork() throws Exception {
    4.23 -        assertExec("Returns 'a'", "org_apidesign_vm4brwsr_Array_copyArrayC", Double.valueOf('a'));
    4.24 +        assertExec("Returns 'a'", Array.class, "copyArrayC", Double.valueOf('a'));
    4.25      }
    4.26      
    4.27      private static CharSequence codeSeq;
    4.28 @@ -59,21 +59,7 @@
    4.29          );
    4.30          codeSeq = sb;
    4.31      }
    4.32 -    private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
    4.33 -        Object ret = null;
    4.34 -        try {
    4.35 -            ret = code.invokeFunction(methodName, args);
    4.36 -        } catch (ScriptException ex) {
    4.37 -            fail("Execution failed in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
    4.38 -        } catch (NoSuchMethodException ex) {
    4.39 -            fail("Cannot find method in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
    4.40 -        }
    4.41 -        if (ret == null && expRes == null) {
    4.42 -            return;
    4.43 -        }
    4.44 -        if (expRes.equals(ret)) {
    4.45 -            return;
    4.46 -        }
    4.47 -        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + codeSeq);
    4.48 +    private static void assertExec(String msg, Class clazz, String method, Object expRes, Object... args) throws Exception {
    4.49 +        StaticMethodTest.assertExec(code, codeSeq, msg, clazz, method, expRes, args);
    4.50      }
    4.51  }
     5.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Sun Nov 25 21:23:06 2012 +0100
     5.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java	Wed Nov 28 17:58:10 2012 +0100
     5.3 @@ -31,42 +31,42 @@
     5.4      @Test public void verifyDefaultDoubleValue() throws Exception {
     5.5          assertExec(
     5.6              "Will be zero",
     5.7 -            "org_apidesign_vm4brwsr_Instance_defaultDblValueD",
     5.8 +            Instance.class, "defaultDblValueD",
     5.9              Double.valueOf(0)
    5.10          );
    5.11      }
    5.12      @Test public void verifyStaticMethodCall() throws Exception {
    5.13          assertExec(
    5.14              "Will be zero",
    5.15 -            "org_apidesign_vm4brwsr_InstanceSub_recallDblD",
    5.16 +            InstanceSub.class, "recallDblD",
    5.17              Double.valueOf(0)
    5.18          );
    5.19      }
    5.20      @Test public void verifyAssignedByteValue() throws Exception {
    5.21          assertExec(
    5.22              "Will one thirty one",
    5.23 -            "org_apidesign_vm4brwsr_Instance_assignedByteValueB",
    5.24 +            Instance.class, "assignedByteValueB",
    5.25              Double.valueOf(31)
    5.26          );
    5.27      }
    5.28      @Test public void verifyMagicOne() throws Exception {
    5.29          assertExec(
    5.30              "Should be three and something",
    5.31 -            "org_apidesign_vm4brwsr_Instance_magicOneD",
    5.32 +            Instance.class, "magicOneD",
    5.33              Double.valueOf(3.3)
    5.34          );
    5.35      }
    5.36      @Test public void verifyInstanceMethods() throws Exception {
    5.37          assertExec(
    5.38              "Should be eleven as we invoke overwritten method, plus 44",
    5.39 -            "org_apidesign_vm4brwsr_Instance_virtualBytesI",
    5.40 +            Instance.class, "virtualBytesI",
    5.41              Double.valueOf(55)
    5.42          );
    5.43      }
    5.44      @Test public void verifyInterfaceMethods() throws Exception {
    5.45          assertExec(
    5.46              "Retruns default value",
    5.47 -            "org_apidesign_vm4brwsr_Instance_interfaceBytesF",
    5.48 +            Instance.class, "interfaceBytesF",
    5.49              Double.valueOf(31)
    5.50          );
    5.51      }
    5.52 @@ -74,7 +74,7 @@
    5.53      @Test public void isNull() throws Exception {
    5.54          assertExec(
    5.55              "Yes, we are instance",
    5.56 -            "org_apidesign_vm4brwsr_Instance_isNullZ",
    5.57 +            Instance.class, "isNullZ",
    5.58              Double.valueOf(0.0)
    5.59          );
    5.60      }
    5.61 @@ -82,7 +82,7 @@
    5.62      @Test public void isInstanceOf() throws Exception {
    5.63          assertExec(
    5.64              "Yes, we are instance",
    5.65 -            "org_apidesign_vm4brwsr_Instance_instanceOfZZ",
    5.66 +            Instance.class, "instanceOfZZ",
    5.67              Double.valueOf(1.0), true
    5.68          );
    5.69      }
    5.70 @@ -90,7 +90,7 @@
    5.71      @Test public void notInstanceOf() throws Exception {
    5.72          assertExec(
    5.73              "No, we are not an instance",
    5.74 -            "org_apidesign_vm4brwsr_Instance_instanceOfZZ",
    5.75 +            Instance.class, "instanceOfZZ",
    5.76              Double.valueOf(0.0), false
    5.77          );
    5.78      }
    5.79 @@ -98,14 +98,14 @@
    5.80      @Test public void verifyCastToClass() throws Exception {
    5.81          assertExec(
    5.82              "Five signals all is good",
    5.83 -            "org_apidesign_vm4brwsr_Instance_castsWorkIZ",
    5.84 +            Instance.class, "castsWorkIZ",
    5.85              Double.valueOf(5.0), false
    5.86          );
    5.87      }
    5.88      @Test public void verifyCastToInterface() throws Exception {
    5.89          assertExec(
    5.90              "Five signals all is good",
    5.91 -            "org_apidesign_vm4brwsr_Instance_castsWorkIZ",
    5.92 +            Instance.class, "castsWorkIZ",
    5.93              Double.valueOf(5.0), true
    5.94          );
    5.95      }
    5.96 @@ -127,25 +127,9 @@
    5.97      }
    5.98      
    5.99      private void assertExec(
   5.100 -        String msg, String methodName, Object expRes, Object... args
   5.101 +        String msg, Class clazz, String method, Object expRes, Object... args
   5.102      ) throws Exception {
   5.103 -
   5.104 -        Object ret = null;
   5.105 -        try {
   5.106 -            ret = code.invokeFunction(methodName, args);
   5.107 -        } catch (ScriptException ex) {
   5.108 -            fail("Execution failed in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
   5.109 -        } catch (NoSuchMethodException ex) {
   5.110 -            fail("Cannot find method in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
   5.111 -        }
   5.112 -        if (ret == null && expRes == null) {
   5.113 -            return;
   5.114 -        }
   5.115 -        if (expRes.equals(ret)) {
   5.116 -            return;
   5.117 -        }
   5.118 -        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + StaticMethodTest.dumpJS(codeSeq));
   5.119 -        
   5.120 +        StaticMethodTest.assertExec(code, codeSeq, msg, clazz, method, expRes, args);
   5.121      }
   5.122      
   5.123  }
     6.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Sun Nov 25 21:23:06 2012 +0100
     6.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/NumberTest.java	Wed Nov 28 17:58:10 2012 +0100
     6.3 @@ -17,11 +17,6 @@
     6.4   */
     6.5  package org.apidesign.vm4brwsr;
     6.6  
     6.7 -import java.io.ByteArrayInputStream;
     6.8 -import java.io.ByteArrayOutputStream;
     6.9 -import java.io.DataInputStream;
    6.10 -import java.io.DataOutputStream;
    6.11 -import java.io.IOException;
    6.12  import javax.script.Invocable;
    6.13  import javax.script.ScriptException;
    6.14  import static org.testng.Assert.*;
    6.15 @@ -34,19 +29,19 @@
    6.16   */
    6.17  public class NumberTest {
    6.18      @Test public void integerFromString() throws Exception {
    6.19 -        assertExec("Can convert string to integer", "java_lang_Integer_parseIntILjava_lang_String",
    6.20 +        assertExec("Can convert string to integer", Integer.class, "parseIntILjava_lang_String",
    6.21              Double.valueOf(333), "333"
    6.22          );
    6.23      }
    6.24  
    6.25      @Test public void doubleFromString() throws Exception {
    6.26 -        assertExec("Can convert string to double", "java_lang_Double_parseDoubleDLjava_lang_String",
    6.27 +        assertExec("Can convert string to double", Double.class, "parseDoubleDLjava_lang_String",
    6.28              Double.valueOf(33.3), "33.3"
    6.29          );
    6.30      }
    6.31  
    6.32      @Test public void autoboxDouble() throws Exception {
    6.33 -        assertExec("Autoboxing of doubles is OK", "org_apidesign_vm4brwsr_Numbers_autoboxDblToStringLjava_lang_String",
    6.34 +        assertExec("Autoboxing of doubles is OK", Numbers.class, "autoboxDblToStringLjava_lang_String",
    6.35              "3.3"
    6.36          );
    6.37      }
    6.38 @@ -56,7 +51,7 @@
    6.39      }
    6.40  
    6.41      @Test public void jslog1000() throws Exception {
    6.42 -        assertExec("log_10(1000) == 3", "java_lang_Math_log10DD", 
    6.43 +        assertExec("log_10(1000) == 3", Math.class, "log10DD", 
    6.44              Double.valueOf(3.0), 1000.0
    6.45          );
    6.46      }
    6.47 @@ -65,20 +60,20 @@
    6.48          assertEquals(3, Numbers.rem(303, 10));
    6.49      }
    6.50      @Test public void jsRem() throws Exception {
    6.51 -        assertExec("Should be three", "org_apidesign_vm4brwsr_Numbers_remIII", 
    6.52 +        assertExec("Should be three", Numbers.class, "remIII", 
    6.53              Double.valueOf(3.0), 303, 10
    6.54          );
    6.55      }
    6.56      
    6.57      @Test public void deserializeInt() throws Exception {
    6.58          int exp = Numbers.deserInt();
    6.59 -        assertExec("Should be the same", "org_apidesign_vm4brwsr_Numbers_deserIntI", 
    6.60 +        assertExec("Should be the same", Numbers.class, "deserIntI", 
    6.61              Double.valueOf(exp)
    6.62          );
    6.63      }
    6.64  
    6.65      @Test public void deserializeSimpleLong() throws Exception {
    6.66 -        assertExec("Should be 3454", "org_apidesign_vm4brwsr_Numbers_deserLongJAB", 
    6.67 +        assertExec("Should be 3454", Numbers.class, "deserLongJAB", 
    6.68              Double.valueOf(3454), 
    6.69              new byte[] { (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)13, (byte)126 }
    6.70          );
    6.71 @@ -102,7 +97,7 @@
    6.72      
    6.73      @Test public void deserializeFloatInJS() throws Exception {
    6.74          float f = 54324.32423f;
    6.75 -        assertExec("Should be the same", "org_apidesign_vm4brwsr_Numbers_deserFloatF", 
    6.76 +        assertExec("Should be the same", Numbers.class, "deserFloatF", 
    6.77              Double.valueOf(f)
    6.78          );
    6.79      }
    6.80 @@ -115,7 +110,7 @@
    6.81      
    6.82      @Test public void deserializeDoubleInJS() throws Exception {
    6.83          double f = 3.0;
    6.84 -        assertExec("Should be the same", "org_apidesign_vm4brwsr_Numbers_deserDoubleD", f);
    6.85 +        assertExec("Should be the same", Numbers.class, "deserDoubleD", f);
    6.86      }
    6.87      /*
    6.88      @Test public void serDouble() throws IOException {
    6.89 @@ -136,7 +131,7 @@
    6.90      @Test public void fiveInStringJS() throws Exception {
    6.91          String s = Numbers.intToString();
    6.92          assertExec("Should be the same: " + s, 
    6.93 -            "org_apidesign_vm4brwsr_Numbers_intToStringLjava_lang_String", 
    6.94 +            Numbers.class, "intToStringLjava_lang_String", 
    6.95              s
    6.96          );
    6.97      }
    6.98 @@ -144,7 +139,7 @@
    6.99      @Test public void sevenInStringJS() throws Exception {
   6.100          String s = Numbers.floatToString();
   6.101          assertExec("Should be the same: " + s, 
   6.102 -            "org_apidesign_vm4brwsr_Numbers_floatToStringLjava_lang_String", 
   6.103 +            Numbers.class, "floatToStringLjava_lang_String", 
   6.104              s
   6.105          );
   6.106      }
   6.107 @@ -162,15 +157,16 @@
   6.108      }
   6.109  
   6.110      private static void assertExec(
   6.111 -        String msg, String methodName, Object expRes, Object... args) throws Exception {
   6.112 +        String msg, Class<?> clazz, String method, Object expRes, Object... args) throws Exception {
   6.113  
   6.114          Object ret = null;
   6.115          try {
   6.116 -            ret = code.invokeFunction(methodName, args);
   6.117 +            ret = code.invokeFunction(clazz.getName().replace('.', '_'), true);
   6.118 +            ret = code.invokeMethod(ret, method, args);
   6.119          } catch (ScriptException ex) {
   6.120 -            fail("Execution failed in\n" + codeSeq, ex);
   6.121 +            fail("Execution failed in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
   6.122          } catch (NoSuchMethodException ex) {
   6.123 -            fail("Cannot find method in\n" + codeSeq, ex);
   6.124 +            fail("Cannot find method in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
   6.125          }
   6.126          if (ret == null && expRes == null) {
   6.127              return;
   6.128 @@ -181,10 +177,10 @@
   6.129          if (expRes instanceof Double && ret instanceof Double) {
   6.130              double expD = ((Double)expRes).doubleValue();
   6.131              double retD = ((Double)ret).doubleValue();
   6.132 -            assertEquals(retD, expD, 0.000004, msg + " was " + ret + "\n" + codeSeq);
   6.133 +            assertEquals(retD, expD, 0.000004, msg + " was " + ret + "\n" + StaticMethodTest.dumpJS(codeSeq));
   6.134              return;
   6.135          }
   6.136 -        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + codeSeq);
   6.137 +        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + StaticMethodTest.dumpJS(codeSeq));
   6.138      }
   6.139      
   6.140  }
     7.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Sun Nov 25 21:23:06 2012 +0100
     7.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java	Wed Nov 28 17:58:10 2012 +0100
     7.3 @@ -36,7 +36,7 @@
     7.4      @Test public void threePlusFour() throws Exception {
     7.5          assertExec(
     7.6              "Should be seven", 
     7.7 -            "org_apidesign_vm4brwsr_StaticMethod_sumIII", 
     7.8 +            StaticMethod.class, "sumIII", 
     7.9              Double.valueOf(7), 
    7.10              3, 4
    7.11          );
    7.12 @@ -45,7 +45,7 @@
    7.13      @Test public void checkReallyInitializedValues() throws Exception {
    7.14          assertExec(
    7.15              "Return true", 
    7.16 -            "org_apidesign_vm4brwsr_StaticMethod_isNullZ", 
    7.17 +            StaticMethod.class, "isNullZ", 
    7.18              Double.valueOf(1)
    7.19          );
    7.20      }
    7.21 @@ -53,7 +53,7 @@
    7.22      @Test public void powerOfThree() throws Exception {
    7.23          assertExec(
    7.24              "Should be nine", 
    7.25 -            "org_apidesign_vm4brwsr_StaticMethod_powerFF", 
    7.26 +            StaticMethod.class, "powerFF", 
    7.27              Double.valueOf(9),
    7.28              3.0f
    7.29          );
    7.30 @@ -62,7 +62,7 @@
    7.31      @Test public void minusOne() throws Exception {
    7.32          assertExec(
    7.33              "Should be minus one", 
    7.34 -            "org_apidesign_vm4brwsr_StaticMethod_minusOneI", 
    7.35 +            StaticMethod.class, "minusOneI", 
    7.36              Double.valueOf(-1)
    7.37          );
    7.38      }
    7.39 @@ -70,7 +70,7 @@
    7.40      @Test public void doubleWithoutLong() throws Exception {
    7.41          assertExec(
    7.42              "Should be two",
    7.43 -            "org_apidesign_vm4brwsr_StaticMethod_minusDDJ", 
    7.44 +            StaticMethod.class, "minusDDJ", 
    7.45              Double.valueOf(2),
    7.46              3.0d, 1l
    7.47          );
    7.48 @@ -79,7 +79,7 @@
    7.49      @Test public void divAndRound() throws Exception {
    7.50          assertExec(
    7.51              "Should be rounded to one",
    7.52 -            "org_apidesign_vm4brwsr_StaticMethod_divIBD", 
    7.53 +            StaticMethod.class, "divIBD", 
    7.54              Double.valueOf(1),
    7.55              3, 3.75
    7.56          );
    7.57 @@ -87,7 +87,7 @@
    7.58      @Test public void mixedMethodFourParams() throws Exception {
    7.59          assertExec(
    7.60              "Should be two",
    7.61 -            "org_apidesign_vm4brwsr_StaticMethod_mixIIJBD", 
    7.62 +            StaticMethod.class, "mixIIJBD", 
    7.63              Double.valueOf(20),
    7.64              2, 10l, 5, 2.0
    7.65          );
    7.66 @@ -95,7 +95,7 @@
    7.67      @Test public void factRec() throws Exception {
    7.68          assertExec(
    7.69              "Factorial of 5 is 120",
    7.70 -            "org_apidesign_vm4brwsr_StaticMethod_factRecJI", 
    7.71 +            StaticMethod.class, "factRecJI", 
    7.72              Double.valueOf(120),
    7.73              5
    7.74          );
    7.75 @@ -103,7 +103,7 @@
    7.76      @Test public void factIter() throws Exception {
    7.77          assertExec(
    7.78              "Factorial of 5 is 120",
    7.79 -            "org_apidesign_vm4brwsr_StaticMethod_factIterJI", 
    7.80 +            StaticMethod.class, "factIterJI", 
    7.81              Double.valueOf(120),
    7.82              5
    7.83          );
    7.84 @@ -112,7 +112,7 @@
    7.85      @Test public void xor() throws Exception {
    7.86          assertExec(
    7.87              "Xor is 4",
    7.88 -            "org_apidesign_vm4brwsr_StaticMethod_xorJIJ",
    7.89 +            StaticMethod.class, "xorJIJ",
    7.90              Double.valueOf(4),
    7.91              7,
    7.92              3
    7.93 @@ -122,7 +122,7 @@
    7.94      @Test public void or() throws Exception {
    7.95          assertExec(
    7.96              "Or will be 7",
    7.97 -            "org_apidesign_vm4brwsr_StaticMethod_orOrAndJZII",
    7.98 +            StaticMethod.class, "orOrAndJZII",
    7.99              Double.valueOf(7),
   7.100              true,
   7.101              4,
   7.102 @@ -132,14 +132,14 @@
   7.103      @Test public void nullCheck() throws Exception {
   7.104          assertExec(
   7.105              "Returns nothing",
   7.106 -            "org_apidesign_vm4brwsr_StaticMethod_noneLjava_lang_ObjectII",
   7.107 +            StaticMethod.class, "noneLjava_lang_ObjectII",
   7.108              null, 1, 3
   7.109          );
   7.110      }
   7.111      @Test public void and() throws Exception {
   7.112          assertExec(
   7.113              "And will be 3",
   7.114 -            "org_apidesign_vm4brwsr_StaticMethod_orOrAndJZII",
   7.115 +            StaticMethod.class, "orOrAndJZII",
   7.116              Double.valueOf(3),
   7.117              false,
   7.118              7,
   7.119 @@ -149,7 +149,7 @@
   7.120      @Test public void inc4() throws Exception {
   7.121          assertExec(
   7.122              "It will be 4",
   7.123 -            "org_apidesign_vm4brwsr_StaticMethod_inc4I",
   7.124 +            StaticMethod.class, "inc4I",
   7.125              Double.valueOf(4)
   7.126          );
   7.127      }
   7.128 @@ -162,7 +162,7 @@
   7.129      @Test public void shiftLeftInJS() throws Exception {
   7.130          assertExec(
   7.131              "Setting 9th bit",
   7.132 -            "org_apidesign_vm4brwsr_StaticMethod_shiftLeftIII",
   7.133 +            StaticMethod.class, "shiftLeftIII",
   7.134              Double.valueOf(256),
   7.135              1, 8
   7.136          );
   7.137 @@ -176,7 +176,7 @@
   7.138      @Test public void shiftRightInJS() throws Exception {
   7.139          assertExec(
   7.140              "Get -1",
   7.141 -            "org_apidesign_vm4brwsr_StaticMethod_shiftArithmRightIIIZ",
   7.142 +            StaticMethod.class, "shiftArithmRightIIIZ",
   7.143              Double.valueOf(-1),
   7.144              -8, 3, true
   7.145          );
   7.146 @@ -189,7 +189,7 @@
   7.147      @Test public void unsignedShiftRightInJS() throws Exception {
   7.148          assertExec(
   7.149              "Get -1",
   7.150 -            "org_apidesign_vm4brwsr_StaticMethod_shiftArithmRightIIIZ",
   7.151 +            StaticMethod.class, "shiftArithmRightIIIZ",
   7.152              Double.valueOf(1),
   7.153              8, 3, false
   7.154          );
   7.155 @@ -198,7 +198,7 @@
   7.156      @Test public void javaScriptBody() throws Exception {
   7.157          assertExec(
   7.158              "JavaScript string",
   7.159 -            "org_apidesign_vm4brwsr_StaticMethod_i2sLjava_lang_StringII",
   7.160 +            StaticMethod.class, "i2sLjava_lang_StringII",
   7.161              "333",
   7.162              330, 3
   7.163          );
   7.164 @@ -207,7 +207,7 @@
   7.165      @Test public void switchJarda() throws Exception {
   7.166          assertExec(
   7.167              "The expected value",
   7.168 -            "org_apidesign_vm4brwsr_StaticMethod_swtchLjava_lang_StringI",
   7.169 +            StaticMethod.class, "swtchLjava_lang_StringI",
   7.170              "Jarda",
   7.171              0
   7.172          );
   7.173 @@ -216,7 +216,7 @@
   7.174      @Test public void switchDarda() throws Exception {
   7.175          assertExec(
   7.176              "The expected value",
   7.177 -            "org_apidesign_vm4brwsr_StaticMethod_swtchLjava_lang_StringI",
   7.178 +            StaticMethod.class, "swtchLjava_lang_StringI",
   7.179              "Darda",
   7.180              1
   7.181          );
   7.182 @@ -224,7 +224,7 @@
   7.183      @Test public void switchParda() throws Exception {
   7.184          assertExec(
   7.185              "The expected value",
   7.186 -            "org_apidesign_vm4brwsr_StaticMethod_swtch2Ljava_lang_StringI",
   7.187 +            StaticMethod.class, "swtch2Ljava_lang_StringI",
   7.188              "Parda",
   7.189              22
   7.190          );
   7.191 @@ -232,7 +232,7 @@
   7.192      @Test public void switchMarda() throws Exception {
   7.193          assertExec(
   7.194              "The expected value",
   7.195 -            "org_apidesign_vm4brwsr_StaticMethod_swtchLjava_lang_StringI",
   7.196 +            StaticMethod.class, "swtchLjava_lang_StringI",
   7.197              "Marda",
   7.198              -433
   7.199          );
   7.200 @@ -249,16 +249,25 @@
   7.201      }
   7.202      
   7.203      
   7.204 -    private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
   7.205 -        StringBuilder sb = new StringBuilder();
   7.206 -        
   7.207 +    private static void assertExec(
   7.208 +        String msg, Class clazz, String method, 
   7.209 +        Object expRes, Object... args
   7.210 +    ) throws Exception {
   7.211 +        assertExec(code, codeSeq, msg, clazz, method, expRes, args);
   7.212 +    }
   7.213 +    static void assertExec(
   7.214 +        Invocable toRun, CharSequence theCode,
   7.215 +        String msg, Class clazz, String method, 
   7.216 +        Object expRes, Object... args
   7.217 +    ) throws Exception {
   7.218          Object ret = null;
   7.219          try {
   7.220 -            ret = code.invokeFunction(methodName, args);
   7.221 +            ret = toRun.invokeFunction(clazz.getName().replace('.', '_'), true);
   7.222 +            ret = toRun.invokeMethod(ret, method, args);
   7.223          } catch (ScriptException ex) {
   7.224 -            fail("Execution failed in\n" + codeSeq, ex);
   7.225 +            fail("Execution failed in\n" + dumpJS(theCode), ex);
   7.226          } catch (NoSuchMethodException ex) {
   7.227 -            fail("Cannot find method in\n" + codeSeq, ex);
   7.228 +            fail("Cannot find method in\n" + dumpJS(theCode), ex);
   7.229          }
   7.230          if (ret == null && expRes == null) {
   7.231              return;
   7.232 @@ -266,17 +275,25 @@
   7.233          if (expRes != null && expRes.equals(ret)) {
   7.234              return;
   7.235          }
   7.236 -        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + codeSeq);
   7.237 +        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + dumpJS(theCode));
   7.238          
   7.239      }
   7.240  
   7.241      static Invocable compileClass(StringBuilder sb, String... names) throws ScriptException, IOException {
   7.242 +        return compileClass(sb, null, names);
   7.243 +    }
   7.244 +    static Invocable compileClass(
   7.245 +        StringBuilder sb, ScriptEngine[] eng, String... names
   7.246 +    ) throws ScriptException, IOException {
   7.247          if (sb == null) {
   7.248              sb = new StringBuilder();
   7.249          }
   7.250          GenJS.compile(sb, names);
   7.251          ScriptEngineManager sem = new ScriptEngineManager();
   7.252          ScriptEngine js = sem.getEngineByExtension("js");
   7.253 +        if (eng != null) {
   7.254 +            eng[0] = js;
   7.255 +        }
   7.256          try {
   7.257              Object res = js.eval(sb.toString());
   7.258              assertTrue(js instanceof Invocable, "It is invocable object: " + res);
   7.259 @@ -285,7 +302,7 @@
   7.260              if (sb.length() > 2000) {
   7.261                  sb = dumpJS(sb);
   7.262              }
   7.263 -            fail("Could not compile:\n" + sb, ex);
   7.264 +            fail("Could not evaluate:\n" + sb, ex);
   7.265              return null;
   7.266          }
   7.267      }
     8.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java	Sun Nov 25 21:23:06 2012 +0100
     8.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StringSample.java	Wed Nov 28 17:58:10 2012 +0100
     8.3 @@ -64,6 +64,10 @@
     8.4          return h.hashCode();
     8.5      }
     8.6      
     8.7 +    public static boolean isStringInstance() {
     8.8 +        return chars('a', (char)30, 'b') instanceof String;
     8.9 +    }
    8.10 +    
    8.11      public static String insertBuffer() {
    8.12          StringBuilder sb = new StringBuilder();
    8.13          sb.append("Jardo!");
     9.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Sun Nov 25 21:23:06 2012 +0100
     9.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StringTest.java	Wed Nov 28 17:58:10 2012 +0100
     9.3 @@ -31,7 +31,7 @@
     9.4      @Test public void firstChar() throws Exception {
     9.5          assertExec(
     9.6              "First char in Hello is H",
     9.7 -            "org_apidesign_vm4brwsr_StringSample_sayHelloCI",
     9.8 +            StringSample.class, "sayHelloCI",
     9.9              72, 0
    9.10          );
    9.11      }
    9.12 @@ -39,7 +39,7 @@
    9.13      @Test public void fromChars() throws Exception {
    9.14          assertExec(
    9.15              "First char in Hello is ABC",
    9.16 -            "org_apidesign_vm4brwsr_StringSample_fromCharsLjava_lang_StringCCC",
    9.17 +            StringSample.class, "fromCharsLjava_lang_StringCCC",
    9.18              "ABC", 'A', 'B', 'C'
    9.19          );
    9.20      }
    9.21 @@ -47,7 +47,7 @@
    9.22      @Test public void concatChars() throws Exception {
    9.23          assertExec(
    9.24              "Composing yields ABC",
    9.25 -            "org_apidesign_vm4brwsr_StringSample_charsLjava_lang_StringCCC",
    9.26 +            StringSample.class, "charsLjava_lang_StringCCC",
    9.27              "ABC", 'A', 'B', 'C'
    9.28          );
    9.29      }
    9.30 @@ -55,7 +55,7 @@
    9.31      @Test public void concatCharsFromInts() throws Exception {
    9.32          assertExec(
    9.33              "Composing yields ABC",
    9.34 -            "org_apidesign_vm4brwsr_StringSample_charsFromNumbersLjava_lang_String",
    9.35 +            StringSample.class, "charsFromNumbersLjava_lang_String",
    9.36              "ABC"
    9.37          );
    9.38      }
    9.39 @@ -63,15 +63,23 @@
    9.40      @Test public void concatCharsFromChars() throws Exception {
    9.41          assertExec(
    9.42              "Composing yields ABC",
    9.43 -            "org_apidesign_vm4brwsr_StringSample_charsFromCharsLjava_lang_String",
    9.44 +            StringSample.class, "charsFromCharsLjava_lang_String",
    9.45              "ABC"
    9.46          );
    9.47      }
    9.48  
    9.49 +    @Test public void instanceOfWorks() throws Exception {
    9.50 +        assertExec(
    9.51 +            "It is string",
    9.52 +            StringSample.class, "isStringInstanceZ",
    9.53 +            Double.valueOf(1.0)
    9.54 +        );
    9.55 +    }
    9.56 +
    9.57      @Test(timeOut=10000) public void toStringConcatenation() throws Exception {
    9.58          assertExec(
    9.59              "Five executions should generate 5Hello World!",
    9.60 -            "org_apidesign_vm4brwsr_StringSample_toStringTestLjava_lang_StringI",
    9.61 +            StringSample.class, "toStringTestLjava_lang_StringI",
    9.62              "Hello World!5", 5
    9.63          );
    9.64      }
    9.65 @@ -82,7 +90,7 @@
    9.66      @Test(timeOut=10000) public void stringStringConcat() throws Exception {
    9.67          assertExec(
    9.68              "Composes strings OK",
    9.69 -            "org_apidesign_vm4brwsr_StringSample_concatStringsLjava_lang_String",
    9.70 +            StringSample.class, "concatStringsLjava_lang_String",
    9.71              "Hello World!1" + "\\\n\r\t"
    9.72          );
    9.73      }
    9.74 @@ -90,21 +98,21 @@
    9.75      @Test public void equalsAndSubstring() throws Exception {
    9.76          assertExec(
    9.77              "Composes are OK",
    9.78 -            "org_apidesign_vm4brwsr_StringSample_equalToHelloZII",
    9.79 +            StringSample.class, "equalToHelloZII",
    9.80              true, 0, 5
    9.81          );
    9.82      }
    9.83      @Test public void replaceChars() throws Exception {
    9.84          assertExec(
    9.85              "Can replace slashes by underscores",
    9.86 -            "org_apidesign_vm4brwsr_StringSample_replaceLjava_lang_StringLjava_lang_StringCC",
    9.87 +            StringSample.class, "replaceLjava_lang_StringLjava_lang_StringCC",
    9.88              "x_y_z", "x/y/z", '/', '_'
    9.89          );
    9.90      }
    9.91      @Test public void replaceIntChars() throws Exception {
    9.92          assertExec(
    9.93              "Can replace slashes by underscores",
    9.94 -            "org_apidesign_vm4brwsr_StringSample_replaceLjava_lang_StringLjava_lang_StringCC",
    9.95 +            StringSample.class, "replaceLjava_lang_StringLjava_lang_StringCC",
    9.96              "x_y_z", "x/y/z", (int)'/', (int)'_'
    9.97          );
    9.98      }
    9.99 @@ -112,7 +120,7 @@
   9.100      @Test public void insertBuilder() throws Exception {
   9.101          assertExec(
   9.102              "Can insert something into a buffer?",
   9.103 -            "org_apidesign_vm4brwsr_StringSample_insertBufferLjava_lang_String",
   9.104 +            StringSample.class, "insertBufferLjava_lang_String",
   9.105              "Ahojdo!"
   9.106          );
   9.107      }
   9.108 @@ -122,7 +130,7 @@
   9.109          int jh = StringSample.hashCode(j);
   9.110          assertExec(
   9.111              "Hashcode is the same " +jh,
   9.112 -            "org_apidesign_vm4brwsr_StringSample_hashCodeILjava_lang_String",
   9.113 +            StringSample.class, "hashCodeILjava_lang_String",
   9.114              Double.valueOf(jh), j
   9.115          );
   9.116      }
   9.117 @@ -131,28 +139,28 @@
   9.118          int jh = StringSample.hashCode(j);
   9.119          assertExec(
   9.120              "Hashcode is the same " + jh,
   9.121 -            "org_apidesign_vm4brwsr_StringSample_hashCodeILjava_lang_String",
   9.122 +            StringSample.class, "hashCodeILjava_lang_String",
   9.123              Double.valueOf(jh), j
   9.124          );
   9.125      }
   9.126      @Test public void stringSwitch1() throws Exception {
   9.127          assertExec(
   9.128              "Get one",
   9.129 -            "org_apidesign_vm4brwsr_StringSample_stringSwitchILjava_lang_String",
   9.130 +            StringSample.class, "stringSwitchILjava_lang_String",
   9.131              Double.valueOf(1), "jedna"
   9.132          );
   9.133      }
   9.134      @Test public void stringSwitch2() throws Exception {
   9.135          assertExec(
   9.136              "Get two",
   9.137 -            "org_apidesign_vm4brwsr_StringSample_stringSwitchILjava_lang_String",
   9.138 +            StringSample.class, "stringSwitchILjava_lang_String",
   9.139              Double.valueOf(2), "dve"
   9.140          );
   9.141      }
   9.142      @Test public void stringSwitchDefault() throws Exception {
   9.143          assertExec(
   9.144              "Get -1",
   9.145 -            "org_apidesign_vm4brwsr_StringSample_stringSwitchILjava_lang_String",
   9.146 +            StringSample.class, "stringSwitchILjava_lang_String",
   9.147              Double.valueOf(-1), "none"
   9.148          );
   9.149      }
   9.150 @@ -161,7 +169,7 @@
   9.151          assertEquals(StringSample.countAB("Ahoj Bedo!"), 3, "Verify Java code is sane");
   9.152          assertExec(
   9.153              "One A and one B adds to 3",
   9.154 -            "org_apidesign_vm4brwsr_StringSample_countABILjava_lang_String",
   9.155 +            StringSample.class, "countABILjava_lang_String",
   9.156              Double.valueOf(3), "Ahoj Bedo!"
   9.157          );
   9.158          
   9.159 @@ -180,23 +188,10 @@
   9.160          codeSeq = sb;
   9.161      }
   9.162      
   9.163 -    private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
   9.164 -        Object ret = null;
   9.165 -        try {
   9.166 -            ret = code.invokeFunction(methodName, args);
   9.167 -        } catch (ScriptException ex) {
   9.168 -            fail("Execution failed in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
   9.169 -        } catch (NoSuchMethodException ex) {
   9.170 -            fail("Cannot find method in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
   9.171 -        }
   9.172 -        if (ret == null && expRes == null) {
   9.173 -            return;
   9.174 -        }
   9.175 -        if (expRes.equals(ret)) {
   9.176 -            return;
   9.177 -        }
   9.178 -        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + StaticMethodTest.dumpJS(codeSeq));
   9.179 -        
   9.180 +    private static void assertExec(String msg, 
   9.181 +        Class<?> clazz, String method, Object expRes, Object... args
   9.182 +    ) throws Exception {
   9.183 +        StaticMethodTest.assertExec(code, codeSeq, msg, clazz, method, expRes, args);
   9.184      }
   9.185      
   9.186  }
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazy.java	Wed Nov 28 17:58:10 2012 +0100
    10.3 @@ -0,0 +1,68 @@
    10.4 +/**
    10.5 + * Back 2 Browser Bytecode Translator
    10.6 + * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
    10.7 + *
    10.8 + * This program is free software: you can redistribute it and/or modify
    10.9 + * it under the terms of the GNU General Public License as published by
   10.10 + * the Free Software Foundation, version 2 of the License.
   10.11 + *
   10.12 + * This program is distributed in the hope that it will be useful,
   10.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   10.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   10.15 + * GNU General Public License for more details.
   10.16 + *
   10.17 + * You should have received a copy of the GNU General Public License
   10.18 + * along with this program. Look for COPYING file in the top folder.
   10.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
   10.20 + */
   10.21 +package org.apidesign.vm4brwsr;
   10.22 +
   10.23 +import java.io.ByteArrayInputStream;
   10.24 +import java.io.IOException;
   10.25 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
   10.26 +
   10.27 +/**
   10.28 + *
   10.29 + * @author Jaroslav Tulach <jtulach@netbeans.org>
   10.30 + */
   10.31 +class VMLazy extends ByteCodeToJavaScript {
   10.32 +    private final Object vm;
   10.33 +    private final Object global;
   10.34 +    
   10.35 +    private VMLazy(Object global, Object vm, Appendable out) {
   10.36 +        super(out);
   10.37 +        this.vm = vm;
   10.38 +        this.global = global;
   10.39 +    }
   10.40 +    
   10.41 +    static String toJavaScript(Object global, Object vm, byte[] is) throws IOException {
   10.42 +        StringBuilder sb = new StringBuilder();
   10.43 +        new VMLazy(global, vm, sb).compile(new ByteArrayInputStream(is));
   10.44 +        return sb.toString().toString();
   10.45 +    }
   10.46 +
   10.47 +    @JavaScriptBody(args = { "self", "n" }, 
   10.48 +        body=
   10.49 +          "var cls = n.replaceLjava_lang_StringCC(n,'/','_').toString();"
   10.50 +        + "var glb = self.fld_global;"
   10.51 +        + "var vm = self.fld_vm;"
   10.52 +        + "if (glb[cls]) return false;"
   10.53 +        + "glb[cls] = function() {"
   10.54 +        + "  return vm.loadClass(n,cls);"
   10.55 +        + "};"
   10.56 +        + "return true;"
   10.57 +    )
   10.58 +    @Override
   10.59 +    protected boolean requireReference(String internalClassName) {
   10.60 +        throw new UnsupportedOperationException();
   10.61 +    }
   10.62 +
   10.63 +    @Override
   10.64 +    protected void requireScript(String resourcePath) {
   10.65 +    }
   10.66 +
   10.67 +    @Override
   10.68 +    protected String assignClass(String className) {
   10.69 +        return "arguments[0][arguments[1]]=";
   10.70 +    }
   10.71 +}
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMLazyTest.java	Wed Nov 28 17:58:10 2012 +0100
    11.3 @@ -0,0 +1,132 @@
    11.4 +/**
    11.5 + * Back 2 Browser Bytecode Translator
    11.6 + * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
    11.7 + *
    11.8 + * This program is free software: you can redistribute it and/or modify
    11.9 + * it under the terms of the GNU General Public License as published by
   11.10 + * the Free Software Foundation, version 2 of the License.
   11.11 + *
   11.12 + * This program is distributed in the hope that it will be useful,
   11.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
   11.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   11.15 + * GNU General Public License for more details.
   11.16 + *
   11.17 + * You should have received a copy of the GNU General Public License
   11.18 + * along with this program. Look for COPYING file in the top folder.
   11.19 + * If not, see http://opensource.org/licenses/GPL-2.0.
   11.20 + */
   11.21 +package org.apidesign.vm4brwsr;
   11.22 +
   11.23 +import java.io.IOException;
   11.24 +import java.io.InputStream;
   11.25 +import javax.script.Invocable;
   11.26 +import javax.script.ScriptContext;
   11.27 +import javax.script.ScriptEngine;
   11.28 +import javax.script.ScriptException;
   11.29 +import org.testng.annotations.BeforeClass;
   11.30 +import static org.testng.Assert.*;
   11.31 +import org.testng.annotations.Test;
   11.32 +
   11.33 +/** Implements loading class by class.
   11.34 + *
   11.35 + * @author Jaroslav Tulach <jtulach@netbeans.org>
   11.36 + */
   11.37 +public class VMLazyTest {
   11.38 +
   11.39 +    
   11.40 +    private static CharSequence codeSeq;
   11.41 +    private static Invocable code;
   11.42 +
   11.43 +    @BeforeClass
   11.44 +    public void compileTheCode() throws Exception {
   11.45 +        StringBuilder sb = new StringBuilder();
   11.46 +        
   11.47 +        sb.append("\nfunction test(clazz, as, method) {");
   11.48 +        sb.append("\n  var l = new lazyVM(this);");
   11.49 +        sb.append("\n  var c = l.loadClass(clazz, as);");
   11.50 +        sb.append("\n  return c[method]();");
   11.51 +        sb.append("\n}");
   11.52 +        
   11.53 +        
   11.54 +        sb.append("\nfunction lazyVM(global) {");
   11.55 +        sb.append("\n  var self = this;");
   11.56 +        sb.append("\n  var glb = global;");
   11.57 +        sb.append("\n  lazyVM.prototype.loadClass = function(res, name) {");
   11.58 +        sb.append("\n    var script = org_apidesign_vm4brwsr_VMLazy(true)."
   11.59 +            + "toJavaScriptLjava_lang_StringLjava_lang_ObjectLjava_lang_ObjectAB("
   11.60 +            + "  glb, self,"
   11.61 +            + "  loader.get(res + '.class')"
   11.62 +            + ");");
   11.63 +        sb.append("\n    try {");
   11.64 +        sb.append("\n      new Function(script)(self, name);");
   11.65 +        sb.append("\n    } catch (ex) {");
   11.66 +        sb.append("\n      throw 'Cannot compile ' + res + ' error: ' + ex + ' script:\\n' + script;");
   11.67 +        sb.append("\n    };");
   11.68 +        sb.append("\n    return self[name](true);");
   11.69 +        sb.append("\n  };");
   11.70 +        sb.append("\n");
   11.71 +        sb.append("\n}\n");
   11.72 +        
   11.73 +        ScriptEngine[] arr = { null };
   11.74 +        code = StaticMethodTest.compileClass(sb, arr,
   11.75 +            "org/apidesign/vm4brwsr/VMLazy"
   11.76 +        );
   11.77 +        arr[0].getContext().setAttribute("loader", new FindBytes(), ScriptContext.ENGINE_SCOPE);
   11.78 +        codeSeq = sb;
   11.79 +    }
   11.80 +    
   11.81 +    @Test public void invokeStaticMethod() throws Exception {
   11.82 +        assertExec("Trying to get -1", "test", Double.valueOf(-1),
   11.83 +            "org/apidesign/vm4brwsr/StaticMethod", "org_apidesign_vm4brwsr_StaticMethod", "minusOneI"
   11.84 +        );
   11.85 +    }
   11.86 +
   11.87 +    @Test public void loadDependantClass() throws Exception {
   11.88 +        assertExec("Trying to get zero", "test", Double.valueOf(0),
   11.89 +            "org/apidesign/vm4brwsr/InstanceSub", "org_apidesign_vm4brwsr_InstanceSub", "recallDblD"
   11.90 +        );
   11.91 +    }
   11.92 +
   11.93 +    private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
   11.94 +        Object ret = null;
   11.95 +        try {
   11.96 +            ret = code.invokeFunction(methodName, args);
   11.97 +        } catch (ScriptException ex) {
   11.98 +            fail("Execution failed in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
   11.99 +        } catch (NoSuchMethodException ex) {
  11.100 +            fail("Cannot find method in\n" + StaticMethodTest.dumpJS(codeSeq), ex);
  11.101 +        }
  11.102 +        if (ret == null && expRes == null) {
  11.103 +            return;
  11.104 +        }
  11.105 +        if (expRes.equals(ret)) {
  11.106 +            return;
  11.107 +        }
  11.108 +        assertEquals(ret, expRes, msg + "was: " + ret + "\n" + StaticMethodTest.dumpJS(codeSeq));
  11.109 +    }
  11.110 +
  11.111 +    public static final class FindBytes {
  11.112 +        public byte[] get(String name) throws IOException {
  11.113 +            InputStream is = VMLazyTest.class.getClassLoader().getResourceAsStream(name);
  11.114 +            if (is == null) {
  11.115 +                throw new IOException("Can't find " + name);
  11.116 +            }
  11.117 +            byte[] arr = new byte[is.available()];
  11.118 +            int len = is.read(arr);
  11.119 +            if (len != arr.length) {
  11.120 +                throw new IOException("Read only " + len + " wanting " + arr.length);
  11.121 +            }
  11.122 +            /*
  11.123 +            System.err.print("loader['" + name + "'] = [");
  11.124 +            for (int i = 0; i < arr.length; i++) {
  11.125 +                if (i > 0) {
  11.126 +                    System.err.print(", ");
  11.127 +                }
  11.128 +                System.err.print(arr[i]);
  11.129 +            }
  11.130 +            System.err.println("]");
  11.131 +            */
  11.132 +            return arr;
  11.133 +        }
  11.134 +    }
  11.135 +}
    12.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java	Sun Nov 25 21:23:06 2012 +0100
    12.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/VMinVMTest.java	Wed Nov 28 17:58:10 2012 +0100
    12.3 @@ -41,10 +41,8 @@
    12.4          
    12.5          Object ret;
    12.6          try {
    12.7 -            ret = code.invokeFunction(
    12.8 -                "org_apidesign_vm4brwsr_VMinVM_toJavaScriptLjava_lang_StringAB",
    12.9 -                arr
   12.10 -            );
   12.11 +            ret = code.invokeFunction(VMinVM.class.getName().replace('.', '_'), true);
   12.12 +            ret = code.invokeMethod(ret, "toJavaScriptLjava_lang_StringAB", arr);
   12.13          } catch (Exception ex) {
   12.14              File f = File.createTempFile("execution", ".js");
   12.15              FileWriter w = new FileWriter(f);