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

Unified Diff: sdk/lib/_internal/compiler/js_lib/js_helper.dart

Issue 1125083002: dart2js: Access to metadata and types goes through builtins. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 7 months 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: sdk/lib/_internal/compiler/js_lib/js_helper.dart
diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
index 06638615557098b8a4dd667ec2ef8d61e9e6f0de..a014c71895290bae729d69ddf9581d8fb980a284 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
@@ -19,9 +19,7 @@ import 'dart:_js_embedded_names' show
JsBuiltin,
JsGetName,
LEAF_TAGS,
- METADATA,
- NATIVE_SUPERCLASS_TAG_NAME,
- TYPES;
+ NATIVE_SUPERCLASS_TAG_NAME;
import 'dart:collection';
@@ -154,6 +152,20 @@ bool builtinIsSubtype(type, String other) {
JsBuiltin.isSubtype, other, type);
}
+/// Returns the metadata of the given [index].
+@ForceInline()
+getMetadata(int index) {
+ return JS_BUILTIN('returns:var;effects:none;depends:none',
+ JsBuiltin.getMetadata, index);
+}
+
+/// Returns the type of the given [index].
+@ForceInline()
+getType(int index) {
+ return JS_BUILTIN('returns:var;effects:none;depends:none',
+ JsBuiltin.getType, index);
+}
+
/// No-op method that is called to inform the compiler that preambles might
/// be needed when executing the resulting JS file in a command-line
/// JS engine.
@@ -529,8 +541,8 @@ class ReflectionInfo {
metadataIndex = JS('int', '#[# + # + #]', data,
parameter, optionalParameterCount, FIRST_DEFAULT_ARGUMENT);
}
- var metadata = JS_EMBEDDED_GLOBAL('', METADATA);
- return JS('String', '#[#]', metadata, metadataIndex);
+ var name = getMetadata(metadataIndex);
+ return JS('String', '#', name);
}
List<int> parameterMetadataAnnotations(int parameter) {
@@ -613,16 +625,6 @@ class ReflectionInfo {
String get reflectionName => JS('String', r'#.$reflectionName', jsFunction);
}
-getMetadata(int index) {
- var metadata = JS_EMBEDDED_GLOBAL('', METADATA);
- return JS('', '#[#]', metadata, index);
-}
-
-getType(int index) {
- var types = JS_EMBEDDED_GLOBAL('', TYPES);
- return JS('', '#[#]', types, index);
-}
-
class Primitives {
/// Isolate-unique ID for caching [JsClosureMirror.function].
/// Note the initial value is used by the first isolate (or if there are no
@@ -2282,14 +2284,20 @@ abstract class Closure implements Function {
var signatureFunction;
if (JS('bool', 'typeof # == "number"', functionType)) {
- var types = JS_EMBEDDED_GLOBAL('', TYPES);
- // It is ok, if the access is inlined into the JS. The access is safe in
- // and outside the function. In fact we prefer if there is a textual
- // inlining.
+ // We cannot call [getType] here, since the types-metadata might not be
+ // set yet. This is, because fromTearOff might be called for constants
+ // when the program isn't completely set up yet.
+ //
+ // Note that we cannot just textually inline the call
+ // `getType(functionType)` since we cannot guarantee that the (then)
+ // captured variable `functionType` isn't reused.
signatureFunction =
- JS('', '(function(s){return function(){return #[s]}})(#)',
- types,
- functionType);
+ JS('',
+ '''(function(t) {
+ return function(){ return #(t); };
+ })(#)''',
+ RAW_DART_FUNCTION_REF(getType),
+ functionType);
} else if (!isStatic
&& JS('bool', 'typeof # == "function"', functionType)) {
var getReceiver = isIntercepted
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart ('k') | sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698