From 264d7d372a541bcccc6fe73a77b46656286fd1b1 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Tue, 5 May 2026 22:43:20 +0300 Subject: [PATCH 1/3] =?UTF-8?q?Fix=20#1673:=20=D0=9F=D1=80=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=BE=D1=81=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=20native-=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OneScript.Native/Compiler/MethodCompiler.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 190643ebf..728f280a1 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1092,6 +1092,13 @@ protected override void VisitGlobalFunctionCall(CallNode node) _statementBuildParts.Push(expression); } + private static bool HasProcessParameter(MethodInfo mi) + { + var p = mi.GetParameters(); + if (p.Length > 0 && p[0].ParameterType == typeof(IBslProcess)) return true; + return false; + } + protected override void VisitObjectProcedureCall(BslSyntaxNode node) { var target = _statementBuildParts.Pop(); @@ -1102,7 +1109,8 @@ protected override void VisitObjectProcedureCall(BslSyntaxNode node) if (targetType.IsObjectValue()) { var methodInfo = FindMethodOfType(node, targetType, name); - var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters(), methodInfo is ContextMethodInfo { InjectsProcess: true }); + var injectProcess = methodInfo is ContextMethodInfo { InjectsProcess: true } || HasProcessParameter(methodInfo); + var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters(), injectProcess); _blocks.Add(Expression.Call(target, methodInfo, args)); } From 4806a1601c4d70c927be3f2b1ec3fec489119362 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Wed, 6 May 2026 13:41:09 +0300 Subject: [PATCH 2/3] =?UTF-8?q?#1673:=20=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20=D1=81=20bsl-=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=BE=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NativeCompilerTest.cs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs index 11ade2183..68c4a1c87 100644 --- a/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs +++ b/src/Tests/OneScript.Core.Tests/NativeCompilerTest.cs @@ -867,7 +867,44 @@ public void Can_Call_Member_Procedures() array.Should().HaveCount(2); } - + + [Fact] + public void Can_Call_Member_ProceduresWithBslProcess() + { + var tm = new DefaultTypeManager(); + var testType = tm.RegisterClass(typeof(ValueListImpl)); + + var block = new CompiledBlock(default); + block.Parameters.Insert("Список", new BslTypeValue(testType)); + // в методе SortByValue первым параметром идет IBslProcess process + block.CodeBlock = "Список.СортироватьПоЗначению();"; + + var method = block.CreateDelegate>(); + var testValue = new ValueListImpl(); + method(testValue); + + } + + [Fact] + public void Can_Call_Member_FunctionsWithBslProcess() + { + var tm = new DefaultTypeManager(); + var targetTestType = tm.RegisterClass(typeof(ArrayImpl)); + var testType = tm.RegisterClass(typeof(ReflectorContext)); + + var block = new CompiledBlock(default); + block.Parameters.Insert("Рефлектор", new BslTypeValue(testType)); + block.Parameters.Insert("Массив", new BslTypeValue(targetTestType)); + // в методе CallMethod первым параметром идет IBslProcess process + block.CodeBlock = "Результат = Рефлектор.ВызватьМетод(Массив, \"Количество\");"; + + var method = block.CreateDelegate>(); + var reflector = ReflectorContext.CreateNew(new TypeActivationContext() { TypeManager = tm}); + var array = new ArrayImpl(); + method(reflector, array); + + } + [Fact] public void Can_Call_Member_Procedures_On_Dynamics() { From f9975adba0771ec95caf6cd569cdc50af9c357f6 Mon Sep 17 00:00:00 2001 From: Sergey Batanov Date: Wed, 6 May 2026 13:42:24 +0300 Subject: [PATCH 3/3] =?UTF-8?q?#1673:=20=D0=9F=D1=80=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=BE=D1=81=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Compiler/MethodCompiler.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/OneScript.Native/Compiler/MethodCompiler.cs b/src/OneScript.Native/Compiler/MethodCompiler.cs index 728f280a1..718e48b17 100644 --- a/src/OneScript.Native/Compiler/MethodCompiler.cs +++ b/src/OneScript.Native/Compiler/MethodCompiler.cs @@ -1092,10 +1092,17 @@ protected override void VisitGlobalFunctionCall(CallNode node) _statementBuildParts.Push(expression); } - private static bool HasProcessParameter(MethodInfo mi) + private static bool InjectedProcessNeeded(MethodInfo methodInfo) { - var p = mi.GetParameters(); - if (p.Length > 0 && p[0].ParameterType == typeof(IBslProcess)) return true; + if (methodInfo is ContextMethodInfo { InjectsProcess: true }) + { + return true; + } + var p = methodInfo.GetParameters(); + if (p.Length > 0 && p[0].ParameterType == typeof(IBslProcess)) + { + return true; + } return false; } @@ -1109,7 +1116,7 @@ protected override void VisitObjectProcedureCall(BslSyntaxNode node) if (targetType.IsObjectValue()) { var methodInfo = FindMethodOfType(node, targetType, name); - var injectProcess = methodInfo is ContextMethodInfo { InjectsProcess: true } || HasProcessParameter(methodInfo); + var injectProcess = InjectedProcessNeeded(methodInfo); var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters(), injectProcess); _blocks.Add(Expression.Call(target, methodInfo, args)); @@ -1176,8 +1183,8 @@ protected override void VisitObjectFunctionCall(BslSyntaxNode node) $"Метод {targetType}.{name} не является функцией", $"Method {targetType}.{name} is not a function"), ToCodePosition(node.Location)); } - - var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters(), methodInfo is ContextMethodInfo { InjectsProcess: true }); + + var args = PrepareCallArguments(call.ArgumentList, methodInfo.GetParameters(), InjectedProcessNeeded(methodInfo)); _statementBuildParts.Push(Expression.Call(target, methodInfo, args)); } else if (targetType.IsContext()) @@ -1274,7 +1281,7 @@ private Expression CreateMethodCall(CallNode node) } var symbol = Symbols.GetScope(binding.ScopeNumber).Methods[binding.MemberNumber]; - var args = PrepareCallArguments(node.ArgumentList, symbol.Method.GetParameters(), symbol.Method is ContextMethodInfo { InjectsProcess: true }); + var args = PrepareCallArguments(node.ArgumentList, symbol.Method.GetParameters(), InjectedProcessNeeded(symbol.Method)); var methodInfo = symbol.Method; if (methodInfo is ContextMethodInfo contextMethod)