OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.startup_emitter.model_emitter; | 5 part of dart2js.js_emitter.startup_emitter.model_emitter; |
6 | 6 |
7 /// The name of the property that stores the tear-off getter on a static | 7 /// The name of the property that stores the tear-off getter on a static |
8 /// function. | 8 /// function. |
9 /// | 9 /// |
10 /// This property is only used when isolates are used. | 10 /// This property is only used when isolates are used. |
(...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 isIntercepted = _interceptorData.isInterceptedMethod(element); | 1114 isIntercepted = _interceptorData.isInterceptedMethod(element); |
1115 } | 1115 } |
1116 int requiredParameterCount = 0; | 1116 int requiredParameterCount = 0; |
1117 js.Expression optionalParameterDefaultValues = new js.LiteralNull(); | 1117 js.Expression optionalParameterDefaultValues = new js.LiteralNull(); |
1118 if (method.canBeApplied) { | 1118 if (method.canBeApplied) { |
1119 requiredParameterCount = method.requiredParameterCount; | 1119 requiredParameterCount = method.requiredParameterCount; |
1120 optionalParameterDefaultValues = | 1120 optionalParameterDefaultValues = |
1121 _encodeOptionalParameterDefaultValues(method); | 1121 _encodeOptionalParameterDefaultValues(method); |
1122 } | 1122 } |
1123 | 1123 |
1124 return js.js.statement( | 1124 return js.js.statement(''' |
1125 ''' | |
1126 installTearOff(#container, #getterName, #isStatic, #isIntercepted, | 1125 installTearOff(#container, #getterName, #isStatic, #isIntercepted, |
1127 #requiredParameterCount, #optionalParameterDefaultValues, | 1126 #requiredParameterCount, #optionalParameterDefaultValues, |
1128 #callNames, #funsOrNames, #funType)''', | 1127 #callNames, #funsOrNames, #funType)''', { |
1129 { | 1128 "container": container, |
1130 "container": container, | 1129 "getterName": js.quoteName(method.tearOffName), |
1131 "getterName": js.quoteName(method.tearOffName), | 1130 // 'Truthy' values are ok for `isStatic` and `isIntercepted`. |
1132 // 'Truthy' values are ok for `isStatic` and `isIntercepted`. | 1131 "isStatic": js.number(method.isStatic ? 1 : 0), |
1133 "isStatic": js.number(method.isStatic ? 1 : 0), | 1132 "isIntercepted": js.number(isIntercepted ? 1 : 0), |
1134 "isIntercepted": js.number(isIntercepted ? 1 : 0), | 1133 "requiredParameterCount": js.number(requiredParameterCount), |
1135 "requiredParameterCount": js.number(requiredParameterCount), | 1134 "optionalParameterDefaultValues": optionalParameterDefaultValues, |
1136 "optionalParameterDefaultValues": optionalParameterDefaultValues, | 1135 "callNames": callNameArray, |
1137 "callNames": callNameArray, | 1136 "funsOrNames": funsOrNamesArray, |
1138 "funsOrNames": funsOrNamesArray, | 1137 "funType": method.functionType, |
1139 "funType": method.functionType, | 1138 }); |
1140 }); | |
1141 } | 1139 } |
1142 | 1140 |
1143 /// Wraps the statement in a named function to that it shows up as a unit in | 1141 /// Wraps the statement in a named function to that it shows up as a unit in |
1144 /// profiles. | 1142 /// profiles. |
1145 // TODO(sra): Should this be conditional? | 1143 // TODO(sra): Should this be conditional? |
1146 js.Statement wrapPhase(String name, List<js.Statement> statements) { | 1144 js.Statement wrapPhase(String name, List<js.Statement> statements) { |
1147 js.Block block = new js.Block(statements); | 1145 js.Block block = new js.Block(statements); |
1148 if (statements.isEmpty) return block; | 1146 if (statements.isEmpty) return block; |
1149 return js.js.statement('(function #(){#})();', [name, block]); | 1147 return js.js.statement('(function #(){#})();', [name, block]); |
1150 } | 1148 } |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1296 | 1294 |
1297 js.Expression isHunkInitializedFunction = js.js( | 1295 js.Expression isHunkInitializedFunction = js.js( |
1298 "function(hash) { return !!#deferredInitialized[hash]; }", { | 1296 "function(hash) { return !!#deferredInitialized[hash]; }", { |
1299 'deferredInitialized': generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED) | 1297 'deferredInitialized': generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED) |
1300 }); | 1298 }); |
1301 globals.add(new js.Property( | 1299 globals.add(new js.Property( |
1302 js.string(IS_HUNK_INITIALIZED), isHunkInitializedFunction)); | 1300 js.string(IS_HUNK_INITIALIZED), isHunkInitializedFunction)); |
1303 | 1301 |
1304 /// See [emitEmbeddedGlobalsForDeferredLoading] for the format of the | 1302 /// See [emitEmbeddedGlobalsForDeferredLoading] for the format of the |
1305 /// deferred hunk. | 1303 /// deferred hunk. |
1306 js.Expression initializeLoadedHunkFunction = js.js( | 1304 js.Expression initializeLoadedHunkFunction = js.js(""" |
1307 """ | |
1308 function(hash) { | 1305 function(hash) { |
1309 initializeDeferredHunk($deferredGlobal[hash]); | 1306 initializeDeferredHunk($deferredGlobal[hash]); |
1310 #deferredInitialized[hash] = true; | 1307 #deferredInitialized[hash] = true; |
1311 }""", | 1308 }""", { |
1312 { | 1309 'deferredInitialized': generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED) |
1313 'deferredInitialized': | 1310 }); |
1314 generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED) | |
1315 }); | |
1316 | 1311 |
1317 globals.add(new js.Property( | 1312 globals.add(new js.Property( |
1318 js.string(INITIALIZE_LOADED_HUNK), initializeLoadedHunkFunction)); | 1313 js.string(INITIALIZE_LOADED_HUNK), initializeLoadedHunkFunction)); |
1319 | 1314 |
1320 return globals; | 1315 return globals; |
1321 } | 1316 } |
1322 | 1317 |
1323 /// Emits the [MANGLED_GLOBAL_NAMES] embedded global. | 1318 /// Emits the [MANGLED_GLOBAL_NAMES] embedded global. |
1324 /// | 1319 /// |
1325 /// This global maps minified names for selected classes (some important | 1320 /// This global maps minified names for selected classes (some important |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1498 /// This function is the static equivalent of | 1493 /// This function is the static equivalent of |
1499 /// [NativeGenerator.buildNativeInfoHandler]. | 1494 /// [NativeGenerator.buildNativeInfoHandler]. |
1500 js.Statement emitNativeSupport(Fragment fragment) { | 1495 js.Statement emitNativeSupport(Fragment fragment) { |
1501 List<js.Statement> statements = <js.Statement>[]; | 1496 List<js.Statement> statements = <js.Statement>[]; |
1502 | 1497 |
1503 // The isolate-affinity tag must only be initialized once per program. | 1498 // The isolate-affinity tag must only be initialized once per program. |
1504 if (fragment.isMainFragment && | 1499 if (fragment.isMainFragment && |
1505 NativeGenerator | 1500 NativeGenerator |
1506 .needsIsolateAffinityTagInitialization(_closedWorld.backendUsage)) { | 1501 .needsIsolateAffinityTagInitialization(_closedWorld.backendUsage)) { |
1507 statements.add(NativeGenerator.generateIsolateAffinityTagInitialization( | 1502 statements.add(NativeGenerator.generateIsolateAffinityTagInitialization( |
1508 _closedWorld.backendUsage, | 1503 _closedWorld.backendUsage, generateEmbeddedGlobalAccess, js.js(""" |
1509 generateEmbeddedGlobalAccess, | |
1510 js.js( | |
1511 """ | |
1512 // On V8, the 'intern' function converts a string to a symbol, which | 1504 // On V8, the 'intern' function converts a string to a symbol, which |
1513 // makes property access much faster. | 1505 // makes property access much faster. |
1514 function (s) { | 1506 function (s) { |
1515 var o = {}; | 1507 var o = {}; |
1516 o[s] = 1; | 1508 o[s] = 1; |
1517 return Object.keys(convertToFastObject(o))[0]; | 1509 return Object.keys(convertToFastObject(o))[0]; |
1518 }""", | 1510 }""", []))); |
1519 []))); | |
1520 } | 1511 } |
1521 | 1512 |
1522 Map<String, js.Expression> interceptorsByTag = <String, js.Expression>{}; | 1513 Map<String, js.Expression> interceptorsByTag = <String, js.Expression>{}; |
1523 Map<String, js.Expression> leafTags = <String, js.Expression>{}; | 1514 Map<String, js.Expression> leafTags = <String, js.Expression>{}; |
1524 List<js.Statement> subclassAssignments = <js.Statement>[]; | 1515 List<js.Statement> subclassAssignments = <js.Statement>[]; |
1525 | 1516 |
1526 for (Library library in fragment.libraries) { | 1517 for (Library library in fragment.libraries) { |
1527 for (Class cls in library.classes) { | 1518 for (Class cls in library.classes) { |
1528 if (cls.nativeLeafTags != null) { | 1519 if (cls.nativeLeafTags != null) { |
1529 for (String tag in cls.nativeLeafTags) { | 1520 for (String tag in cls.nativeLeafTags) { |
(...skipping 23 matching lines...) Expand all Loading... |
1553 } | 1544 } |
1554 statements.add(js.js.statement("setOrUpdateInterceptorsByTag(#);", | 1545 statements.add(js.js.statement("setOrUpdateInterceptorsByTag(#);", |
1555 js.objectLiteral(interceptorsByTag))); | 1546 js.objectLiteral(interceptorsByTag))); |
1556 statements.add( | 1547 statements.add( |
1557 js.js.statement("setOrUpdateLeafTags(#);", js.objectLiteral(leafTags))); | 1548 js.js.statement("setOrUpdateLeafTags(#);", js.objectLiteral(leafTags))); |
1558 statements.addAll(subclassAssignments); | 1549 statements.addAll(subclassAssignments); |
1559 | 1550 |
1560 return wrapPhase('nativeSupport', statements); | 1551 return wrapPhase('nativeSupport', statements); |
1561 } | 1552 } |
1562 } | 1553 } |
OLD | NEW |