Skip to content

Commit

Permalink
Optimize a couple of hot-paths, also reducing in less code. :-)
Browse files Browse the repository at this point in the history
  • Loading branch information
jnthn committed Aug 22, 2010
1 parent 10019ac commit 3446bc2
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 39 deletions.
13 changes: 8 additions & 5 deletions dotnet/runtime/Metamodel/KnowHOW/KnowHOWBootstrapper.cs
Expand Up @@ -71,12 +71,15 @@ public static RakudoObject Bootstrap()
}));
KnowHOWMeths.Add("find_method", CodeObjectUtility.WrapNativeMethod((TC, Ignored, Cap) =>
{
var HOW = (KnowHOWREPR.KnowHOWInstance)CaptureHelper.GetPositional(Cap, 0);
var Name = CaptureHelper.GetPositionalAsString(Cap, 1);
if (HOW.Methods.ContainsKey(Name))
return HOW.Methods[Name];
// We go to some effort to be really fast in here, 'cus it's a
// hot path for dynamic dispatches.
var Positionals = (Cap as P6capture.Instance).Positionals;
var HOW = Positionals[0] as KnowHOWREPR.KnowHOWInstance;
RakudoObject Method;
if (HOW.Methods.TryGetValue(Ops.unbox_str(TC, Positionals[1]), out Method))
return Method;
else
throw new InvalidOperationException("No such method " + Name);
throw new InvalidOperationException("No such method " + Ops.unbox_str(TC, Positionals[1]));
}));
KnowHOWMeths.Add("compose", CodeObjectUtility.WrapNativeMethod((TC, Ignored, Cap) =>
{
Expand Down
14 changes: 7 additions & 7 deletions dotnet/runtime/Runtime/MultiDispatch/MultiDispatcher.cs
Expand Up @@ -49,12 +49,12 @@ public static RakudoCodeRef.Instance FindBestCandidate(List<RakudoCodeRef.Instan

/* Check if it's admissable by arity. */
var NumArgs = NativeCapture.Positionals.Length;
if (NumArgs < Candidate.Sig.NumRequiredPositionals() ||
NumArgs > Candidate.Sig.NumPositionals())
if (NumArgs < Candidate.Sig.NumRequiredPositionals ||
NumArgs > Candidate.Sig.NumPositionals)
continue;

/* Check if it's admissable by type. */
var TypeCheckCount = Math.Min(NumArgs, Candidate.Sig.NumPositionals());
var TypeCheckCount = Math.Min(NumArgs, Candidate.Sig.NumPositionals);
var TypeMismatch = false;
for (int i = 0; i < TypeCheckCount; i++) {
var Arg = NativeCapture.Positionals[i];
Expand Down Expand Up @@ -102,10 +102,10 @@ private static int IsNarrower(RakudoCodeRef.Instance a, RakudoCodeRef.Instance b

/* Work out how many parameters to compare, factoring in slurpiness
* and optionals. */
if (a.Sig.NumPositionals() == b.Sig.NumPositionals())
TypesToCheck = a.Sig.NumPositionals();
else if (a.Sig.NumRequiredPositionals() == b.Sig.NumRequiredPositionals())
TypesToCheck = Math.Min(a.Sig.NumPositionals(), b.Sig.NumPositionals());
if (a.Sig.NumPositionals == b.Sig.NumPositionals)
TypesToCheck = a.Sig.NumPositionals;
else if (a.Sig.NumRequiredPositionals == b.Sig.NumRequiredPositionals)
TypesToCheck = Math.Min(a.Sig.NumPositionals, b.Sig.NumPositionals);
else
return 0;

Expand Down
48 changes: 21 additions & 27 deletions dotnet/runtime/Runtime/Signatures/Signature.cs
Expand Up @@ -16,40 +16,39 @@ public class Signature
/// <param name="Parameters"></param>
public Signature(Parameter[] Parameters)
{
// Set parameters array in place.
this.Parameters = Parameters;
}

/// <summary>
/// Gets the number of positionals.
/// </summary>
/// <returns></returns>
internal int NumPositionals()
{
int Num = 0;
// Build and cache number of positionals.
for (int i = 0; i < Parameters.Length; i++)
if (Parameters[i].Flags == Parameter.POS_FLAG)
Num++;
{
NumRequiredPositionals++;
NumPositionals++;
}
else if (Parameters[i].Flags == Parameter.OPTIONAL_FLAG)
Num++;
NumPositionals++;
else
break;
return Num;
}


/// <summary>
/// Gets the number of required positionals.
/// The parameters we have.
/// </summary>
public Parameter[] Parameters;

/// <summary>
/// The total number of positionals.
/// </summary>
/// <returns></returns>
internal int NumRequiredPositionals()
{
int Num = 0;
for (int i = 0; i < Parameters.Length; i++)
if (Parameters[i].Flags == Parameter.POS_FLAG)
Num++;
else
break;
return Num;
}
internal int NumPositionals;

/// <summary>
/// The number of required positionals.
/// </summary>
/// <returns></returns>
internal int NumRequiredPositionals;

/// <summary>
/// Do we have a slurpy positional parameter?
Expand All @@ -62,10 +61,5 @@ internal bool HasSlurpyPositional()
return true;
return false;
}

/// <summary>
/// The parameters we have.
/// </summary>
public Parameter[] Parameters;
}
}

0 comments on commit 3446bc2

Please sign in to comment.