IronPython генерирует следующее исключение: Невозможно привести объект типа Funcв Func - PullRequest
0 голосов
/ 30 мая 2019

Мы включили IronPython в наше программное обеспечение и позволяем пользователям писать и запускать свои собственные скрипты Python, которые мы запускаем в IronPython Engine.Один из наших пользователей получает следующее исключение:

Unable to cast object of type 'System.Func`2[IronPython.Runtime.PythonFunction,System.Object]' to type 'System.Func`2[IronPython.Runtime.CodeContext,IronPython.Runtime.CodeContext]'.

Это исключение выдается в первой строке для следующего кода (очевидно, есть больше кода, но это строка, которая терпит неудачу):

class User:
    pass

Трассировка стека выглядит следующим образом:

at IronPython.Runtime.Operations.PythonOps.GetClassCode(CodeContext context, FunctionCode funcCode, Func`2 body)
at IronPython.Runtime.Operations.PythonOps.MakeClass(FunctionCode funcCode, Func`2 body, CodeContext parentContext, String name, Object[] bases, String selfNames)
at Microsoft.Scripting.Interpreter.FuncCallInstruction`7.Run(InterpretedFrame frame)
at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 arg1)
at IronPython.Compiler.PythonCallTargets.OriginalCallTarget1(PythonFunction function, Object arg0)
at IronPython.Runtime.FunctionCaller`1.Call1(CallSite site, CodeContext context, Object func, T0 arg0)
at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
at Microsoft.Scripting.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 arg1)
at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
at IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope)
at IronPython.Compiler.RuntimeScriptCode.Run(Scope scope)
at Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink errorSink)
at Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)
at Microsoft.Scripting.Hosting.ScriptEngine.Execute(String expression, ScriptScope scope)...

Глядя на исходный код IronPython, он явно терпит неудачу при попытке привести funcCode.Target к Func<CodeContext, CodeContext> в IronPython.Runtime.Operations.PythonOps:

public static object MakeClass(FunctionCode funcCode, Func<CodeContext, CodeContext> body, CodeContext/*!*/ parentContext, string name, object[] bases, string selfNames) {
    Func<CodeContext, CodeContext> func = GetClassCode(parentContext, funcCode, body);

    return MakeClass(parentContext, name, bases, selfNames, func(parentContext).Dict);
}

private static Func<CodeContext, CodeContext> GetClassCode(CodeContext/*!*/ context, FunctionCode funcCode, Func<CodeContext, CodeContext> body) {
    if (body == null) {
        if (funcCode.Target == null) {
            funcCode.UpdateDelegate(context.LanguageContext, true);
        }
        return (Func<CodeContext, CodeContext>)funcCode.Target;
    } else {
        if (funcCode.Target == null) {
            funcCode.SetTarget(body);
            funcCode._normalDelegate = body;
        }
        return body;
    }
}

Для меня это похоже на ошибку в IronPython.Но я должен признать, что я немного над головой с точки зрения того, что действительно вызывает IronPython.funcCode.Target является Делегатом, и IronPython ожидает, что он будет иметь тип Func<CodeContext, CodeContext>, но по какой-то причине он имеет тип Func<PythonFunction, Object>.Но я понятия не имею, как или почему этот делегат будет настроен на функцию другого типа.

Код клиента кажется довольно безобидным.Я не смог воссоздать исключение в своей среде разработки, но это регулярно происходит с этим клиентом.

Могу ли я попробовать что-нибудь на моем конце?Или это ошибка, которую я должен подать ребятам из IronPython.И если да, то как мне сообщить об ошибке в IronPython?

Я должен также упомянуть, что это IronPython2, а не 3.

1 Ответ

0 голосов
/ 03 июня 2019

Это ошибка в IronPython.

Смог сначала воспроизвести ошибку в нашем программном обеспечении, а затем в простом консольном приложении сообщил об ошибке команде IronPython.

...