[ruby-core:94035] [Ruby master Bug#10466] rb_eval_string_wrap does not actually wrap in a module binding
From:
ko1@...
Date:
2019-07-30 07:54:14 UTC
List:
ruby-core #94035
Issue #10466 has been updated by ko1 (Koichi Sasada).
Assignee set to ko1 (Koichi Sasada)
Status changed from Open to Assigned
----------------------------------------
Bug #10466: rb_eval_string_wrap does not actually wrap in a module binding
https://bugs.ruby-lang.org/issues/10466#change-80260
* Author: silverhammermba (Max Anselm)
* Status: Assigned
* Priority: Normal
* Assignee: ko1 (Koichi Sasada)
* Target version:
* ruby -v: ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
`rb_eval_string_wrap` says that it "evaluates the given string under a module binding in an isolated binding", but this isn't true.
Run the following:
~~~
#include <ruby.h>
int main(int argc, char* argv[])
{
ruby_init();
int state;
rb_eval_string_protect("X = 2", &state);
rb_eval_string_wrap("X = 3", &state);
rb_eval_string_protect("puts X", &state);
return ruby_cleanup(0);
}
~~~
### Expected:
outputs 2
### Actual:
outputs
~~~
eval:1: warning: already initialized constant X
eval:1: warning: previous definition of X was here
3
~~~
It looks like `rb_eval_string_wrap` _tries_ to wrap it
~~~
th->top_wrapper = rb_module_new();
th->top_self = rb_obj_clone(rb_vm_top_self());
rb_extend_object(th->top_self, th->top_wrapper);
~~~
But it ends up calling `ruby_eval_string_from_file` which uses `rb_vm_top_self()` as `self`, thus undoing the wrapping.
`rb_load` can perform similar wrapping, but there it works properly.
---Files--------------------------------
rb_eval_string_wrap_cref.patch (1.79 KB)
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>