Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2545)

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart

Issue 103863004: Revert "Generate tear-off closures dynamically." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: dart/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
index 7afb5d570fe2c0016b11b777b85180ceaee94562..864f130d9538c355200697d8855360af580ec988 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
@@ -4,139 +4,21 @@
part of dart2js.js_emitter;
-// TODO(ahe): Share these with js_helper.dart.
-const FUNCTION_INDEX = 0;
-const NAME_INDEX = 1;
-const CALL_NAME_INDEX = 2;
-const REQUIRED_PARAMETER_INDEX = 3;
-const OPTIONAL_PARAMETER_INDEX = 4;
-const DEFAULT_ARGUMENTS_INDEX = 5;
-
// TODO(ahe): This code should be integrated in CodeEmitterTask.finishClasses.
-String getReflectionDataParser(String classesCollector,
- JavaScriptBackend backend) {
- Namer namer = backend.namer;
- Compiler compiler = backend.compiler;
- Element closureFromTearOff = compiler.findHelper('closureFromTearOff');
- String tearOffAccess =
- // Default value for mocked-up test libraries.
- 'function () { throw "Helper \'closureFromTearOff\' missing." }';
- if (closureFromTearOff != null) {
- tearOffAccess = namer.isolateAccess(closureFromTearOff);
- }
+String getReflectionDataParser(String classesCollector, Namer namer) {
String metadataField = '"${namer.metadataField}"';
String reflectableField = namer.reflectableField;
-
- // TODO(ahe): Move this string constants to namer.
- String reflectionInfoField = r'$reflectionInfo';
- String reflectionNameField = r'$reflectionName';
- String metadataIndexField = r'$metadataIndex';
-
String defaultValuesField = namer.defaultValuesField;
String methodsWithOptionalArgumentsField =
namer.methodsWithOptionalArgumentsField;
-
- String header = '''
+ return '''
(function (reflectionData) {
- "use strict";
'''
// [map] returns an object literal that V8 shouldn't try to optimize with a
// hidden class. This prevents a potential performance problem where V8 tries
// to build a hidden class for an object used as a hashMap.
'''
function map(x){x={x:x};delete x.x;return x}
-''';
-
-
- /**
- * See [dart2js.js_emitter.ContainerBuilder.addMemberMethod] for format of
- * [array].
- */
- String addStubs = '''
- function addStubs(descriptor, array, name, isStatic,''' // Break long line.
- ''' originalDescriptor, functions) {
- var f, funcs =''' // Break long line.
- ''' [originalDescriptor[name] =''' // Break long line.
- ''' descriptor[name] = f = ${readFunction("array", "$FUNCTION_INDEX")}];
- f.\$stubName = name;
- functions.push(name);
- for (var index = $FUNCTION_INDEX; index < array.length; index += 2) {
- f = array[index + 1];
- if (typeof f != "function") break;
- f.\$stubName = ${readString("array", "index + 2")};
- funcs.push(f);
- if (f.\$stubName) {
- originalDescriptor[f.\$stubName] = descriptor[f.\$stubName] = f;
- functions.push(f.\$stubName);
- }
- }
- for (var i = 0; i < funcs.length; index++, i++) {
- funcs[i].\$callName = ${readString("array", "index + 1")};
- }
- var getterStubName = ${readString("array", "++index")};
- array = array.slice(++index);
- var requiredParameterInfo = ${readInt("array", "0")};
- var requiredParameterCount = requiredParameterInfo >> 1;
- var isAccessor = (requiredParameterInfo & 1) === 1;
- var isSetter = requiredParameterInfo === 3;
- var isGetter = requiredParameterInfo === 1;
- var optionalParameterInfo = ${readInt("array", "1")};
- var optionalParameterCount = optionalParameterInfo >> 1;
- var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
- var functionTypeIndex = ${readFunctionType("array", "2")};
- var isReflectable = array.length > optionalParameterCount + 3;
- if (getterStubName) {
- f = tearOff(funcs, array, isStatic, name);
-'''
- /* Used to create an isolate using spawnFunction.*/
-'''
- if (isStatic) init.globalFunctions[name] = f;
- originalDescriptor[getterStubName] = descriptor[getterStubName] = f;
- funcs.push(f);
- if (getterStubName) functions.push(getterStubName);
- f.\$stubName = getterStubName;
- f.\$callName = null;
- }
- if (isReflectable) {
- for (var i = 0; i < funcs.length; i++) {
- funcs[i].$reflectableField = 1;
- funcs[i].$reflectionInfoField = array;
- }
- }
- if (isReflectable) {
- var unmangledNameIndex =''' // Break long line.
- ''' optionalParameterCount * 2 + requiredParameterCount + 3;
- var unmangledName = ${readString("array", "unmangledNameIndex")};
- var reflectionName =''' // Break long line.
- ''' unmangledName + ":" + requiredParameterCount +''' // Break long line.
- ''' ":" + optionalParameterCount;
- if (isGetter) {
- reflectionName = unmangledName;
- } else if (isSetter) {
- reflectionName = unmangledName + "=";
- }
- if (isStatic) {
- init.mangledGlobalNames[name] = reflectionName;
- } else {
- init.mangledNames[name] = reflectionName;
- }
- funcs[0].$reflectionNameField = reflectionName;
- funcs[0].$metadataIndexField = unmangledNameIndex + 1;
- if (optionalParameterCount) descriptor[unmangledName + "*"] = funcs[0];
- }
- }
-''';
-
- String tearOff = '''
- function tearOff(funcs, reflectionInfo, isStatic, name) {
- return function() {
- return $tearOffAccess(''' // Break long line.
- '''this, funcs, reflectionInfo, isStatic, arguments, name);
- }
- }
-''';
-
- String init = '''
if (!init.libraries) init.libraries = [];
if (!init.mangledNames) init.mangledNames = map();
if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
@@ -171,9 +53,6 @@ String getReflectionDataParser(String classesCollector,
var fields = descriptor && descriptor[""];
var classes = [];
var functions = [];
-''';
-
- String processStatics = '''
function processStatics(descriptor) {
for (var property in descriptor) {
if (!hasOwnProperty.call(descriptor, property)) continue;
@@ -184,9 +63,9 @@ String getReflectionDataParser(String classesCollector,
if (firstChar === "+") {
mangledGlobalNames[previousProperty] = property.substring(1);
if (descriptor[property] == 1) ''' // Break long line.
- '''descriptor[previousProperty].$reflectableField = 1;
+'''descriptor[previousProperty].$reflectableField = 1;
if (element && element.length) ''' // Break long line.
- '''init.typeInformation[previousProperty] = element;
+'''init.typeInformation[previousProperty] = element;
} else if (firstChar === "@") {
property = property.substring(1);
${namer.currentIsolate}[property][$metadataField] = element;
@@ -201,9 +80,6 @@ String getReflectionDataParser(String classesCollector,
globalObject[previousProperty = property] = element;
functions.push(property);
init.globalFunctions[property] = element;
- } else if (element.constructor === Array) {
- addStubs(globalObject, element, property, ''' // Break long line.
- '''true, descriptor, functions);
} else {
previousProperty = property;
var newDesc = {};
@@ -216,7 +92,7 @@ String getReflectionDataParser(String classesCollector,
} else if (firstChar === "+") {
mangledNames[previousProp] = prop.substring(1);
if (element[prop] == 1) ''' // Break long line.
- '''element[previousProp].$reflectableField = 1;
+'''element[previousProp].$reflectableField = 1;
} else if (firstChar === "@" && prop !== "@") {
newDesc[prop.substring(1)][$metadataField] = element[prop];
} else if (firstChar === "*") {
@@ -227,14 +103,7 @@ String getReflectionDataParser(String classesCollector,
}
optionalMethods[prop] = previousProp;
} else {
- var elem = element[prop];
- if (prop && elem != null &&''' // Break long line.
- ''' elem.constructor === Array &&''' // Break long line.
- ''' prop !== "<>") {
- addStubs(newDesc, elem, prop, false, element, []);
- } else {
- newDesc[previousProp = prop] = elem;
- }
+ newDesc[previousProp = prop] = element[prop];
}
}
$classesCollector[property] = [globalObject, newDesc];
@@ -242,55 +111,9 @@ String getReflectionDataParser(String classesCollector,
}
}
}
-''';
-
-String footer = '''
processStatics(descriptor);
libraries.push([name, uri, classes, functions, metadata, fields, isRoot,
globalObject]);
}
-})
-''';
-
- return '$header$processStatics$addStubs$tearOff$init$footer';
-}
-
-String readString(String array, String index) {
- return readChecked(
- array, index, 'result != null && typeof result != "string"', 'string');
-}
-
-String readInt(String array, String index) {
- return readChecked(
- array, index,
- 'result != null && (typeof result != "number" || (result|0) !== result)',
- 'int');
-}
-
-String readFunction(String array, String index) {
- return readChecked(
- array, index, 'result != null && typeof result != "function"',
- 'function');
-}
-
-String readFunctionType(String array, String index) {
- return readChecked(
- array, index,
- 'result != null && '
- '(typeof result != "number" || (result|0) !== result) && '
- 'typeof result != "function"',
- 'function or int');
-}
-
-String readChecked(String array, String index, String check, String type) {
- return '''
-(function() {
- var result = $array[$index];
- if ($check) {
- throw new Error(
- name + ": expected value of type \'$type\' at index " + ($index) +
- " but got " + (typeof result));
- }
- return result;
-})()''';
+})''';
}

Powered by Google App Engine
This is Rietveld 408576698