[#98098] [Ruby master Feature#16824] Follow RubyGems naming conventions for the stdlib — shannonskipper@...

Issue #16824 has been reported by shan (Shannon Skipper).

14 messages 2020/05/01

[#98147] [Ruby master Feature#16832] Use #name rather than #inspect to build "uninitialized constant" error messages — jean.boussier@...

Issue #16832 has been reported by byroot (Jean Boussier).

20 messages 2020/05/06

[#98174] [Ruby master Bug#16837] Can we make Ruby 3.0 as fast as Ruby 2.7 with the new assertions? — takashikkbn@...

Issue #16837 has been reported by k0kubun (Takashi Kokubun).

10 messages 2020/05/07

[#98241] [Ruby master Bug#16845] Building Ruby with old existing system Ruby results in make error with ./tool/file2lastrev.rb — erik@...

Issue #16845 has been reported by ErikSwan (Erik Swan).

7 messages 2020/05/09

[#98256] [Ruby master Feature#16847] Cache instruction sequences by default — jean.boussier@...

Issue #16847 has been reported by byroot (Jean Boussier).

16 messages 2020/05/11

[#98257] [Ruby master Feature#16848] Allow callables in $LOAD_PATH — jean.boussier@...

Issue #16848 has been reported by byroot (Jean Boussier).

27 messages 2020/05/11

[#98318] [Ruby master Bug#16853] calling bla(hash, **kw) with a string-based hash passes the strings into **kw (worked < 2.7) — sylvain.joyeux@...4x.org

Issue #16853 has been reported by sylvain.joyeux (Sylvain Joyeux).

12 messages 2020/05/13

[#98355] [Ruby master Bug#16889] TracePoint.enable { ... } also activates the TracePoint for other threads, even outside the block — eregontp@...

Issue #16889 has been reported by Eregon (Benoit Daloze).

16 messages 2020/05/14

[#98363] [Ruby master Feature#16891] Restore Positional Argument to Keyword Conversion — merch-redmine@...

Issue #16891 has been reported by jeremyevans0 (Jeremy Evans).

23 messages 2020/05/14

[#98371] [Ruby master Feature#16894] Integer division for Ruby 3 — andrew@...

Issue #16894 has been reported by ankane (Andrew Kane).

18 messages 2020/05/15

[#98391] [Ruby master Bug#16896] MakeMakefile methods should be private — eregontp@...

Issue #16896 has been reported by Eregon (Benoit Daloze).

10 messages 2020/05/15

[#98396] [Ruby master Feature#16897] Can a Ruby 3.0 compatible general purpose memoizer be written in such a way that it matches Ruby 2 performance? — sam.saffron@...

Issue #16897 has been reported by sam.saffron (Sam Saffron).

25 messages 2020/05/16

[#98453] [Ruby master Bug#16904] rubygems: psych: superclass mismatch for class Mark (TypeError) — jaruga@...

Issue #16904 has been reported by jaruga (Jun Aruga).

18 messages 2020/05/20

[#98486] [Ruby master Bug#16908] Strange behaviour of Hash#shift when used with `default_proc`. — samuel@...

Issue #16908 has been reported by ioquatix (Samuel Williams).

14 messages 2020/05/23

[#98569] [Ruby master Bug#16921] s390x: ramdom test failures for timeout or segmentation fault — jaruga@...

Issue #16921 has been reported by jaruga (Jun Aruga).

9 messages 2020/05/29

[#98599] [Ruby master Bug#16926] Kernel#require does not load a feature twice when $LOAD_PATH has been modified spec fails only on 2.7 — eregontp@...

Issue #16926 has been reported by Eregon (Benoit Daloze).

12 messages 2020/05/31

[ruby-core:98592] [Ruby master Feature#16924] instance_eval equivalent for RubyVM::InstructionSequence

From: nunuu@...
Date: 2020-05-30 15:49:49 UTC
List: ruby-core #98592
Issue #16924 has been reported by Wuerfel21 (Ada Gottenstr舩er).

----------------------------------------
Feature #16924: instance_eval equivalent for RubyVM::InstructionSequence
https://bugs.ruby-lang.org/issues/16924

* Author: Wuerfel21 (Ada Gottenstr舩er)
* Status: Open
* Priority: Normal
----------------------------------------
# Abstract
Proposal to expose the ability to evaluate precompiled ISEQs in non-toplevel contexts.
# Background
A common pattern used for certain kinds of DSL is to instance_eval entire files, like this:
```ruby
___dsl_object.instance_eval(File.read(___path),___path,0)
```
This has certain advantages and disadvantages over other methods of executing DSL code (mainly that the global namespace is not being polluted by either the DSL itself or the code running in the DSL). I find it very useful.

Ruby exposes the RubyVM::InstructionSequence API, allowing caching of parsing/compilation steps to speed up execution. However, the resulting code can only be evaluated at the top level, disallowing it's use with DSLs designed to be instance_eval'd.

# Proposal
Add a `RubyVM::InstructionSequence#eval_in_instance` method that could be used to replace
```ruby
___dsl_object.instance_eval(File.read(___path),___path,0)
```
with
```ruby
iseq = RubyVM::InstructionSequence.compile_file(___path)
# iseq could be cached here
iseq.eval_in_instance(___dsl_object)
```
Note that while instance_eval makes local variables available if the evaluated argument is a string, this new method would not (as the local variables can't be known at compile time). This discrepancy already exists between  RubyVM::InstructionSequence#eval and all other standard library functions named eval, so I assume it's okay.

This new method could also replace some use cases of Kernal#eval (any where the passing of local variables is not required).
# Implementation
From a cursory glance at the relevant code, this seems like a fairly simple feature to implement. Maybe an additional parameter to `#compile` is needed to change the ISEQ type, I'm not sure. If no one who is more experienced at working with Ruby internals wants to step up to implement this feature, I will try it myself.

# Discussion
There is a rejected feature #12093 about evaluating ISEQs with a binding (which is not possible since the compiler needs to know the local variables of a binding to compile for it, thus the request got rejected). There was some talk about evaling inside an instance in the comments, but I assume that was forgotten about due to the ticket being closed. Therefore I think opening this new ticket is justified.




-- 
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>

In This Thread

Prev Next