Skip to content

Commit 514d0bf

Browse files
committed
Почти все тесты по нативу зеленые
1 parent ba80c6f commit 514d0bf

File tree

3 files changed

+75
-12
lines changed

3 files changed

+75
-12
lines changed

src/OneScript.Native/Compiler/ExpressionHelpers.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -730,10 +730,31 @@ private static bool IsModuleVariable(Expression counterVar)
730730

731731
public static Expression CallContextMethod(Expression target, string name, ParameterExpression processParameter,
732732
IEnumerable<Expression> arguments)
733+
{
734+
return CallContextMethodInternal(
735+
nameof(DynamicOperations.CallContextMethod), target, name, processParameter, arguments);
736+
}
737+
738+
public static Expression TryCallContextMethod(
739+
Expression target,
740+
string name,
741+
ParameterExpression processParameter,
742+
IEnumerable<Expression> arguments)
743+
{
744+
return CallContextMethodInternal(
745+
nameof(DynamicOperations.TryCallContextMethod), target, name, processParameter, arguments);
746+
}
747+
748+
private static Expression CallContextMethodInternal(
749+
string implementationName,
750+
Expression target,
751+
string name,
752+
ParameterExpression processParameter,
753+
IEnumerable<Expression> arguments)
733754
{
734755
var methodInfo = OperationsCache.GetOrAdd(
735756
typeof(DynamicOperations),
736-
nameof(DynamicOperations.CallContextMethod)
757+
implementationName
737758
);
738759

739760
var argExpressions = new List<Expression>

src/OneScript.Native/Compiler/MethodCompiler.cs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,11 +1101,23 @@ protected override void VisitObjectProcedureCall(BslSyntaxNode node)
11011101
if (targetType.IsObjectValue())
11021102
{
11031103
var methodInfo = FindMethodOfType(node, targetType, name);
1104-
var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters());
1104+
var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters(), methodInfo is ContextMethodInfo { InjectsProcess: true });
11051105

11061106
_blocks.Add(Expression.Call(target, methodInfo, args));
11071107
}
1108-
else if (targetType.IsValue() || target is DynamicExpression)
1108+
else if (targetType.IsContext())
1109+
{
1110+
var contextCall = ExpressionHelpers.CallContextMethod(target, name, _processParameter,
1111+
PrepareDynamicCallArguments(call.ArgumentList));
1112+
_blocks.Add(contextCall);
1113+
}
1114+
else if (targetType.IsValue())
1115+
{
1116+
var contextCall = ExpressionHelpers.TryCallContextMethod(target, name, _processParameter,
1117+
PrepareDynamicCallArguments(call.ArgumentList));
1118+
_blocks.Add(contextCall);
1119+
}
1120+
else if (target is DynamicExpression)
11091121
{
11101122
var args = new List<Expression>();
11111123
args.Add(target);
@@ -1156,14 +1168,20 @@ protected override void VisitObjectFunctionCall(BslSyntaxNode node)
11561168
$"Method {targetType}.{name} is not a function"), ToCodePosition(node.Location));
11571169
}
11581170

1159-
var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters());
1171+
var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters(), methodInfo is ContextMethodInfo { InjectsProcess: true });
11601172
_statementBuildParts.Push(Expression.Call(target, methodInfo, args));
11611173
}
11621174
else if (targetType.IsContext())
11631175
{
11641176
_statementBuildParts.Push(ExpressionHelpers.CallContextMethod(target, name, _processParameter, PrepareDynamicCallArguments(call.ArgumentList)));
11651177
}
1166-
else if (targetType.IsValue() || target is DynamicExpression)
1178+
else if (targetType.IsValue())
1179+
{
1180+
var contextCall = ExpressionHelpers.TryCallContextMethod(target, name, _processParameter,
1181+
PrepareDynamicCallArguments(call.ArgumentList));
1182+
_statementBuildParts.Push(contextCall);
1183+
}
1184+
else if (target is DynamicExpression)
11671185
{
11681186
var args = new List<Expression>();
11691187
args.Add(target);
@@ -1247,7 +1265,7 @@ private Expression CreateMethodCall(CallNode node)
12471265
}
12481266

