Thanks Dino, I'll keep an eye on the issue and see how you get on :) > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:users- > [EMAIL PROTECTED] 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: [EMAIL PROTECTED] [mailto:users- > [EMAIL PROTECTED] On Behalf Of Alex Henderson > Sent: Friday, October 06, 2006 8:51 PM > To: [email protected] > 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 > [email protected] > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > _______________________________________________ > users mailing list > [email protected] > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________ users mailing list [email protected] http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
