[IronPython] Limitations of PythonEngine.CreateMethod<TDelegate>?
Alex Henderson
alex at syzmk.com
Wed Oct 11 03:28:45 CEST 2006
Thanks Dino, I'll keep an eye on the issue and see how you get on :)
> -----Original Message-----
> From: users-bounces at lists.ironpython.com [mailto:users-
> bounces at lists.ironpython.com] On Behalf Of Dino Viehland
> Sent: Tuesday, 10 October 2006 1:10 p.m.
> To: Discussion of IronPython
> Subject: Re: [IronPython] Limitations of
> PythonEngine.CreateMethod<TDelegate>?
>
> Thanks for the report - this sounds like a bug. I suspect we're not
> creating the function w/ the proper environment in this case, but I
> haven't had a chance to investigate. I've opened CodePlex bug #4196 for
> this.
>
> -----Original Message-----
> From: users-bounces at lists.ironpython.com [mailto:users-
> bounces at lists.ironpython.com] On Behalf Of Alex Henderson
> Sent: Friday, October 06, 2006 8:51 PM
> To: users at lists.ironpython.com
> Subject: [IronPython] Limitations of PythonEngine.CreateMethod<TDelegate>?
>
> Hi All,
>
> I've been playing with the PythonEngine's CreateMethod<TDelegate>(..) and
> declaring functions within the body of another function - however it
> doesn't seem to work, for example I can writin a function like this:
>
> def ExternalFunc():
> def InnerFunc1():
> def InnerFunc2():
> return "2"
> return "1" + InnerFunc2()
> return "0" + InnerFunc1()
>
> and then evaluate it...
>
> >>> ExternalFunc()
> '012'
> >>>
>
> But when I try to create a delegate for doing the same thing by shedding
> the outer "layer" of the function, and creating it as a method via the
> PythonEngine it doesn't work:
>
> PythonEngine = new PythonEngine()
> // some more setup code would go here...
> Func<string> externalFunc = engine.CreateMethod<Func<string>>(@"def
> InnerFunc1():
> def InnerFunc2():
> return ""2""
> return ""1"" + InnerFunc2()
> return ""0"" + InnerFunc1()");
>
> The call to CreateMethod spits the dummy, with a NullReferenceException...
> here's the stack trace
>
> failed: System.NullReferenceException : Object reference not set to an
> instance of an object.
> at
> IronPython.Compiler.Generation.CodeGen.DefineDynamicMethod(String
> name, Type retType, Type[] paramTypes)
> at IronPython.Compiler.Generation.CodeGen.DefineMethod(String
> name, Type retType, Type[] paramTypes, SymbolId[] paramNames)
> at IronPython.Compiler.Ast.FunctionDefinition.Emit(CodeGen cg)
> at IronPython.Compiler.Ast.SuiteStatement.Emit(CodeGen cg)
> at
> IronPython.Compiler.Ast.FunctionDefinition.EmitFunctionBody(CodeGen cg,
> CodeGen ocg)
> at
> IronPython.Compiler.Ast.FunctionDefinition.EmitFunctionImplementation(Code
> Ge
> n methodCodeGen, CodeGen initCodeGen)
> at
> IronPython.Hosting.PythonEngine.CreateDelegateWorker[TDelegate](Statement
> s,
> IList`1 parameters)
> at
> IronPython.Hosting.PythonEngine.CreateMethodUnscoped[TDelegate](String
> statements, IList`1 parameters)
> at IronPython.Hosting.PythonEngine.CreateMethod[TDelegate](String
> statements, IList`1 parameters, EngineModule engineModule)
> at IronPython.Hosting.PythonEngine.CreateMethod[TDelegate](String
> statements)
>
> Am I overlooking something in my code, or is this just a limitation of
> using CreateMethod<TDelegate> to get a delegate to an anonymous python
> function?
>
> For the mean time I'm just working around it by doing this:
>
> engine.Execute(@"def ExternalFunc():
> def InnerFunc1():
> def InnerFunc2():
> return ""2""
> return ""1"" + InnerFunc2()
> return ""0"" + InnerFunc1()");
>
> PythonFunction func = _engine.EvaluateAs<PythonFunction>("ExternalFunc");
>
> Func<string> funcDel = delegate { return (string)func.Call(); };
>
> Which gets me a suitable delegate, but it's not really the same as I end
> up having to declare the function as part of a module, which I was trying
> to avoid...
>
> Chez,
>
> - Alex
>
> _______________________________________________
> users mailing list
> users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> _______________________________________________
> users mailing list
> users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
More information about the Ironpython-users
mailing list