summaryrefslogtreecommitdiff
path: root/struct.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-06-16 18:44:58 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-06-16 18:44:58 +0900
commit318d52e820c9ed1bc4c12aa97af49a89953649bc (patch)
treecbeaa0c9945d67a0e2d62faa35a4cc24afcff346 /struct.c
parent26c179d7e7e7ae0eb21050659c3e8778358230ab (diff)
Revert "Replaced accessors of `Struct` with `invokebuiltin`"
This reverts commit 19cabe8b09d92d033c244f32ff622b8e513375f1, which didn't support tool/lib/iseq_loader_checker.rb.
Diffstat (limited to 'struct.c')
-rw-r--r--struct.c43
1 files changed, 7 insertions, 36 deletions
diff --git a/struct.c b/struct.c
index 41349f71f5..be742fbee5 100644
--- a/struct.c
+++ b/struct.c
@@ -20,7 +20,6 @@
#include "internal/symbol.h"
#include "transient_heap.h"
#include "vm_core.h"
-#include "builtin.h"
/* only for struct[:field] access */
enum {
@@ -28,8 +27,8 @@ enum {
AREF_HASH_THRESHOLD = 10
};
-const rb_iseq_t *rb_method_for_self_aref(VALUE name, VALUE arg, const struct rb_builtin_function *func);
-const rb_iseq_t *rb_method_for_self_aset(VALUE name, VALUE arg, const struct rb_builtin_function *func);
+const rb_iseq_t *rb_method_for_self_aref(VALUE name, VALUE arg, rb_insn_func_t func);
+const rb_iseq_t *rb_method_for_self_aset(VALUE name, VALUE arg, rb_insn_func_t func);
VALUE rb_cStruct;
static ID id_members, id_back_members, id_keyword_init;
@@ -289,41 +288,11 @@ new_struct(VALUE name, VALUE super)
return rb_define_class_id_under(super, id, super);
}
-NORETURN(static void invalid_struct_pos(VALUE s, VALUE idx));
-
-static inline long
-struct_pos_num(VALUE s, VALUE idx)
-{
- long i = NUM2INT(idx);
- if (i < 0 || i >= RSTRUCT_LEN(s)) invalid_struct_pos(s, idx);
- return i;
-}
-
-static VALUE
-opt_struct_aref(rb_execution_context_t *ec, VALUE self, VALUE idx)
-{
- long i = struct_pos_num(self, idx);
- return RSTRUCT_GET(self, i);
-}
-
-static VALUE
-opt_struct_aset(rb_execution_context_t *ec, VALUE self, VALUE val, VALUE idx)
-{
- long i = struct_pos_num(self, idx);
- rb_struct_modify(self);
- RSTRUCT_SET(self, i, val);
- return val;
-}
-
-static const struct rb_builtin_function struct_aref_builtin =
- RB_BUILTIN_FUNCTION(0, struct_aref, opt_struct_aref, 1);
-static const struct rb_builtin_function struct_aset_builtin =
- RB_BUILTIN_FUNCTION(1, struct_aref, opt_struct_aset, 2);
-
static void
define_aref_method(VALUE nstr, VALUE name, VALUE off)
{
- const rb_iseq_t *iseq = rb_method_for_self_aref(name, off, &struct_aref_builtin);
+ rb_control_frame_t *FUNC_FASTCALL(rb_vm_opt_struct_aref)(rb_execution_context_t *, rb_control_frame_t *);
+ const rb_iseq_t *iseq = rb_method_for_self_aref(name, off, rb_vm_opt_struct_aref);
rb_add_method_iseq(nstr, SYM2ID(name), iseq, NULL, METHOD_VISI_PUBLIC);
}
@@ -331,7 +300,8 @@ define_aref_method(VALUE nstr, VALUE name, VALUE off)
static void
define_aset_method(VALUE nstr, VALUE name, VALUE off)
{
- const rb_iseq_t *iseq = rb_method_for_self_aset(name, off, &struct_aset_builtin);
+ rb_control_frame_t *FUNC_FASTCALL(rb_vm_opt_struct_aset)(rb_execution_context_t *, rb_control_frame_t *);
+ const rb_iseq_t *iseq = rb_method_for_self_aset(name, off, rb_vm_opt_struct_aset);
rb_add_method_iseq(nstr, SYM2ID(name), iseq, NULL, METHOD_VISI_PUBLIC);
}
@@ -1053,6 +1023,7 @@ rb_struct_pos(VALUE s, VALUE *name)
}
}
+NORETURN(static void invalid_struct_pos(VALUE s, VALUE idx));
static void
invalid_struct_pos(VALUE s, VALUE idx)
{