)]}'
{
  "commit": "941b3b16bb50c60fc6879ef35f4ace293cd6e4e7",
  "tree": "bd6da86b13d1b1b0a422976c970ca825172c9a12",
  "parents": [
    "cbf3b821b588a3b815e41c33d38c96837eac2fcc"
  ],
  "author": {
    "name": "cromwellian@google.com",
    "email": "cromwellian@google.com@8db76d5a-ed1c-0410-87a9-c151d255dfc7",
    "time": "Fri Jul 08 18:51:02 2011 +0000"
  },
  "committer": {
    "name": "cromwellian@google.com",
    "email": "cromwellian@google.com@8db76d5a-ed1c-0410-87a9-c151d255dfc7",
    "time": "Fri Jul 08 18:51:02 2011 +0000"
  },
  "message": "This patch substantially reduces the overhead of Java types in the output by minimizing vtable setup and virtual class literal fetches. Improvements are anywhere from 5% to 10% uncompressed obfuscated JS.\n\nThe patch includes the following changes:\n\n1) A new Immortal CodeGenType. Immortal CodeGenTypes are CodeGenTypes that cannot even be pruned by the final pruner pass. They exist in order to conveniently define code in Java (as opposed to encoding JS in Java strings) which must be injected into the Javascript AST during\nconstruction. They must consist of only static methods and static fields, and static field initializers are only permitted to be literals and JSO.createObject()/createArray(). In addition, they are guaranteed to be hoisted prior to the first non-Immortal type statement.\n\n2) A new SeedUtil Immortal type which provides utility functions for setting up vtables. It eliminates empty constructor seed functions by using 2 helper functions to setup anonymous closure versions. Something like this before the patch:\n\nfunction fooSeed() {}\n_ \u003d fooSeed.prototype \u003d FooConstructor.prototype \u003d new superType();\n_.castableTypeMap \u003d { ... }\n_.getClass \u003d function() {\nreturn classLiteral;\n}\n\nis replaced with\n\ndefineSeed(seedId, superSeedid, { castableTypeMap }, FooConstructor1,\nFooConstructor2, ...)\n\nThis has two effects. First, it reduces both compressed and uncompressed codesize by a non-trivial amount by eliminating empty globally named seed functions which are only used as prototype placeholders. Secondly, it frees up extra obfuscated identifiers (by using numeric ids to identifer function seeds) in the global scope. Note: the seedId is not necessarily the queryId. Third, prototypes can be\nlooked up by seedId.\n\n3) Eliminate of All getClass() overrides. Two designs were tried, one which removes the overrides during AST generation and the other which leaves them in, but removes them later in the compilation. The latter turned out to be simpler and produce some side benefits. This works as follows:\n\nFirst, java.lang.Object is given a new Class\u003c?\u003e clazz field and Object.getClass() returns it.\n\nSecond, the ClassLiteralHolder fields, which are evaluated last, install the appropriate Class instance into this field on the appropriate prototype. That is, the Class.createForClass() method for example, creates a new ClassLiteral, looks up the appropriate prototype, and installs it into the Object.clazz field for that type.\n\nThird, a final pass, just prior to generating the Javascript AST, prunes all getClass() overrides. The overrides are left in during the GenerateJavaAST phase, because it is advantageous to allow some of them to be inlined when\nmethod call tightening allows it, and because it minimizes the amount of changes to ControlFlowAnalyzer. CFA did had\nto be changed to rescue ClassLiterals for any instantiated type, if the getClass() method is live.\n\ndeRPC had to be modified to deal with the new scheme of looking up the prototype/seed function by number instead of name, as well as the new naming scheme when -XdisableClassMetadata is active.\n\nReview at http://gwt-code-reviews.appspot.com/1447821\n\n\ngit-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10435 8db76d5a-ed1c-0410-87a9-c151d255dfc7\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "368acece3d7b8d99765c3f082bde0cfb305cba86",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java",
      "new_id": "97cd1d7f895188e93e75af923d19f44c59e48b0d",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java"
    },
    {
      "type": "modify",
      "old_id": "fc57185dca0fedcee3dffb30df51502bdda86d04",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java",
      "new_id": "78cfb0c987e79de34e71507eaa4313c87dcc9808",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java"
    },
    {
      "type": "modify",
      "old_id": "47906e42ea6d6b25c5ce1200f061667ac978f9c6",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/cfg/StaticPropertyOracle.java",
      "new_id": "a32d252b3ecc7a2fb025ba827e96556c48ea9a0d",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/cfg/StaticPropertyOracle.java"
    },
    {
      "type": "modify",
      "old_id": "ee1c256c23876fda302f263bde3b5b47b0c4dcbe",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/javac/testing/impl/JavaResourceBase.java",
      "new_id": "ea413fb2f57dbafe353fafdbcda6ab1fd9692a9e",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/javac/testing/impl/JavaResourceBase.java"
    },
    {
      "type": "modify",
      "old_id": "bac3201894f3848c3a10cd45d74e4aebb192902a",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java",
      "new_id": "67d86c728b7c8d2b946ab388a55c820b4c9a8ca2",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java"
    },
    {
      "type": "modify",
      "old_id": "1363eb80b71daeac18829f0de2a16a7395b0825c",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java",
      "new_id": "eb6b85e93e0aa0cba544613c16d23de20365fdea",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ab1ca95e84573655b3560f0fb8c4da42d8e36bab",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/ast/JSeedIdOf.java"
    },
    {
      "type": "modify",
      "old_id": "b9095eb0558000e492f685e076516a87b429979f",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java",
      "new_id": "8850cb6082d7d2a88c74299374473e1b38c2db39",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java"
    },
    {
      "type": "modify",
      "old_id": "885d8e707962554a5f420aee2783369d21c90447",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java",
      "new_id": "8e17e97ec439f9ee697ce66441cc514c09a96a91",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/ast/JVisitor.java"
    },
    {
      "type": "modify",
      "old_id": "773008413255c3501a059235ac3b515ec37fb136",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java",
      "new_id": "4c85a0ab51d0678f3e42219fe2620260c28fa471",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java"
    },
    {
      "type": "modify",
      "old_id": "36c534fe0eb4f969f6e34f99549de76e4036b567",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java",
      "new_id": "f9b3aaa5f924e14f10a814876614b291b9e6f99e",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java"
    },
    {
      "type": "modify",
      "old_id": "a522b6ea575461d70c72c0dd4338633d68f3e833",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/FragmentExtractor.java",
      "new_id": "8d75fc9ffebb69da40f20a974bfe6eeae28a9c02",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/FragmentExtractor.java"
    },
    {
      "type": "modify",
      "old_id": "87a6aa7e45c4afe7c25e2c81268a53c186e2f0c6",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java",
      "new_id": "3c4883f5df322f4c29ff22a118095f81c66b5e95",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java"
    },
    {
      "type": "modify",
      "old_id": "287f1c1c17d3f66b72c420c7f272ee4abf417ae2",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java",
      "new_id": "708261bd424b278eda3c42743eac81fbf7fc8150",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java"
    },
    {
      "type": "modify",
      "old_id": "ae2e645f955daaf1deccfc8786be228e70c3ba02",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java",
      "new_id": "831aa256006ffcf62bdc8de25f5095e9c8d19082",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java"
    },
    {
      "type": "modify",
      "old_id": "f525c3ac543d102e3762b52d3a8590f70b364e3e",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java",
      "new_id": "7d31cae5d50bef4d839b3b139c512aec15835a4a",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java"
    },
    {
      "type": "modify",
      "old_id": "89aace3ac14c283ac0eafb2ce577cbcdfcfbe680",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/JavaToJavaScriptMap.java",
      "new_id": "de9e7fa21a2d6f32a922b6cd7d55ee291197dab7",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/JavaToJavaScriptMap.java"
    },
    {
      "type": "modify",
      "old_id": "4375220680bf71cbcdd93e6fe92b65c9971e5861",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java",
      "new_id": "12b72c2b9f46fb8d70383d70a317fdddbed85621",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "18152d0ea1e330b195269d2b85c07b1d1b256226",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/ReplaceGetClassOverrides.java"
    },
    {
      "type": "modify",
      "old_id": "829886fe7de9c842df5024aef22027019dd2bbca",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/jjs/impl/ToStringGenerationVisitor.java",
      "new_id": "691752afba7495f66de026de59dc63c703e063b5",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/jjs/impl/ToStringGenerationVisitor.java"
    },
    {
      "type": "modify",
      "old_id": "2a430a5d6e88e7cbf24f3f09afacfd0c685cba19",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitorWithSizeBreakdown.java",
      "new_id": "834bce70bd79ad00c3e71a84219c33e63acf3dae",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/js/JsSourceGenerationVisitorWithSizeBreakdown.java"
    },
    {
      "type": "modify",
      "old_id": "82a637958e819e4c5083ad78264e2ccd872cefff",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/js/JsStackEmulator.java",
      "new_id": "5df8898c28995347d723ff993488fe263a92bf2c",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/js/JsStackEmulator.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "51d0ed56d68032b2564e522cbd62253d214597ce",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/js/ast/JsSeedIdOf.java"
    },
    {
      "type": "modify",
      "old_id": "e64799f9d892a1b250af5d98e1a85c5b43ac65a7",
      "old_mode": 33188,
      "old_path": "dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java",
      "new_id": "142e462874fa9e2535cc9153aca1ecbb98607fce",
      "new_mode": 33188,
      "new_path": "dev/core/src/com/google/gwt/dev/js/ast/JsVisitor.java"
    },
    {
      "type": "modify",
      "old_id": "60c809f4e0075831aceb11a1f3fa98c93b64e394",
      "old_mode": 33188,
      "old_path": "dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Array.java",
      "new_id": "3c36c55255bd5326c9788680d669bd7805c11bd5",
      "new_mode": 33188,
      "new_path": "dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Array.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bd801042d85609c01bb6beeb81b53deb247de4b4",
      "new_mode": 33188,
      "new_path": "dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/SeedUtil.java"
    },
    {
      "type": "modify",
      "old_id": "187b660e2987857951ea1792fea8280f4e76bf2d",
      "old_mode": 33188,
      "old_path": "dev/core/test/com/google/gwt/dev/jjs/impl/CodeSplitterTest.java",
      "new_id": "d9cdc10243d26b2e70a80dac1f124857250bab5d",
      "new_mode": 33188,
      "new_path": "dev/core/test/com/google/gwt/dev/jjs/impl/CodeSplitterTest.java"
    },
    {
      "type": "modify",
      "old_id": "eb3c55507ee114bc77c443e1b44d0f05b2ee15fe",
      "old_mode": 33188,
      "old_path": "user/src/com/google/gwt/rpc/linker/ClientOracleLinker.java",
      "new_id": "9bd5e36c665731be14451b5bd3790602c203bf36",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/rpc/linker/ClientOracleLinker.java"
    },
    {
      "type": "modify",
      "old_id": "d91c0e3c54a71f36452ac5022a1eae301af9e2f0",
      "old_mode": 33188,
      "old_path": "user/src/com/google/gwt/rpc/server/WebModeClientOracle.java",
      "new_id": "602fabb732b5c341f3a3d8b21348f3c82bd6dba6",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/rpc/server/WebModeClientOracle.java"
    },
    {
      "type": "modify",
      "old_id": "b5716fd719cda43574d70849c78338fceffabfd2",
      "old_mode": 33188,
      "old_path": "user/src/com/google/gwt/rpc/server/WebModePayloadSink.java",
      "new_id": "7e9f431607571d1ea3ed27ebf960cd29f4ce11f0",
      "new_mode": 33188,
      "new_path": "user/src/com/google/gwt/rpc/server/WebModePayloadSink.java"
    },
    {
      "type": "modify",
      "old_id": "d000d2df33d6df0da2ada5f97b269456dcf97357",
      "old_mode": 33188,
      "old_path": "user/super/com/google/gwt/emul/java/lang/Class.java",
      "new_id": "c41f7d3eba3c52d9e0f67f66a3a812a7c4340d01",
      "new_mode": 33188,
      "new_path": "user/super/com/google/gwt/emul/java/lang/Class.java"
    },
    {
      "type": "modify",
      "old_id": "3b8efffca6990d835a7aac57e1bf83054b619bab",
      "old_mode": 33188,
      "old_path": "user/super/com/google/gwt/emul/java/lang/Object.java",
      "new_id": "63717d2d4eda44ed2f1bb268391dbdcc5e268d6f",
      "new_mode": 33188,
      "new_path": "user/super/com/google/gwt/emul/java/lang/Object.java"
    },
    {
      "type": "modify",
      "old_id": "6b1757443812f42ceffe403675d8898e9492c64d",
      "old_mode": 33188,
      "old_path": "user/test/com/google/gwt/emultest/java/util/ArraysTest.java",
      "new_id": "8bc3344377fad4c54a55d6b9c117955c615137fd",
      "new_mode": 33188,
      "new_path": "user/test/com/google/gwt/emultest/java/util/ArraysTest.java"
    }
  ]
}
