Using function callback so we can assign the vm attribute in a non-string way and obfuscation applies to it.
1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Thu Sep 25 23:48:41 2014 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Fri Sep 26 08:28:11 2014 +0200
1.3 @@ -731,15 +731,15 @@
1.4 append(
1.5 "\n}, function(exports) {\n"
1.6 + " var vm = {};\n");
1.7 - append(" function link(n) {\n"
1.8 + append(" function link(n, assign) {\n"
1.9 + " return function() {\n"
1.10 + " var cls = n['replace__Ljava_lang_String_2CC']"
1.11 + "('/', '_').toString();\n"
1.12 + " var dot = n['replace__Ljava_lang_String_2CC']"
1.13 + "('/', '.').toString();\n"
1.14 + " exports.loadClass(dot);\n"
1.15 - + " vm[cls] = exports[cls];\n"
1.16 - + " return vm[cls](arguments);\n"
1.17 + + " assign(exports[cls]);\n"
1.18 + + " return exports[cls](arguments);\n"
1.19 + " };\n"
1.20 + " };\n"
1.21 );
1.22 @@ -753,11 +753,11 @@
1.23 @Override
1.24 protected String generateClass(String className) throws IOException {
1.25 if (isExternalClass(className)) {
1.26 - append("\n").append(assignClass(
1.27 - className.replace('/', '_')))
1.28 + final String cls = className.replace('/', '_');
1.29 + append("\n").append(assignClass(cls))
1.30 .append("link('")
1.31 .append(className)
1.32 - .append("');");
1.33 + .append("', function(f) { ").append(assignClass(cls)).append(" f; });");
1.34
1.35 return null;
1.36 }
1.37 @@ -782,7 +782,8 @@
1.38 out.append("\nvm.").append(cls).append(" = function() {");
1.39 out.append("\n var instance = arguments.length == 0 || arguments[0] === true;");
1.40 out.append("\n delete vm.").append(cls).append(";");
1.41 - out.append("\n return link('").append(n).append("')(instance);");
1.42 + out.append("\n return link('").append(n).append("', function(f) { vm.");
1.43 + out.append(cls).append(" = f;})(instance);");
1.44 out.append("\n}");
1.45 }
1.46 }