Chromium Code Reviews| Index: pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart |
| diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart |
| index 94ac7ca8701fa8b1aaa84e1cfcc3f66ddb75452d..755f43cfd9c0a5f095add29c5f367244b9615691 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart |
| @@ -278,14 +278,12 @@ class NsmEmitter extends CodeEmitterHelper { |
| ' objectClassObject = objectClassObject[1];')); |
| } |
| - List<jsAst.Expression> sliceOffsetArguments = |
| + dynamic isIntercepted = // jsAst.Expression or bool. |
|
floitsch
2015/06/19 21:22:15
firstNormalSelector != 0 &&
(firstNormalSelector =
sra1
2015/06/22 20:17:00
You can't use || to pick the jsAst. || is bool*bo
|
| firstNormalSelector == 0 |
| - ? [] |
| - : (firstNormalSelector == shorts.length |
| - ? [js.number(1)] |
| - : [js('(j < #) ? 1 : 0', js.number(firstNormalSelector))]); |
| - |
| - var sliceOffsetParams = sliceOffsetArguments.isEmpty ? [] : ['sliceOffset']; |
| + ? false |
| + : firstNormalSelector == shorts.length |
| + ? true |
| + : js('j < #', js.number(firstNormalSelector)); |
| statements.add(js.statement(''' |
| // If we are loading a deferred library the object class will not be in |
| @@ -294,31 +292,46 @@ class NsmEmitter extends CodeEmitterHelper { |
| if (objectClassObject) { |
| for (var j = 0; j < shortNames.length; j++) { |
| var type = 0; |
| - var short = shortNames[j]; |
| - if (short[0] == "${namer.getterPrefix[0]}") type = 1; |
| - if (short[0] == "${namer.setterPrefix[0]}") type = 2; |
| + var shortName = shortNames[j]; |
| + if (shortName[0] == "${namer.getterPrefix[0]}") type = 1; |
| + if (shortName[0] == "${namer.setterPrefix[0]}") type = 2; |
| // Generate call to: |
| // |
| // createInvocationMirror(String name, internalName, type, |
| // arguments, argumentNames) |
| // |
| - objectClassObject[short] = (function(name, short, |
| - type, #sliceOffsetParams) { |
| - return function() { |
| - return this.#noSuchMethodName(this, |
| - #createInvocationMirror(name, short, type, |
| - Array.prototype.slice.call(arguments, |
| - #sliceOffsetParams), |
| - [])); |
| - } |
| - })(#names[j], short, type, #sliceOffsetArguments); |
| + |
| + // This 'if' is either a static choice or dynamic choice depending on |
| + // 'isIntercepted'. |
| + if (#isIntercepted) { |
| + objectClassObject[shortName] = |
| + (function(name, shortName, type) { |
| + return function(receiver) { |
| + return this.#noSuchMethodName( |
| + receiver, |
| + #createInvocationMirror(name, shortName, type, |
| + Array.prototype.slice.call(arguments, 1), |
|
floitsch
2015/06/19 21:22:15
add comment what the "1" is.
sra1
2015/06/22 20:17:00
Done.
|
| + [])); |
| + } |
| + })(#names[j], shortName, type); |
| + } else { |
| + objectClassObject[shortName] = |
| + (function(name, shortName, type) { |
| + return function() { |
| + return this.#noSuchMethodName( |
| + this, // Could be dummy receiver. |
|
floitsch
2015/06/19 21:22:15
how is that possible?
if the call is not intercept
sra1
2015/06/22 20:17:00
Done.
|
| + #createInvocationMirror(name, shortName, type, |
| + Array.prototype.slice.call(arguments), |
|
Siggi Cherem (dart-lang)
2015/06/19 18:33:22
woudln't this return []? do we need splice here?
sra1
2015/06/19 18:59:38
slice copies a slice of the input.
'arguments' con
Siggi Cherem (dart-lang)
2015/06/19 19:46:00
Then are we missing the 0 argument here? That is:
sra1
2015/06/22 20:17:00
"If begin is omitted, slice begins from index 0."
Siggi Cherem (dart-lang)
2015/06/22 20:37:32
Sorry for all the silly questions here. Apparently
|
| + [])); |
| + } |
| + })(#names[j], shortName, type); |
| + } |
| } |
| }''', { |
| - 'sliceOffsetParams': sliceOffsetParams, |
| 'noSuchMethodName': namer.noSuchMethodName, |
| 'createInvocationMirror': createInvocationMirror, |
| 'names': minify ? 'shortNames' : 'longNames', |
| - 'sliceOffsetArguments': sliceOffsetArguments})); |
| + 'isIntercepted': isIntercepted})); |
| return statements; |
| } |