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 |