Made CalculateMaxLocalCount a property.

This commit is contained in:
arookas 2015-12-21 04:50:17 -05:00
parent 9ace3833cb
commit 8e4d9acb31
2 changed files with 30 additions and 27 deletions

View file

@ -37,6 +37,35 @@ namespace arookas
public bool IsBranch { get { return Count > 0; } }
public bool IsLeaf { get { return Count < 1; } }
public int MaxLocalCount
{
get
{
int locals = 0;
int maxChildLocals = 0;
foreach (var child in this)
{
if (child is sunVariableDeclaration || child is sunVariableDefinition)
{
++locals;
}
else if (child is sunCompoundStatement)
{
locals += child.MaxLocalCount; // HACK: compound statements aren't their own scope
}
else
{
int childLocals = child.MaxLocalCount;
if (childLocals > maxChildLocals)
{
maxChildLocals = childLocals;
}
}
}
return locals + maxChildLocals;
}
}
public sunNode(sunSourceLocation location)
{
children = new List<sunNode>(5);

View file

@ -135,7 +135,7 @@ namespace arookas
context.DeclareParameter(parameter);
}
context.Text.StoreDisplay(1);
context.Text.DeclareLocal(CalculateMaxLocalCount(Body));
context.Text.DeclareLocal(Body.MaxLocalCount);
Body.Compile(context);
context.Text.ReturnVoid();
context.Scopes.Pop();
@ -152,32 +152,6 @@ namespace arookas
context.Text.ClosePoint(callSite, Offset);
}
}
static int CalculateMaxLocalCount(sunNode node)
{
int locals = 0;
int maxChildLocals = 0;
foreach (var child in node)
{
if (child is sunVariableDeclaration || child is sunVariableDefinition)
{
++locals;
}
else if (child is sunCompoundStatement)
{
locals += CalculateMaxLocalCount(child); // HACK: compound statements aren't their own scope
}
else
{
int childLocals = CalculateMaxLocalCount(child);
if (childLocals > maxChildLocals)
{
maxChildLocals = childLocals;
}
}
}
return locals + maxChildLocals;
}
}
class sunParameterInfo : IEnumerable<string>