|
@@ -79,11 +79,11 @@ public sealed class LuaCompiler : ISyntaxNodeVisitor<ScopeCompilationContext, bo
|
|
|
// vararg
|
|
// vararg
|
|
|
public bool VisitVariableArgumentsExpressionNode(VariableArgumentsExpressionNode node, ScopeCompilationContext context)
|
|
public bool VisitVariableArgumentsExpressionNode(VariableArgumentsExpressionNode node, ScopeCompilationContext context)
|
|
|
{
|
|
{
|
|
|
- CompileVariableArgumentsExpression(node, context);
|
|
|
|
|
|
|
+ CompileVariableArgumentsExpression(node, context, 1);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void CompileVariableArgumentsExpression(VariableArgumentsExpressionNode node, ScopeCompilationContext context, int resultCount = -1)
|
|
|
|
|
|
|
+ void CompileVariableArgumentsExpression(VariableArgumentsExpressionNode node, ScopeCompilationContext context, int resultCount)
|
|
|
{
|
|
{
|
|
|
context.PushInstruction(Instruction.VarArg(context.StackPosition, (ushort)(resultCount == -1 ? 0 : resultCount + 1)), node.Position, true);
|
|
context.PushInstruction(Instruction.VarArg(context.StackPosition, (ushort)(resultCount == -1 ? 0 : resultCount + 1)), node.Position, true);
|
|
|
}
|
|
}
|
|
@@ -213,16 +213,32 @@ public sealed class LuaCompiler : ISyntaxNodeVisitor<ScopeCompilationContext, bo
|
|
|
case ListTableConstructorField listItem:
|
|
case ListTableConstructorField listItem:
|
|
|
context.StackPosition = (byte)(p + currentArrayChunkSize - 50 * (arrayBlock - 1));
|
|
context.StackPosition = (byte)(p + currentArrayChunkSize - 50 * (arrayBlock - 1));
|
|
|
|
|
|
|
|
- listItem.Expression.Accept(this, context);
|
|
|
|
|
-
|
|
|
|
|
// For the last element, we need to take into account variable arguments and multiple return values.
|
|
// For the last element, we need to take into account variable arguments and multiple return values.
|
|
|
if (listItem == lastField)
|
|
if (listItem == lastField)
|
|
|
{
|
|
{
|
|
|
|
|
+ switch (listItem.Expression)
|
|
|
|
|
+ {
|
|
|
|
|
+ case CallFunctionExpressionNode call:
|
|
|
|
|
+ CompileCallFunctionExpression(call, context, false, -1);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case CallTableMethodExpressionNode method:
|
|
|
|
|
+ CompileTableMethod(method, context, false, -1);
|
|
|
|
|
+ break;
|
|
|
|
|
+ case VariableArgumentsExpressionNode varArg:
|
|
|
|
|
+ CompileVariableArgumentsExpression(varArg, context, -1);
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ listItem.Expression.Accept(this, context);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
context.PushInstruction(Instruction.SetList(tableRegisterIndex, 0, arrayBlock), listItem.Position);
|
|
context.PushInstruction(Instruction.SetList(tableRegisterIndex, 0, arrayBlock), listItem.Position);
|
|
|
currentArrayChunkSize = 0;
|
|
currentArrayChunkSize = 0;
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
|
|
+ listItem.Expression.Accept(this, context);
|
|
|
|
|
+
|
|
|
currentArrayChunkSize++;
|
|
currentArrayChunkSize++;
|
|
|
|
|
|
|
|
if (currentArrayChunkSize == 50)
|
|
if (currentArrayChunkSize == 50)
|
|
@@ -303,7 +319,7 @@ public sealed class LuaCompiler : ISyntaxNodeVisitor<ScopeCompilationContext, bo
|
|
|
|
|
|
|
|
public bool VisitCallTableMethodExpressionNode(CallTableMethodExpressionNode node, ScopeCompilationContext context)
|
|
public bool VisitCallTableMethodExpressionNode(CallTableMethodExpressionNode node, ScopeCompilationContext context)
|
|
|
{
|
|
{
|
|
|
- CompileTableMethod(node, context, false, -1);
|
|
|
|
|
|
|
+ CompileTableMethod(node, context, false, 1);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -487,7 +503,7 @@ public sealed class LuaCompiler : ISyntaxNodeVisitor<ScopeCompilationContext, bo
|
|
|
|
|
|
|
|
public bool VisitCallFunctionExpressionNode(CallFunctionExpressionNode node, ScopeCompilationContext context)
|
|
public bool VisitCallFunctionExpressionNode(CallFunctionExpressionNode node, ScopeCompilationContext context)
|
|
|
{
|
|
{
|
|
|
- CompileCallFunctionExpression(node, context, false, -1);
|
|
|
|
|
|
|
+ CompileCallFunctionExpression(node, context, false, 1);
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|