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

Side by Side Diff: dart/sdk/lib/_internal/lib/js_mirrors.dart

Issue 16817002: Be smarter about when disabling tree-shaking. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 library dart._js_mirrors; 5 library dart._js_mirrors;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:mirrors'; 8 import 'dart:mirrors';
9 9
10 import 'dart:_foreign_helper' show JS, JS_CURRENT_ISOLATE; 10 import 'dart:_foreign_helper' show JS, JS_CURRENT_ISOLATE;
11 import 'dart:_collection-dev' as _symbol_dev; 11 import 'dart:_collection-dev' as _symbol_dev;
12 import 'dart:_js_helper' show 12 import 'dart:_js_helper' show
13 BoundClosure, 13 BoundClosure,
14 Closure, 14 Closure,
15 JSInvocationMirror, 15 JSInvocationMirror,
16 Null, 16 Null,
17 Primitives, 17 Primitives,
18 RuntimeError, 18 RuntimeError,
19 createInvocationMirror; 19 createInvocationMirror;
20 import 'dart:_interceptors' show Interceptor; 20 import 'dart:_interceptors' show Interceptor;
21 21
22 String getName(Symbol symbol) => n(symbol); 22 /// No-op method that is called to inform the compiler that
23 /// tree-shaking needs to be disabled.
24 disableTreeShaking() => preserveNames();
25
26 /// No-op method that is called to infrom the compiler that unmangled
ngeoffray 2013/06/12 19:38:42 infrom -> inform
ahe 2013/06/14 12:00:22 Done.
27 /// named must be preserved.
28 preserveNames() {}
29
30 String getName(Symbol symbol) {
31 preserveNames();
32 return n(symbol);
33 }
23 34
24 final Map<String, String> mangledNames = JsMirrorSystem.computeMangledNames(); 35 final Map<String, String> mangledNames = JsMirrorSystem.computeMangledNames();
25 36
26 final Map<String, String> reflectiveNames = 37 final Map<String, String> reflectiveNames =
27 JsMirrorSystem.computeReflectiveNames(); 38 JsMirrorSystem.computeReflectiveNames();
28 39
29 class JsMirrorSystem implements MirrorSystem { 40 class JsMirrorSystem implements MirrorSystem {
30 TypeMirror get dynamicType => _dynamicType; 41 TypeMirror get dynamicType => _dynamicType;
31 TypeMirror get voidType => _voidType; 42 TypeMirror get voidType => _voidType;
32 43
33 final static TypeMirror _dynamicType = 44 final static TypeMirror _dynamicType =
34 new JsTypeMirror(const Symbol('dynamic')); 45 new JsTypeMirror(const Symbol('dynamic'));
35 final static TypeMirror _voidType = new JsTypeMirror(const Symbol('void')); 46 final static TypeMirror _voidType = new JsTypeMirror(const Symbol('void'));
36 47
37 static final Map<String, List<LibraryMirror>> librariesByName = 48 static final Map<String, List<LibraryMirror>> librariesByName =
38 computeLibrariesByName(); 49 computeLibrariesByName();
39 50
40 Iterable<LibraryMirror> findLibrary(Symbol libraryName) { 51 Iterable<LibraryMirror> findLibrary(Symbol libraryName) {
41 return new List<LibraryMirror>.from(librariesByName[n(libraryName)]); 52 return new List<LibraryMirror>.from(librariesByName[n(libraryName)]);
42 } 53 }
43 54
44 static Map<String, List<LibraryMirror>> computeLibrariesByName() { 55 static Map<String, List<LibraryMirror>> computeLibrariesByName() {
56 disableTreeShaking();
45 var result = new Map<String, List<LibraryMirror>>(); 57 var result = new Map<String, List<LibraryMirror>>();
46 var jsLibraries = JS('=List|Null', 'init.libraries'); 58 var jsLibraries = JS('=List|Null', 'init.libraries');
47 if (jsLibraries == null) return result; 59 if (jsLibraries == null) return result;
48 for (List data in jsLibraries) { 60 for (List data in jsLibraries) {
49 String name = data[0]; 61 String name = data[0];
50 Uri uri = Uri.parse(data[1]); 62 Uri uri = Uri.parse(data[1]);
51 List<String> classes = data[2]; 63 List<String> classes = data[2];
52 List<String> functions = data[3]; 64 List<String> functions = data[3];
53 var metadataFunction = data[4]; 65 var metadataFunction = data[4];
54 List metadata = (metadataFunction == null) 66 List metadata = (metadataFunction == null)
55 ? null : JS('List', '#()', metadataFunction); 67 ? null : JS('List', '#()', metadataFunction);
56 var libraries = result.putIfAbsent(name, () => <LibraryMirror>[]); 68 var libraries = result.putIfAbsent(name, () => <LibraryMirror>[]);
57 libraries.add( 69 libraries.add(
58 new JsLibraryMirror(s(name), uri, classes, functions, metadata)); 70 new JsLibraryMirror(s(name), uri, classes, functions, metadata));
59 } 71 }
60 return result; 72 return result;
61 } 73 }
62 74
63 static Map<String, String> computeMangledNames() { 75 static Map<String, String> computeMangledNames() {
76 disableTreeShaking();
64 var mangledNames = JS('', 'init.mangledNames'); 77 var mangledNames = JS('', 'init.mangledNames');
65 var keys = extractKeys(mangledNames); 78 var keys = extractKeys(mangledNames);
66 var result = <String, String>{}; 79 var result = <String, String>{};
67 for (String key in keys) { 80 for (String key in keys) {
68 result[key] = JS('String', '#[#]', mangledNames, key); 81 result[key] = JS('String', '#[#]', mangledNames, key);
69 } 82 }
70 return result; 83 return result;
71 } 84 }
72 85
73 static Map<String, String> computeReflectiveNames() { 86 static Map<String, String> computeReflectiveNames() {
87 disableTreeShaking();
74 var result = <String, String>{}; 88 var result = <String, String>{};
75 mangledNames.forEach((String mangledName, String reflectiveName) { 89 mangledNames.forEach((String mangledName, String reflectiveName) {
76 result[reflectiveName] = mangledName; 90 result[reflectiveName] = mangledName;
77 }); 91 });
78 return result; 92 return result;
79 } 93 }
80 } 94 }
81 95
82 class JsTypeMirror implements TypeMirror { 96 class JsTypeMirror implements TypeMirror {
83 final Symbol simpleName; 97 final Symbol simpleName;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 } 207 }
194 } 208 }
195 209
196 final Expando<ClassMirror> classMirrors = new Expando<ClassMirror>(); 210 final Expando<ClassMirror> classMirrors = new Expando<ClassMirror>();
197 211
198 ClassMirror reflectType(Type key) { 212 ClassMirror reflectType(Type key) {
199 return reflectClassByName(s('$key'.split('<')[0])); 213 return reflectClassByName(s('$key'.split('<')[0]));
200 } 214 }
201 215
202 ClassMirror reflectClassByName(Symbol symbol) { 216 ClassMirror reflectClassByName(Symbol symbol) {
217 disableTreeShaking();
203 String className = n(symbol); 218 String className = n(symbol);
204 var constructor = Primitives.getConstructor(className); 219 var constructor = Primitives.getConstructor(className);
205 if (constructor == null) { 220 if (constructor == null) {
206 // Probably an intercepted class. 221 // Probably an intercepted class.
207 // TODO(ahe): How to handle intercepted classes? 222 // TODO(ahe): How to handle intercepted classes?
208 throw new UnsupportedError('Cannot find class for: $className'); 223 throw new UnsupportedError('Cannot find class for: $className');
209 } 224 }
210 var descriptor = JS('', '#["@"]', constructor); 225 var descriptor = JS('', '#["@"]', constructor);
211 var fields; 226 var fields;
212 var fieldsMetadata; 227 var fieldsMetadata;
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 if (code >= 123 && code <= 126) return code - 117; 581 if (code >= 123 && code <= 126) return code - 117;
567 if (code >= 37 && code <= 43) return code - 27; 582 if (code >= 37 && code <= 43) return code - 27;
568 return 0; 583 return 0;
569 } 584 }
570 } 585 }
571 586
572 class JsClosureMirror extends JsInstanceMirror implements ClosureMirror { 587 class JsClosureMirror extends JsInstanceMirror implements ClosureMirror {
573 JsClosureMirror(reflectee) : super(reflectee); 588 JsClosureMirror(reflectee) : super(reflectee);
574 589
575 MethodMirror get function { 590 MethodMirror get function {
591 disableTreeShaking();
576 // TODO(ahe): What about optional parameters (named or not). 592 // TODO(ahe): What about optional parameters (named or not).
577 var extractCallName = JS('', r''' 593 var extractCallName = JS('', r'''
578 function(reflectee) { 594 function(reflectee) {
579 for (var property in reflectee) { 595 for (var property in reflectee) {
580 if ("call$" == property.substring(0, 5)) return property; 596 if ("call$" == property.substring(0, 5)) return property;
581 } 597 }
582 return null; 598 return null;
583 } 599 }
584 '''); 600 ''');
585 String callName = JS('String|Null', '#(#)', extractCallName, reflectee); 601 String callName = JS('String|Null', '#(#)', extractCallName, reflectee);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 List extractKeys(victim) { 715 List extractKeys(victim) {
700 return JS('List', ''' 716 return JS('List', '''
701 (function(victim, hasOwnProperty) { 717 (function(victim, hasOwnProperty) {
702 var result = []; 718 var result = [];
703 for (var key in victim) { 719 for (var key in victim) {
704 if (hasOwnProperty.call(victim, key)) result.push(key); 720 if (hasOwnProperty.call(victim, key)) result.push(key);
705 } 721 }
706 return result; 722 return result;
707 })(#, Object.prototype.hasOwnProperty)''', victim); 723 })(#, Object.prototype.hasOwnProperty)''', victim);
708 } 724 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698