Ben Hall
2008-Sep-27 12:53 UTC
[Ironruby-core] RubyModule CreateAnonymousModule - NotImplementedException
Hello,
Just been playing around with IronRuby, however I am hitting an issue
with RubyModule.CreateAnonymousModule() - basically, it hasn''t been
implemented yet :)
// Ruby constructor:
public static RubyModule/*!*/
CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/
self) {
// TODO:
throw new NotImplementedException();
}
You have implemented another method:
public static RubyModule/*!*/ CreateAnonymousModule(RubyClass/*!*/ self) {
return self.ExecutionContext.DefineModule(SymbolId.Empty);
}
But I don''t know how to to implement with relation to the block. Is
it just not supported yet?
If you could provide me with any help that would be great, its really
blocking me at the moment.
Thanks
Ben
Peter Bacon Darwin
2008-Sep-27 16:08 UTC
[Ironruby-core] RubyModule CreateAnonymousModule - NotImplementedException
The documentation says that the block version of the code creates the
anonymous module and then passes this new module to the block via a dynamic
call to Module#module_eval.
The following code is a quick hack (that may work!!) but really we should be
hitting a DynamicSite to invoke the module_eval.
// Ruby constructor:
public static object CreateAnonymousModule([NotNull]BlockParam/*!*/
block, RubyClass/*!*/ self) {
RubyModule module
self.ExecutionContext.DefineModule(SymbolId.Empty);
return RubyUtils.EvaluateInModule(module, block);
}
Disclaimer: I haven''t tried this at all.
Pete
-----Original Message-----
From: ironruby-core-bounces at rubyforge.org
[mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ben Hall
Sent: Saturday,27 September 27, 2008 13:54
To: ironruby-core at rubyforge.org
Subject: [Ironruby-core] RubyModule CreateAnonymousModule -
NotImplementedException
Hello,
Just been playing around with IronRuby, however I am hitting an issue
with RubyModule.CreateAnonymousModule() - basically, it hasn''t been
implemented yet :)
// Ruby constructor:
public static RubyModule/*!*/
CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/
self) {
// TODO:
throw new NotImplementedException();
}
You have implemented another method:
public static RubyModule/*!*/ CreateAnonymousModule(RubyClass/*!*/ self) {
return self.ExecutionContext.DefineModule(SymbolId.Empty);
}
But I don''t know how to to implement with relation to the block. Is
it just not supported yet?
If you could provide me with any help that would be great, its really
blocking me at the moment.
Thanks
Ben
_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core
Ben Hall
2008-Sep-27 22:10 UTC
[Ironruby-core] RubyModule CreateAnonymousModule - NotImplementedException
Hi Peter,
Thanks for your reply. That is what I tried initially, however you
need to return a RubyModule object. I tried:
return (RubyModule) RubyUtils.EvaluateInModule(module, block);
but I get the errror:
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\MatchCaller.Generated.cs:35:in
`Call3'': Unable to cast object of
type ''IronRuby.Builtins.Proc'' to type
''IronRuby.Builtins.RubyModule''.
(System::InvalidCastException)
from
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\CallSite.cs:275:in
`UpdateAndExecute''
from
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\UpdateDelegates.Generated.cs:45:in
`Update3''
from step.rb:19:in `init_module''
I tried this implementation:
RubyModule module = new RubyModule(self);
module.Name = SymbolId.Empty;
RubyUtils.EvaluateInModule(module, block);
return module;
When appears to allow me to progress some more, but now i''m hitting
LocalJumpError("unexpected return"); in
RuntimeFlowControl.BlockReturn, I guess something isn''t correct.
Out of interest, what documentation is available?
Thanks
Ben
On Sat, Sep 27, 2008 at 5:08 PM, Peter Bacon Darwin
<bacondarwin at googlemail.com> wrote:> The documentation says that the block version of the code creates the
> anonymous module and then passes this new module to the block via a dynamic
> call to Module#module_eval.
> The following code is a quick hack (that may work!!) but really we should
be
> hitting a DynamicSite to invoke the module_eval.
>
> // Ruby constructor:
> public static object CreateAnonymousModule([NotNull]BlockParam/*!*/
> block, RubyClass/*!*/ self) {
> RubyModule module >
self.ExecutionContext.DefineModule(SymbolId.Empty);
> return RubyUtils.EvaluateInModule(module, block);
> }
>
> Disclaimer: I haven''t tried this at all.
> Pete
>
> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org
> [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ben Hall
> Sent: Saturday,27 September 27, 2008 13:54
> To: ironruby-core at rubyforge.org
> Subject: [Ironruby-core] RubyModule CreateAnonymousModule -
> NotImplementedException
>
> Hello,
>
> Just been playing around with IronRuby, however I am hitting an issue
> with RubyModule.CreateAnonymousModule() - basically, it hasn''t
been
> implemented yet :)
>
> // Ruby constructor:
> public static RubyModule/*!*/
> CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/
> self) {
> // TODO:
> throw new NotImplementedException();
> }
>
> You have implemented another method:
> public static RubyModule/*!*/ CreateAnonymousModule(RubyClass/*!*/ self) {
> return self.ExecutionContext.DefineModule(SymbolId.Empty);
> }
>
> But I don''t know how to to implement with relation to the block.
Is
> it just not supported yet?
>
> If you could provide me with any help that would be great, its really
> blocking me at the moment.
>
> Thanks
> Ben
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
Peter Bacon Darwin
2008-Sep-28 13:27 UTC
[Ironruby-core] RubyModule CreateAnonymousModule - NotImplementedException
The only documentation I use in these matters is at www.ruby-doc.org/core/.
For example: http://www.ruby-doc.org/core/classes/Module.html#M001705.
Pete
-----Original Message-----
From: ironruby-core-bounces at rubyforge.org
[mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ben Hall
Sent: Saturday,27 September 27, 2008 23:10
To: ironruby-core at rubyforge.org
Subject: Re: [Ironruby-core] RubyModule CreateAnonymousModule -
NotImplementedException
Hi Peter,
Thanks for your reply. That is what I tried initially, however you
need to return a RubyModule object. I tried:
return (RubyModule) RubyUtils.EvaluateInModule(module, block);
but I get the errror:
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\MatchCaller.Generated
.cs:35:in
`Call3'': Unable to cast object of
type ''IronRuby.Builtins.Proc'' to type
''IronRuby.Builtins.RubyModule''.
(System::InvalidCastException)
from
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\CallSite.cs:275:in
`UpdateAndExecute''
from
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\UpdateDelegates.Gener
ated.cs:45:in
`Update3''
from step.rb:19:in `init_module''
I tried this implementation:
RubyModule module = new RubyModule(self);
module.Name = SymbolId.Empty;
RubyUtils.EvaluateInModule(module, block);
return module;
When appears to allow me to progress some more, but now i''m hitting
LocalJumpError("unexpected return"); in
RuntimeFlowControl.BlockReturn, I guess something isn''t correct.
Out of interest, what documentation is available?
Thanks
Ben
On Sat, Sep 27, 2008 at 5:08 PM, Peter Bacon Darwin
<bacondarwin at googlemail.com> wrote:> The documentation says that the block version of the code creates the
> anonymous module and then passes this new module to the block via a
dynamic> call to Module#module_eval.
> The following code is a quick hack (that may work!!) but really we should
be> hitting a DynamicSite to invoke the module_eval.
>
> // Ruby constructor:
> public static object CreateAnonymousModule([NotNull]BlockParam/*!*/
> block, RubyClass/*!*/ self) {
> RubyModule module >
self.ExecutionContext.DefineModule(SymbolId.Empty);
> return RubyUtils.EvaluateInModule(module, block);
> }
>
> Disclaimer: I haven''t tried this at all.
> Pete
>
> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org
> [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ben Hall
> Sent: Saturday,27 September 27, 2008 13:54
> To: ironruby-core at rubyforge.org
> Subject: [Ironruby-core] RubyModule CreateAnonymousModule -
> NotImplementedException
>
> Hello,
>
> Just been playing around with IronRuby, however I am hitting an issue
> with RubyModule.CreateAnonymousModule() - basically, it hasn''t
been
> implemented yet :)
>
> // Ruby constructor:
> public static RubyModule/*!*/
> CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/
> self) {
> // TODO:
> throw new NotImplementedException();
> }
>
> You have implemented another method:
> public static RubyModule/*!*/ CreateAnonymousModule(RubyClass/*!*/ self) {
> return self.ExecutionContext.DefineModule(SymbolId.Empty);
> }
>
> But I don''t know how to to implement with relation to the block.
Is
> it just not supported yet?
>
> If you could provide me with any help that would be great, its really
> blocking me at the moment.
>
> Thanks
> Ben
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core
Peter Bacon Darwin
2008-Sep-28 14:29 UTC
[Ironruby-core] RubyModule CreateAnonymousModule - NotImplementedException
Hi Ben,
Here is a better version that should work, except for the dynamic monkey
patching aspect. In RubyModule.cs you have to have this method:
// Ruby constructor:
public static RubyModule/*!*/
CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/ self) {
RubyModule module
self.ExecutionContext.DefineModule(SymbolId.Empty);
object returnedValue = RubyUtils.EvaluateInModule(module,
block);
if ( block.BlockJumped(returnedValue) ) {
return null;
}
return module;
}
This additional complexity is because MRI normally returns the module rather
than the result of the block, unless the block jumped (i.e. break).
The following code works the same in MRI and this version of IronRuby...
Module.new
Module.new {|m| puts m.class}
Module.new {|m| puts m.class; 123}
Module.new {|m| puts m.class; break;}
Module.new {|m| puts m.class; break; 123}
In MRI this prints Module to the console and then returns the anonymous
Module object unless the block breaks in which case it returns nil.
By the way, this is still not strictly correct yet, since if we monkey patch
module_eval this version will not call the new version of module_eval.
Pete
-----Original Message-----
From: ironruby-core-bounces at rubyforge.org
[mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ben Hall
Sent: Saturday,27 September 27, 2008 23:10
To: ironruby-core at rubyforge.org
Subject: Re: [Ironruby-core] RubyModule CreateAnonymousModule -
NotImplementedException
Hi Peter,
Thanks for your reply. That is what I tried initially, however you
need to return a RubyModule object. I tried:
return (RubyModule) RubyUtils.EvaluateInModule(module, block);
but I get the errror:
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\MatchCaller.Generated
.cs:35:in
`Call3'': Unable to cast object of
type ''IronRuby.Builtins.Proc'' to type
''IronRuby.Builtins.RubyModule''.
(System::InvalidCastException)
from
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\CallSite.cs:275:in
`UpdateAndExecute''
from
E:\IronRuby\trunk\src\Microsoft.Scripting.Core\Actions\UpdateDelegates.Gener
ated.cs:45:in
`Update3''
from step.rb:19:in `init_module''
I tried this implementation:
RubyModule module = new RubyModule(self);
module.Name = SymbolId.Empty;
RubyUtils.EvaluateInModule(module, block);
return module;
When appears to allow me to progress some more, but now i''m hitting
LocalJumpError("unexpected return"); in
RuntimeFlowControl.BlockReturn, I guess something isn''t correct.
Out of interest, what documentation is available?
Thanks
Ben
On Sat, Sep 27, 2008 at 5:08 PM, Peter Bacon Darwin
<bacondarwin at googlemail.com> wrote:> The documentation says that the block version of the code creates the
> anonymous module and then passes this new module to the block via a
dynamic> call to Module#module_eval.
> The following code is a quick hack (that may work!!) but really we should
be> hitting a DynamicSite to invoke the module_eval.
>
> // Ruby constructor:
> public static object CreateAnonymousModule([NotNull]BlockParam/*!*/
> block, RubyClass/*!*/ self) {
> RubyModule module >
self.ExecutionContext.DefineModule(SymbolId.Empty);
> return RubyUtils.EvaluateInModule(module, block);
> }
>
> Disclaimer: I haven''t tried this at all.
> Pete
>
> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org
> [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Ben Hall
> Sent: Saturday,27 September 27, 2008 13:54
> To: ironruby-core at rubyforge.org
> Subject: [Ironruby-core] RubyModule CreateAnonymousModule -
> NotImplementedException
>
> Hello,
>
> Just been playing around with IronRuby, however I am hitting an issue
> with RubyModule.CreateAnonymousModule() - basically, it hasn''t
been
> implemented yet :)
>
> // Ruby constructor:
> public static RubyModule/*!*/
> CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/
> self) {
> // TODO:
> throw new NotImplementedException();
> }
>
> You have implemented another method:
> public static RubyModule/*!*/ CreateAnonymousModule(RubyClass/*!*/ self) {
> return self.ExecutionContext.DefineModule(SymbolId.Empty);
> }
>
> But I don''t know how to to implement with relation to the block.
Is
> it just not supported yet?
>
> If you could provide me with any help that would be great, its really
> blocking me at the moment.
>
> Thanks
> Ben
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
_______________________________________________
Ironruby-core mailing list
Ironruby-core at rubyforge.org
http://rubyforge.org/mailman/listinfo/ironruby-core
Peter Bacon Darwin
2008-Sep-28 14:55 UTC
[Ironruby-core] RubyModule CreateAnonymousModule - NotImplementedException
And if you want the monkey patching to work then this should help...
In RubyModule.cs you need:
// Ruby constructor:
public static RubyModule/*!*/
CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/ self) {
RubyModule module
self.ExecutionContext.DefineModule(SymbolId.Empty);
object returnedValue RubySites.ModuleEval(block.Proc.LocalScope,
module, block.Proc);
if ( block.BlockJumped(returnedValue) ) {
return null;
}
return module;
}
And in RubySites.cs you need:
private static readonly CallSite<Func<CallSite, CodeContext,
RubyModule, Proc, object>> ModuleEvalSharedSite =
CallSite<Func<CallSite,
CodeContext, RubyModule, Proc, object>>.Create(
InstanceCallAction("module_eval",
RubyCallSignature.WithBlock(0)));
public static object ModuleEval(CodeContext context, RubyModule
self, Proc block) {
return ModuleEvalSharedSite.Target(ModuleEvalSharedSite,
context, self, block);
}
There are probably a number of corner cases that I have missed but this
should work for the majority of uses.
Regards,
Pete
Ben Hall
2008-Sep-28 15:26 UTC
[Ironruby-core] RubyModule CreateAnonymousModule - NotImplementedException
Thanks Peter, I really appreciate it. On Sun, Sep 28, 2008 at 3:55 PM, Peter Bacon Darwin <bacondarwin at googlemail.com> wrote:> And if you want the monkey patching to work then this should help... > > In RubyModule.cs you need: > > // Ruby constructor: > public static RubyModule/*!*/ > CreateAnonymousModule([NotNull]BlockParam/*!*/ block, RubyClass/*!*/ self) { > RubyModule module > self.ExecutionContext.DefineModule(SymbolId.Empty); > object returnedValue > RubySites.ModuleEval(block.Proc.LocalScope, module, block.Proc); > if ( block.BlockJumped(returnedValue) ) { > return null; > } > return module; > } > > And in RubySites.cs you need: > > private static readonly CallSite<Func<CallSite, CodeContext, > RubyModule, Proc, object>> ModuleEvalSharedSite = CallSite<Func<CallSite, > CodeContext, RubyModule, Proc, object>>.Create( > InstanceCallAction("module_eval", > RubyCallSignature.WithBlock(0))); > > public static object ModuleEval(CodeContext context, RubyModule > self, Proc block) { > return ModuleEvalSharedSite.Target(ModuleEvalSharedSite, > context, self, block); > } > > There are probably a number of corner cases that I have missed but this > should work for the majority of uses. > > Regards, > Pete > > _______________________________________________ > Ironruby-core mailing list > Ironruby-core at rubyforge.org > http://rubyforge.org/mailman/listinfo/ironruby-core >