12491267
var symbol = Symbols.GetScope(binding.ScopeNumber).Methods[binding.MemberNumber];
1250-
var args = PrepareCallArguments(node.ArgumentList, symbol.Method.GetParameters());
1268+
var args = PrepareCallArguments(node.ArgumentList, symbol.Method.GetParameters(), symbol.Method is ContextMethodInfo { InjectsProcess: true });
12511269

12521270
var methodInfo = symbol.Method;
12531271
if (methodInfo is ContextMethodInfo contextMethod)
@@ -1316,7 +1334,7 @@ private Expression CreateBuiltInFunctionCall(CallNode node)
13161334
var method = _builtInFunctions.GetMethod(methodName);
13171335
var declaredParameters = method.GetParameters();
13181336

1319-
var args = PrepareCallArguments(node.ArgumentList, declaredParameters);
1337+
var args = PrepareCallArguments(node.ArgumentList, declaredParameters, false);
13201338

13211339
result = Expression.Call(method, args);
13221340
break;
@@ -1385,7 +1403,7 @@ private Expression DirectConversionCall(CallNode node, Type type)
13851403
type);
13861404
}
13871405

1388-
private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterInfo[] declaredParameters)
1406+
private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterInfo[] declaredParameters, bool injectsProcess)
13891407
{
13901408
var factArguments = new List<Expression>();
13911409

@@ -1395,7 +1413,8 @@ private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterIn
13951413
: null).ToArray();
13961414

13971415
var parametersToProcess = declaredParameters.Length;
1398-
for (int i = 0; i < parameters.Length; i++)
1416+
var declStart = injectsProcess ? 1 : 0;
1417+
for (int i = 0, decl = declStart; i < parameters.Length; i++, decl++)
13991418
{
14001419
if (parametersToProcess == 0)
14011420
{
@@ -1405,7 +1424,7 @@ private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterIn
14051424
}
14061425

14071426
var passedArg = parameters[i];
1408-
var declaredParam = declaredParameters[i];
1427+
var declaredParam = declaredParameters[decl];
14091428

14101429
if (declaredParam.GetCustomAttribute<ParamArrayAttribute>() != null)
14111430
{
@@ -1448,7 +1467,7 @@ private List<Expression> PrepareCallArguments(BslSyntaxNode argList, ParameterIn
14481467

14491468
if (parametersToProcess > 0)
14501469
{
1451-
foreach (var declaredParam in declaredParameters.Skip(parameters.Length))
1470+
foreach (var declaredParam in declaredParameters.Skip(parameters.Length + declStart))
14521471
{
14531472
if (declaredParam.HasDefaultValue)
14541473
{

src/OneScript.Native/Runtime/DynamicOperations.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,33 @@ public static BslValue GetPropertyValue(object target, string propertyName)
205205
return (BslValue)context.GetPropValue(propIndex);
206206
}
207207

208+
public static BslValue TryCallContextMethod(BslValue instance, string methodName, IBslProcess process, BslValue[] arguments)
209+
{
210+
if (!(instance is IRuntimeContextInstance context))
211+
throw BslExceptions.ValueIsNotObjectException();
212+
213+
return CallContextMethod(context, methodName, process, arguments);
214+
}
215+
208216
public static BslValue CallContextMethod(IRuntimeContextInstance instance, string methodName, IBslProcess process, BslValue[] arguments)
209217
{
210218
var idx = instance.GetMethodNumber(methodName);
211-
instance.CallAsFunction(idx, arguments, out var result, process);
219+
220+
var parameters = instance.GetMethodInfo(idx).GetParameters();
221+
222+
if (arguments.Length > parameters.Length)
223+
throw RuntimeException.TooManyArgumentsPassed();
224+
225+
var valueArgs = new IValue[parameters.Length];
226+
for (int i = 0; i < valueArgs.Length; i++)
227+
{
228+
if (i < arguments.Length)
229+
valueArgs[i] = arguments[i];
230+
else
231+
valueArgs[i] = BslSkippedParameterValue.Instance;
232+
}
233+
234+
instance.CallAsFunction(idx, valueArgs, out var result, process);
212235
return (BslValue)result;
213236
}
214237
}

0 commit comments

Comments
 (0)