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

Unified Diff: lib/src/compiler/code_generator.dart

Issue 2037473002: Check for extension methods when using whitelist (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/compiler/code_generator.dart
diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart
index d8dc934cd76b0d39a77b0de86dcfe1a200876459..91b49b9b372516d8c13c7921f342ee433e29e4c0 100644
--- a/lib/src/compiler/code_generator.dart
+++ b/lib/src/compiler/code_generator.dart
@@ -2532,7 +2532,13 @@ class CodeGenerator extends GeneralizingAstVisitor
if (target != null && DynamicInvoke.get(target)) {
if (_inWhitelistCode(lhs)) {
- return _visit(rhs).toAssignExpression(_visit(lhs));
+ var vars = <JS.MetaLetVariable, JS.Expression>{};
+ var l = _visit(_bindValue(vars, 'l', target));
+ var name = _emitMemberName(id.name);
+ return new JS.MetaLet(vars, [
+ js.call('(#[(#[dart._extensionType]) ? dartx[#] : #] = #)',
+ [l, l, name, name, _visit(rhs)])
+ ]);
}
return js.call('dart.dput(#, #, #)',
[_visit(target), _emitMemberName(id.name), _visit(rhs)]);
@@ -2665,7 +2671,12 @@ class CodeGenerator extends GeneralizingAstVisitor
JS.Expression jsTarget = _visit(target);
if (DynamicInvoke.get(target) || DynamicInvoke.get(node.methodName)) {
if (_inWhitelistCode(target)) {
- jsTarget = new JS.PropertyAccess(jsTarget, memberName);
+ var vars = <JS.MetaLetVariable, JS.Expression>{};
+ var l = _visit(_bindValue(vars, 'l', target));
+ jsTarget = new JS.MetaLet(vars, [
+ js.call('(#[(#[dart._extensionType]) ? dartx[#] : #])',
+ [l, l, memberName, memberName,])
+ ]);
if (typeArgs != null) jsTarget = new JS.Call(jsTarget, typeArgs);
return new JS.Call(jsTarget, args);
}
@@ -3880,7 +3891,12 @@ class CodeGenerator extends GeneralizingAstVisitor
type: getStaticType(target), isStatic: isStatic);
if (DynamicInvoke.get(target)) {
if (_inWhitelistCode(target)) {
- return js.call('#.#', [_visit(target), name]);
+ var vars = <JS.MetaLetVariable, JS.Expression>{};
+ var l = _visit(_bindValue(vars, 'l', target));
+ return new JS.MetaLet(vars, [
+ js.call('(#[dart._extensionType]) ? #[dartx[#]] : #.#',
+ [l, l, name, l, name])
+ ]);
}
return js.call('dart.dload(#, #)', [_visit(target), name]);
}
@@ -3926,15 +3942,20 @@ class CodeGenerator extends GeneralizingAstVisitor
var type = getStaticType(target);
var memberName = _emitMemberName(name, unary: args.isEmpty, type: type);
if (DynamicInvoke.get(target)) {
+ if (_inWhitelistCode(target)) {
+ var vars = <JS.MetaLetVariable, JS.Expression>{};
+ var l = _visit(_bindValue(vars, 'l', target));
+ return new JS.MetaLet(vars, [
+ js.call('(#[(#[dart._extensionType]) ? dartx[#] : #])(#)',
+ [l, l, memberName, memberName, _visitList(args)])
+ ]);
+ return new JS.Call(jsTarget, args);
+ }
// dynamic dispatch
var dynamicHelper = const {'[]': 'dindex', '[]=': 'dsetindex'}[name];
if (dynamicHelper != null) {
return js.call(
'dart.$dynamicHelper(#, #)', [_visit(target), _visitList(args)]);
- }
- if (_inWhitelistCode(target)) {
- return js
- .call('#.#(#)', [_visit(target), memberName, _visitList(args)]);
} else {
return js.call('dart.dsend(#, #, #)',
[_visit(target), memberName, _visitList(args)]);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698