summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authorMatt Valentine-House <[email protected]>2024-01-31 20:56:08 +0000
committerKevin Newton <[email protected]>2024-02-13 21:19:12 -0500
commitfd3f776a05505d71c818620fe9c6ca8fb3d132ea (patch)
tree1c5692589598db6f4ea1d5147e1322f790f980c3 /vm_eval.c
parent068b19bd53148d91397d0443de78eeeb8c1628ba (diff)
[PRISM] Use Prism for `eval` if enabled
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 1053731260..4c607f76ca 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1643,9 +1643,40 @@ get_eval_default_path(void)
}
static const rb_iseq_t *
+pm_eval_make_iseq(VALUE src, VALUE fname, int line,
+ const struct rb_block *base_block)
+{
+ rb_iseq_t *iseq = NULL;
+ const rb_iseq_t *const parent = vm_block_iseq(base_block);
+ const rb_iseq_t *iseq = parent;
+ VALUE name = rb_fstring_lit("<compiled>");
+ fname = rb_fstring_lit("<compiled>");
+
+ pm_parse_result_t result = { 0 };
+ VALUE error;
+
+
+ error = pm_parse_string(&result, src, fname);
+
+ if (error == Qnil) {
+ iseq = pm_iseq_new_eval(&result.node, name, fname, fname, ln, parent, 0);
+ pm_parse_result_free(&result);
+ }
+ else {
+ pm_parse_result_free(&result);
+ rb_exc_raise(error);
+ }
+
+ return iseq;
+}
+
+static const rb_iseq_t *
eval_make_iseq(VALUE src, VALUE fname, int line,
const struct rb_block *base_block)
{
+ if (*rb_ruby_prism_ptr()) {
+ return pm_eval_make_iseq(src, fname, line, base_block);
+ }
const VALUE parser = rb_parser_new();
const rb_iseq_t *const parent = vm_block_iseq(base_block);
rb_iseq_t *iseq = NULL;