Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Generates the code for all used classes in the program. Static fields (even | 8 * Generates the code for all used classes in the program. Static fields (even |
| 9 * in classes) are ignored, since they can be treated as non-class elements. | 9 * in classes) are ignored, since they can be treated as non-class elements. |
| 10 * | 10 * |
| (...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 967 Element appMain, | 967 Element appMain, |
| 968 Element isolateMain) { | 968 Element isolateMain) { |
| 969 String mainAccess = "${namer.isolateStaticClosureAccess(appMain)}"; | 969 String mainAccess = "${namer.isolateStaticClosureAccess(appMain)}"; |
| 970 // Since we pass the closurized version of the main method to | 970 // Since we pass the closurized version of the main method to |
| 971 // the isolate method, we must make sure that it exists. | 971 // the isolate method, we must make sure that it exists. |
| 972 return "${namer.isolateAccess(isolateMain)}($mainAccess)"; | 972 return "${namer.isolateAccess(isolateMain)}($mainAccess)"; |
| 973 } | 973 } |
| 974 | 974 |
| 975 jsAst.Expression generateDispatchPropertyInitialization() { | 975 jsAst.Expression generateDispatchPropertyInitialization() { |
| 976 return js('!#', js.fun([], [ | 976 return js('!#', js.fun([], [ |
| 977 js('var objectProto = Object.prototype'), | 977 |
| 978 // On V8, the 'intern' function converts a string to a symbol, which | |
| 979 // makes property access much faster. | |
| 980 new jsAst.FunctionDeclaration(new jsAst.VariableDeclaration('intern'), | |
| 981 js.fun(['s'], [ | |
| 982 js('var o = {}'), | |
| 983 js('o[s] = 1'), | |
| 984 js.return_(js('Object.keys(convertToFastObject(o))[0]'))])), | |
| 985 | |
| 986 // To ensure that different programs loaded into the same context (page) | |
| 987 // use distinct dispatch properies, we place an object on `Object` to | |
| 988 // contain the names already in use. | |
| 989 js('var tableProperty = "___dart_dispatch_property_names_"'), | |
| 990 js('var usedProperties = Object[tableProperty] ||' | |
| 991 '(Object[tableProperty] = Object.create(null))'), | |
|
floitsch
2014/02/12 15:33:39
We could also just store the counter of the last u
sra1
2014/02/12 22:01:20
Not if every program has an MD5-like root property
| |
| 992 | |
| 993 js('var rootProperty = "${generateDispatchPropertyName(0)}"'), | |
| 978 js.for_('var i = 0', null, 'i++', [ | 994 js.for_('var i = 0', null, 'i++', [ |
| 979 js('var property = "${generateDispatchPropertyName(0)}"'), | 995 js('property = intern(rootProperty + "_" + i + "_")'), |
|
floitsch
2014/02/12 10:38:25
Isn't generateDispatchPropertyName supposed to do
sra1
2014/02/12 22:01:20
The seed was for when I was generating a list of n
| |
| 980 js.if_('i > 0', js('property = rootProperty + "_" + i')), | 996 js.if_('!(property in usedProperties)', [ |
| 981 js.if_('!(property in objectProto)', | 997 js('usedProperties[property] = 1'), |
|
floitsch
2014/02/12 10:38:25
That line seems to be important :)
| |
| 982 js.return_( | 998 js.return_( |
| 983 js('init.dispatchPropertyName = property')))])])()); | 999 js('init.dispatchPropertyName = property'))])])])()); |
| 984 } | 1000 } |
| 985 | 1001 |
| 986 String generateDispatchPropertyName(int seed) { | 1002 String generateDispatchPropertyName(int seed) { |
| 987 // TODO(sra): MD5 of contributing source code or URIs? | 1003 // TODO(sra): MD5 of contributing source code or URIs? |
| 988 return '___dart_dispatch_record_ZxYxX_${seed}_'; | 1004 return '___dart_dispatch_record_ZxYxX_${seed}_'; |
| 989 } | 1005 } |
| 990 | 1006 |
| 991 emitMain(CodeBuffer buffer) { | 1007 emitMain(CodeBuffer buffer) { |
| 992 if (compiler.isMockCompilation) return; | 1008 if (compiler.isMockCompilation) return; |
| 993 Element main = compiler.mainFunction; | 1009 Element main = compiler.mainFunction; |
| (...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1602 String sourceMap = buildSourceMap(mainBuffer, compiledFile); | 1618 String sourceMap = buildSourceMap(mainBuffer, compiledFile); |
| 1603 compiler.outputProvider(name, 'js.map') | 1619 compiler.outputProvider(name, 'js.map') |
| 1604 ..add(sourceMap) | 1620 ..add(sourceMap) |
| 1605 ..close(); | 1621 ..close(); |
| 1606 } | 1622 } |
| 1607 | 1623 |
| 1608 void registerReadTypeVariable(TypeVariableElement element) { | 1624 void registerReadTypeVariable(TypeVariableElement element) { |
| 1609 readTypeVariables.add(element); | 1625 readTypeVariables.add(element); |
| 1610 } | 1626 } |
| 1611 } | 1627 } |
| OLD | NEW |