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 d90caf63373636f2e0ee95f1f3658d0f6354a149..923fd838ee02ebf98d5b2412d842ea0c6c97583b 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,8 +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, Namer namer) { |
+String getReflectionDataParser(String classesCollector, |
+ JavaScriptBackend backend) { |
+ Namer namer = backend.namer; |
+ Compiler compiler = backend.compiler; |
+ Element closureFromTearOff = |
+ compiler.findHelper(const SourceString('closureFromTearOff')); |
String metadataField = '"${namer.metadataField}"'; |
String reflectableField = namer.reflectableField; |
String defaultValuesField = namer.defaultValuesField; |
@@ -80,6 +93,8 @@ String getReflectionDataParser(String classesCollector, Namer namer) { |
globalObject[previousProperty = property] = element; |
functions.push(property); |
init.globalFunctions[property] = element; |
+ } else if (element.constructor === Array) { |
+ addStubs(globalObject, element, property, true); |
} else { |
previousProperty = property; |
var newDesc = {}; |
@@ -103,7 +118,12 @@ String getReflectionDataParser(String classesCollector, Namer namer) { |
} |
optionalMethods[prop] = previousProp; |
} else { |
- newDesc[previousProp = prop] = element[prop]; |
+ var elem = element[prop]; |
+ if (elem != null && elem.constructor === Array) { |
+ addStubs(newDesc, elem, prop, false); |
+ } else { |
+ newDesc[previousProp = prop] = elem; |
+ } |
} |
} |
$classesCollector[property] = [globalObject, newDesc]; |
@@ -115,5 +135,28 @@ String getReflectionDataParser(String classesCollector, Namer namer) { |
libraries.push([name, uri, classes, functions, metadata, fields, isRoot, |
globalObject]); |
} |
+ function addStubs(descriptor, array, name, isStatic) { |
+ descriptor[name] = array[0]; |
+ var getterStubName = array[1]; |
+ if (getterStubName != null) { |
+ print("Patching getter stub " + getterStubName + " " + !!isStatic); |
+ descriptor[getterStubName] = tearOff(array, isStatic); |
+ } |
+ var index = $DEFAULT_ARGUMENTS_INDEX + array[$OPTIONAL_PARAMETER_INDEX]; |
+ while (index < array.length) { |
+ var stub = array[index++]; |
+ if (typeof stub != "function") break; |
+ var stubName = array[index++]; |
+ print("Patching stub " + stubName + " " + !!isStatic); |
+ index++''' // Skip "call" stub. |
+'''; |
+ descriptor[stubName] = stub; |
+ } |
+ } |
+ function tearOff(array, isStatic) { |
+ return function() { |
+ return ${namer.isolateAccess(closureFromTearOff)}(this, array, isStatic); |
+ } |
+ } |
})'''; |
} |