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

Unified Diff: frog/var_member.dart

Issue 8540030: Fix dispatch on MemberSets to always go dynamic if needed. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 9 years, 1 month 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
« frog/member.dart ('K') | « frog/type.dart ('k') | frog/world.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/var_member.dart
diff --git a/frog/var_member.dart b/frog/var_member.dart
index d09eb6f00a032615496f3d00c9d6cc3b03765cf8..eaf5871385328c86f3bd1cf77ac20b930739cdc0 100644
--- a/frog/var_member.dart
+++ b/frog/var_member.dart
@@ -124,17 +124,16 @@ class VarMethodStub extends VarMember {
void generate(CodeWriter code) {
code.write('$typeName.prototype.$name = ');
- generateBody(code);
- code.writeln(';');
+ generateBody(code, ';');
}
- void generateBody(CodeWriter code) {
+ void generateBody(CodeWriter code, String end) {
if (_useDirectCall(member, args)) {
- code.write('$typeName.prototype.${member.jsname}');
+ code.writeln('$typeName.prototype.${member.jsname}$end');
} else {
code.enterBlock('function(${args.getCode()}) {');
code.writeln('return ${body.code};');
- code.exitBlock('}');
+ code.exitBlock('}$end');
}
}
@@ -192,6 +191,7 @@ class VarMethodSet extends VarMember {
_invokeMembers(MethodGenerator context, Node node) {
if (_fallbackStubs != null) return;
+ var objectStub = null;
_fallbackStubs = [];
for (var member in members) {
// Invoke the member with the stub args (this gives us the method body),
@@ -203,21 +203,26 @@ class VarMethodSet extends VarMember {
// Put the stub on the type directly if possible. Otherwise
// put the stub on Object.prototype.
var type = member.declaringType;
- if (type.library != world.dom && !type.isObject) {
+ if (type.isObject) {
+ objectStub = stub;
+ } else if (type.library != world.dom) {
_addVarStub(type, stub);
} else {
_fallbackStubs.add(stub);
}
}
- // Finally, invoke noSuchMethod
- final target = new Value(world.objectType, 'this', node.span);
- var result = target.invokeNoSuchMethod(context, baseName, node, args);
- var stub = new VarMethodStub(name, null, args, result);
+ // Create a noSuchMethod fallback on Object if needed.
+ // Some methods, like toString and == already have a fallback on Object.
+ if (objectStub == null) {
+ final target = new Value(world.objectType, 'this', node.span);
+ var result = target.invokeNoSuchMethod(context, baseName, node, args);
+ objectStub = new VarMethodStub(name, null, args, result);
+ }
if (_fallbackStubs.length == 0) {
- _addVarStub(world.objectType, stub);
+ _addVarStub(world.objectType, objectStub);
} else {
- _fallbackStubs.add(stub);
+ _fallbackStubs.add(objectStub);
world.gen.corejs.useVarMethod = true;
}
}
@@ -247,11 +252,10 @@ class VarMethodSet extends VarMember {
if (_fallbackStubs.length == 0) return;
code.enterBlock('\$varMethod("$name", {');
- var lastOne = _fallbackStubs[_fallbackStubs.length - 1];
+ var lastOne = _fallbackStubs.last();
for (var stub in _fallbackStubs) {
code.write('"${stub.typeName}": ');
- stub.generateBody(code);
- code.writeln(stub == lastOne ? '' : ',');
+ stub.generateBody(code, stub == lastOne ? '' : ',');
}
code.exitBlock('});');
}
« frog/member.dart ('K') | « frog/type.dart ('k') | frog/world.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698