More logical handling of return values
This commit is contained in:
parent
62f31ef0d3
commit
62ad100aee
|
@ -181,7 +181,7 @@ namespace Upsilon.Binder
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: validate parameters
|
//TODO: validate parameters
|
||||||
return new BoundFunctionCallExpression((FunctionVariableSymbol) function, parameters.ToImmutable());
|
return new BoundFunctionCallExpression(function, parameters.ToImmutable());
|
||||||
}
|
}
|
||||||
|
|
||||||
private BoundExpression BindVariableExpression(VariableExpressionSyntax e)
|
private BoundExpression BindVariableExpression(VariableExpressionSyntax e)
|
||||||
|
|
|
@ -9,7 +9,8 @@ namespace Upsilon.Evaluator
|
||||||
public class Evaluator
|
public class Evaluator
|
||||||
{
|
{
|
||||||
private readonly Diagnostics _diagnostics;
|
private readonly Diagnostics _diagnostics;
|
||||||
private LuaType _value;
|
private LuaType _lastValue;
|
||||||
|
private LuaType _returnValue;
|
||||||
public EvaluationScope Scope { get; }
|
public EvaluationScope Scope { get; }
|
||||||
private bool HasReturned { get; set; }
|
private bool HasReturned { get; set; }
|
||||||
|
|
||||||
|
@ -28,7 +29,9 @@ namespace Upsilon.Evaluator
|
||||||
public LuaType Evaluate(BoundScript e)
|
public LuaType Evaluate(BoundScript e)
|
||||||
{
|
{
|
||||||
Evaluate(e.Statement);
|
Evaluate(e.Statement);
|
||||||
return _value;
|
if (_returnValue == null)
|
||||||
|
return _lastValue;
|
||||||
|
return _returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
private LuaType Evaluate(BoundNode b)
|
private LuaType Evaluate(BoundNode b)
|
||||||
|
@ -43,7 +46,7 @@ namespace Upsilon.Evaluator
|
||||||
case BoundKind.BoundUnaryExpression:
|
case BoundKind.BoundUnaryExpression:
|
||||||
case BoundKind.VariableExpression:
|
case BoundKind.VariableExpression:
|
||||||
case BoundKind.BoundFunctionCallExpression:
|
case BoundKind.BoundFunctionCallExpression:
|
||||||
_value = EvaluateExpression((BoundExpression) b);
|
_lastValue = EvaluateExpression((BoundExpression) b);
|
||||||
break;
|
break;
|
||||||
case BoundKind.BoundAssignmentStatement:
|
case BoundKind.BoundAssignmentStatement:
|
||||||
case BoundKind.BoundExpressionStatement:
|
case BoundKind.BoundExpressionStatement:
|
||||||
|
@ -57,7 +60,7 @@ namespace Upsilon.Evaluator
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
return _value;
|
return _returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EvaluateStatement(BoundStatement e)
|
private void EvaluateStatement(BoundStatement e)
|
||||||
|
@ -93,7 +96,7 @@ namespace Upsilon.Evaluator
|
||||||
|
|
||||||
private void EvaluateExpressionStatement(BoundExpressionStatement e)
|
private void EvaluateExpressionStatement(BoundExpressionStatement e)
|
||||||
{
|
{
|
||||||
_value = EvaluateExpression(e.Expression);
|
_lastValue = EvaluateExpression(e.Expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
private LuaType EvaluateExpression(BoundExpression e)
|
private LuaType EvaluateExpression(BoundExpression e)
|
||||||
|
@ -165,7 +168,7 @@ namespace Upsilon.Evaluator
|
||||||
{
|
{
|
||||||
Scope.SetGlobal(e.Variable, val);
|
Scope.SetGlobal(e.Variable, val);
|
||||||
}
|
}
|
||||||
_value = val;
|
_lastValue = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
private LuaType EvaluateVariableExpression(BoundVariableExpression e)
|
private LuaType EvaluateVariableExpression(BoundVariableExpression e)
|
||||||
|
@ -204,7 +207,7 @@ namespace Upsilon.Evaluator
|
||||||
innerEvaluator.EvaluateStatement(boundBlockStatement.ElseStatement.Block);
|
innerEvaluator.EvaluateStatement(boundBlockStatement.ElseStatement.Block);
|
||||||
}
|
}
|
||||||
HasReturned = innerEvaluator.HasReturned;
|
HasReturned = innerEvaluator.HasReturned;
|
||||||
_value = innerEvaluator._value;
|
_lastValue = innerEvaluator._lastValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EvaluateBoundFunctionStatement(BoundFunctionStatement boundFunctionStatement)
|
private void EvaluateBoundFunctionStatement(BoundFunctionStatement boundFunctionStatement)
|
||||||
|
@ -243,13 +246,14 @@ namespace Upsilon.Evaluator
|
||||||
var parameterValue = innerEvaluator.EvaluateExpression(boundFunctionCallExpression.Parameters[i]);
|
var parameterValue = innerEvaluator.EvaluateExpression(boundFunctionCallExpression.Parameters[i]);
|
||||||
innerEvaluator.Scope.Set(parameterVariable, parameterValue);
|
innerEvaluator.Scope.Set(parameterVariable, parameterValue);
|
||||||
}
|
}
|
||||||
_value = innerEvaluator.Evaluate(function.Block);
|
_lastValue = innerEvaluator.Evaluate(function.Block);
|
||||||
return _value;
|
return _lastValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EvaluateReturnStatement(BoundReturnStatement b)
|
private void EvaluateReturnStatement(BoundReturnStatement b)
|
||||||
{
|
{
|
||||||
_value = Evaluate(b.Expression);
|
_returnValue = EvaluateExpression(b.Expression);
|
||||||
|
_lastValue = _returnValue;
|
||||||
HasReturned = true;
|
HasReturned = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,8 @@ namespace Ycicle
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var evaluate = parsed.Evaluate();
|
var evaluate = parsed.Evaluate();
|
||||||
|
if (evaluate == null)
|
||||||
|
continue;
|
||||||
if (parsed.Diagnostics.Messages.Count > 0)
|
if (parsed.Diagnostics.Messages.Count > 0)
|
||||||
{
|
{
|
||||||
Console.ForegroundColor = ConsoleColor.Red;
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
|
Loading…
Reference in New Issue