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

Commit

Permalink
Use methodKey accessor to eliminate closures in signature calls.
Browse files Browse the repository at this point in the history
  • Loading branch information
iskiselev committed Jun 17, 2016
1 parent cf5b23e commit 170c5d6
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 17 deletions.
6 changes: 5 additions & 1 deletion JSIL.Libraries/Sources/JSIL.Core.js
Original file line number Diff line number Diff line change
Expand Up @@ -8081,6 +8081,10 @@ JSIL.InterfaceMethod = function (typeObject, methodName, methodInfo) {
return this.signature != null ? JSIL.$GetSignaturePrefixForType(typeObject) + this.methodNonQualifiedKey : this.qualifiedName;
});

JSIL.SetLazyValueProperty(this, "methodKeyNonVirtual", function () {
return "i$" + this.methodKey;
});

JSIL.SetLazyValueProperty(this, "methodNonQualifiedKey", function () {
return this.signature != null ? this.signature.GetNamedKey(this.methodName, true) : this.methodName;
});
Expand Down Expand Up @@ -8263,7 +8267,7 @@ JSIL.InterfaceMethod.prototype.$MakeCallMethod = function (isVirtual, isStatic)
? "CallVariantInterface"
: "CallInterface");

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

return this.$MakeInlineCacheBody(callType, methodKey, this.fallbackMethod);
} else {
Expand Down
59 changes: 43 additions & 16 deletions JSIL/JavascriptAstEmitter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2338,26 +2338,53 @@ public void VisitNode (JSInvocationExpression invocation) {
};

if (isOverloaded) {
ReferenceContext.InvokingMethod = jsm.Reference;
SignatureCacher.WriteQualifiedSignatureToOutput(
Output, this, Stack.OfType<JSFunctionExpression>().FirstOrDefault(),
jsm,
ReferenceContext
);
if (!method.DeclaringType.IsInterface) {
if (isStatic) {
Visit(invocation.Type);
} else {
Visit(invocation.ThisReference, "ThisReference");
}

Output.Dot();
Output.WriteRaw(isStatic ? "CallStatic" : invocation.ExplicitThis ? "CallNonVirtual" : "Call");
Output.OpenBracket();
ReferenceContext.InvokingMethod = jsm.Reference;
SignatureCacher.WriteQualifiedSignatureToOutput(
Output, this, Stack.OfType<JSFunctionExpression>().FirstOrDefault(),
jsm,
ReferenceContext
);
Output.Dot();
Output.WriteRaw(isStatic ? "methodNonQualifiedKey" : (invocation.ExplicitThis ? "methodKeyNonVirtual" : "methodKey"));
Output.CloseBracket();

Output.LPar();
if (!isStatic) {
Visit(invocation.ThisReference, "ThisReference");
Output.Comma();
}
Output.LPar();
if (hasGenericArguments) {
Output.CommaSeparatedList(invocation.GenericArguments, ReferenceContext, ListValueType.TypeIdentifier);

genericArgs();
if (hasArguments)
Output.Comma();
}
} else {
ReferenceContext.InvokingMethod = jsm.Reference;
SignatureCacher.WriteQualifiedSignatureToOutput(
Output, this, Stack.OfType<JSFunctionExpression>().FirstOrDefault(),
jsm,
ReferenceContext
);

if (hasArguments)
Output.Comma();
Output.Dot();
Output.WriteRaw(isStatic ? "CallStatic" : invocation.ExplicitThis ? "CallNonVirtual" : "Call");

Output.LPar();
if (!isStatic) {
Visit(invocation.ThisReference, "ThisReference");
Output.Comma();
}

genericArgs();

if (hasArguments)
Output.Comma();
}
} else {
if (isStatic) {
if (!invocation.Type.IsNull) {
Expand Down

0 comments on commit 170c5d6

Please sign in to comment.