Revert "Replaced accessors of Struct with invokebuiltin"

This reverts commit 19cabe8b09d92d033c244f32ff622b8e513375f1,
which didn't support tool/lib/iseq_loader_checker.rb.
This commit is contained in:
Nobuyoshi Nakada 2020-06-16 18:44:58 +09:00
parent 26c179d7e7
commit 318d52e820
No known key found for this signature in database
GPG Key ID: 7CD2805BFA3770C6
4 changed files with 30 additions and 45 deletions

View File

@ -13168,7 +13168,6 @@ struct.$(OBJEXT): {$(VPATH)}backward/2/r_cast.h
struct.$(OBJEXT): {$(VPATH)}backward/2/rmodule.h struct.$(OBJEXT): {$(VPATH)}backward/2/rmodule.h
struct.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h struct.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h
struct.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h struct.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
struct.$(OBJEXT): {$(VPATH)}builtin.h
struct.$(OBJEXT): {$(VPATH)}config.h struct.$(OBJEXT): {$(VPATH)}config.h
struct.$(OBJEXT): {$(VPATH)}defines.h struct.$(OBJEXT): {$(VPATH)}defines.h
struct.$(OBJEXT): {$(VPATH)}encoding.h struct.$(OBJEXT): {$(VPATH)}encoding.h

View File

@ -9681,19 +9681,19 @@ caller_location(VALUE *path, VALUE *realpath)
typedef struct { typedef struct {
VALUE arg; VALUE arg;
VALUE func; rb_insn_func_t func;
int line; int line;
} accessor_args; } accessor_args;
static const rb_iseq_t * static const rb_iseq_t *
method_for_self(VALUE name, VALUE arg, const struct rb_builtin_function *func, method_for_self(VALUE name, VALUE arg, rb_insn_func_t func,
void (*build)(rb_iseq_t *, LINK_ANCHOR *, const void *)) void (*build)(rb_iseq_t *, LINK_ANCHOR *, const void *))
{ {
VALUE path, realpath; VALUE path, realpath;
accessor_args acc; accessor_args acc;
acc.arg = arg; acc.arg = arg;
acc.func = (VALUE)func; acc.func = func;
acc.line = caller_location(&path, &realpath); acc.line = caller_location(&path, &realpath);
struct rb_iseq_new_with_callback_callback_func *ifunc = struct rb_iseq_new_with_callback_callback_func *ifunc =
rb_iseq_new_with_callback_new_callback(build, &acc); rb_iseq_new_with_callback_new_callback(build, &acc);
@ -9714,7 +9714,7 @@ for_self_aref(rb_iseq_t *iseq, LINK_ANCHOR *ret, const void *a)
body->param.size = 0; body->param.size = 0;
ADD_INSN1(ret, line, putobject, args->arg); ADD_INSN1(ret, line, putobject, args->arg);
ADD_INSN1(ret, line, invokebuiltin, args->func); ADD_INSN1(ret, line, opt_call_c_function, (VALUE)args->func);
} }
static void static void
@ -9731,23 +9731,24 @@ for_self_aset(rb_iseq_t *iseq, LINK_ANCHOR *ret, const void *a)
ADD_GETLOCAL(ret, line, numberof(vars)-1, 0); ADD_GETLOCAL(ret, line, numberof(vars)-1, 0);
ADD_INSN1(ret, line, putobject, args->arg); ADD_INSN1(ret, line, putobject, args->arg);
ADD_INSN1(ret, line, invokebuiltin, args->func); ADD_INSN1(ret, line, opt_call_c_function, (VALUE)args->func);
ADD_INSN(ret, line, pop);
} }
/* /*
* func (index) -> (value) * func (index) -> (value)
*/ */
const rb_iseq_t * const rb_iseq_t *
rb_method_for_self_aref(VALUE name, VALUE arg, const struct rb_builtin_function *func) rb_method_for_self_aref(VALUE name, VALUE arg, rb_insn_func_t func)
{ {
return method_for_self(name, arg, func, for_self_aref); return method_for_self(name, arg, func, for_self_aref);
} }
/* /*
* func (index, value) -> (value) * func (index, value) -> (index, value)
*/ */
const rb_iseq_t * const rb_iseq_t *
rb_method_for_self_aset(VALUE name, VALUE arg, const struct rb_builtin_function *func) rb_method_for_self_aset(VALUE name, VALUE arg, rb_insn_func_t func)
{ {
return method_for_self(name, arg, func, for_self_aset); return method_for_self(name, arg, func, for_self_aset);
} }

View File

@ -20,7 +20,6 @@
#include "internal/symbol.h" #include "internal/symbol.h"
#include "transient_heap.h" #include "transient_heap.h"
#include "vm_core.h" #include "vm_core.h"
#include "builtin.h"
/* only for struct[:field] access */ /* only for struct[:field] access */
enum { enum {
@ -28,8 +27,8 @@ enum {
AREF_HASH_THRESHOLD = 10 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_aref(VALUE name, VALUE arg, rb_insn_func_t 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_aset(VALUE name, VALUE arg, rb_insn_func_t func);
VALUE rb_cStruct; VALUE rb_cStruct;
static ID id_members, id_back_members, id_keyword_init; 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); 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 static void
define_aref_method(VALUE nstr, VALUE name, VALUE off) 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); 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 static void
define_aset_method(VALUE nstr, VALUE name, VALUE off) 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); 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 static void
invalid_struct_pos(VALUE s, VALUE idx) invalid_struct_pos(VALUE s, VALUE idx)
{ {

View File

@ -3621,6 +3621,20 @@ vm_once_clear(VALUE data)
return Qnil; return Qnil;
} }
rb_control_frame_t *
FUNC_FASTCALL(rb_vm_opt_struct_aref)(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp)
{
TOPN(0) = rb_struct_aref(GET_SELF(), TOPN(0));
return reg_cfp;
}
rb_control_frame_t *
FUNC_FASTCALL(rb_vm_opt_struct_aset)(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp)
{
rb_struct_aset(GET_SELF(), TOPN(0), TOPN(1));
return reg_cfp;
}
/* defined insn */ /* defined insn */
static enum defined_type static enum defined_type