Skip to content
This repository was archived by the owner on Aug 24, 2022. It is now read-only.

Commit 170c5d6

Browse files
committed
Use methodKey accessor to eliminate closures in signature calls.
1 parent cf5b23e commit 170c5d6

2 files changed

Lines changed: 48 additions & 17 deletions

File tree

JSIL.Libraries/Sources/JSIL.Core.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8081,6 +8081,10 @@ JSIL.InterfaceMethod = function (typeObject, methodName, methodInfo) {
80818081
return this.signature != null ? JSIL.$GetSignaturePrefixForType(typeObject) + this.methodNonQualifiedKey : this.qualifiedName;
80828082
});
80838083

8084+
JSIL.SetLazyValueProperty(this, "methodKeyNonVirtual", function () {
8085+
return "i$" + this.methodKey;
8086+
});
8087+
80848088
JSIL.SetLazyValueProperty(this, "methodNonQualifiedKey", function () {
80858089
return this.signature != null ? this.signature.GetNamedKey(this.methodName, true) : this.methodName;
80868090
});
@@ -8263,7 +8267,7 @@ JSIL.InterfaceMethod.prototype.$MakeCallMethod = function (isVirtual, isStatic)
82638267
? "CallVariantInterface"
82648268
: "CallInterface");
82658269

8266-
var methodKey = isStatic? this.methodNonQualifiedKey : (isVirtual ? this.methodKey : "i$" + this.methodKey);
8270+
var methodKey = isStatic ? this.methodNonQualifiedKey : (isVirtual ? this.methodKey : this.methodKeyNonVirtual);
82678271

82688272
return this.$MakeInlineCacheBody(callType, methodKey, this.fallbackMethod);
82698273
} else {

JSIL/JavascriptAstEmitter.cs

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2338,26 +2338,53 @@ public void VisitNode (JSInvocationExpression invocation) {
23382338
};
23392339

23402340
if (isOverloaded) {
2341-
ReferenceContext.InvokingMethod = jsm.Reference;
2342-
SignatureCacher.WriteQualifiedSignatureToOutput(
2343-
Output, this, Stack.OfType<JSFunctionExpression>().FirstOrDefault(),
2344-
jsm,
2345-
ReferenceContext
2346-
);
2341+
if (!method.DeclaringType.IsInterface) {
2342+
if (isStatic) {
2343+
Visit(invocation.Type);
2344+
} else {
2345+
Visit(invocation.ThisReference, "ThisReference");
2346+
}
23472347

2348-
Output.Dot();
2349-
Output.WriteRaw(isStatic ? "CallStatic" : invocation.ExplicitThis ? "CallNonVirtual" : "Call");
2348+
Output.OpenBracket();
2349+
ReferenceContext.InvokingMethod = jsm.Reference;
2350+
SignatureCacher.WriteQualifiedSignatureToOutput(
2351+
Output, this, Stack.OfType<JSFunctionExpression>().FirstOrDefault(),
2352+
jsm,
2353+
ReferenceContext
2354+
);
2355+
Output.Dot();
2356+
Output.WriteRaw(isStatic ? "methodNonQualifiedKey" : (invocation.ExplicitThis ? "methodKeyNonVirtual" : "methodKey"));
2357+
Output.CloseBracket();
23502358

2351-
Output.LPar();
2352-
if (!isStatic) {
2353-
Visit(invocation.ThisReference, "ThisReference");
2354-
Output.Comma();
2355-
}
2359+
Output.LPar();
2360+
if (hasGenericArguments) {
2361+
Output.CommaSeparatedList(invocation.GenericArguments, ReferenceContext, ListValueType.TypeIdentifier);
23562362

2357-
genericArgs();
2363+
if (hasArguments)
2364+
Output.Comma();
2365+
}
2366+
} else {
2367+
ReferenceContext.InvokingMethod = jsm.Reference;
2368+
SignatureCacher.WriteQualifiedSignatureToOutput(
2369+
Output, this, Stack.OfType<JSFunctionExpression>().FirstOrDefault(),
2370+
jsm,
2371+
ReferenceContext
2372+
);
23582373

2359-
if (hasArguments)
2360-
Output.Comma();
2374+
Output.Dot();
2375+
Output.WriteRaw(isStatic ? "CallStatic" : invocation.ExplicitThis ? "CallNonVirtual" : "Call");
2376+
2377+
Output.LPar();
2378+
if (!isStatic) {
2379+
Visit(invocation.ThisReference, "ThisReference");
2380+
Output.Comma();
2381+
}
2382+
2383+
genericArgs();
2384+
2385+
if (hasArguments)
2386+
Output.Comma();
2387+
}
23612388
} else {
23622389
if (isStatic) {
23632390
if (!invocation.Type.IsNull) {

0 commit comments

Comments
 (0)