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

Side by Side Diff: pkg/compiler/lib/src/js_emitter/class_stub_generator.dart

Issue 865223002: dart2js: store call stubs in the model. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 11 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/js_emitter/model.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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; 5 part of dart2js.js_emitter;
6 6
7 class ClassStubGenerator { 7 class ClassStubGenerator {
8 final Namer namer; 8 final Namer namer;
9 final Compiler compiler; 9 final Compiler compiler;
10 final JavaScriptBackend backend; 10 final JavaScriptBackend backend;
(...skipping 22 matching lines...) Expand all
33 } 33 }
34 34
35 jsAst.Expression generateSetter(Element member, String fieldName) { 35 jsAst.Expression generateSetter(Element member, String fieldName) {
36 ClassElement cls = member.enclosingClass; 36 ClassElement cls = member.enclosingClass;
37 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; 37 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this';
38 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; 38 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : [];
39 // TODO(floitsch): remove 'return'? 39 // TODO(floitsch): remove 'return'?
40 return js('function(#, v) { return #.# = v; }', 40 return js('function(#, v) { return #.# = v; }',
41 [args, receiver, fieldName]); 41 [args, receiver, fieldName]);
42 } 42 }
43
44 /**
45 * Documentation wanted -- johnniwinther
46 *
47 * Invariant: [member] must be a declaration element.
48 */
49 Map<String, jsAst.Expression> generateCallStubsForGetter(
floitsch 2015/01/22 15:51:14 directly copied except for marked changes.
50 Element member, Set<Selector> selectors) {
51 assert(invariant(member, member.isDeclaration));
52
53 // If the method is intercepted, the stub gets the
54 // receiver explicitely and we need to pass it to the getter call.
55 bool isInterceptedMethod = backend.isInterceptedMethod(member);
56 bool isInterceptorClass =
57 backend.isInterceptorClass(member.enclosingClass);
58
59 const String receiverArgumentName = r'$receiver';
60
61 jsAst.Expression buildGetter() {
62 jsAst.Expression receiver =
63 js(isInterceptorClass ? receiverArgumentName : 'this');
64 if (member.isGetter) {
65 String getterName = namer.getterName(member);
66 if (isInterceptedMethod) {
67 return js('this.#(#)', [getterName, receiver]);
68 }
69 return js('#.#()', [receiver, getterName]);
70 } else {
71 String fieldName = namer.instanceFieldPropertyName(member);
72 return js('#.#', [receiver, fieldName]);
73 }
74 }
75
76 Map<String, jsAst.Expression> generatedStubs = <String, jsAst.Expression>{};
77
78 // Two selectors may match but differ only in type. To avoid generating
79 // identical stubs for each we track untyped selectors which already have
80 // stubs.
81 Set<Selector> generatedSelectors = new Set<Selector>();
82 for (Selector selector in selectors) {
83 if (selector.applies(member, compiler.world)) {
84 selector = selector.asUntyped;
85 if (generatedSelectors.contains(selector)) continue;
86 generatedSelectors.add(selector);
87
88 String invocationName = namer.invocationName(selector);
89 Selector callSelector = new Selector.callClosureFrom(selector);
90 String closureCallName = namer.invocationName(callSelector);
91
92 List<jsAst.Parameter> parameters = <jsAst.Parameter>[];
93 List<jsAst.Expression> arguments = <jsAst.Expression>[];
94 if (isInterceptedMethod) {
95 parameters.add(new jsAst.Parameter(receiverArgumentName));
96 }
97
98 for (int i = 0; i < selector.argumentCount; i++) {
99 String name = 'arg$i';
100 parameters.add(new jsAst.Parameter(name));
101 arguments.add(js('#', name));
102 }
103
104 jsAst.Fun function = js(
105 'function(#) { return #.#(#); }',
106 [ parameters, buildGetter(), closureCallName, arguments]);
107
108 generatedStubs[invocationName] = function;
floitsch 2015/01/22 15:51:14 changes here and following lines.
109 }
110 }
111
112 return generatedStubs;
113 }
43 } 114 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/js_emitter/model.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698