mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Replaced accessors of Struct
with invokebuiltin
This commit is contained in:
parent
84160dc29b
commit
19cabe8b09
4 changed files with 45 additions and 30 deletions
|
@ -13168,6 +13168,7 @@ struct.$(OBJEXT): {$(VPATH)}backward/2/r_cast.h
|
|||
struct.$(OBJEXT): {$(VPATH)}backward/2/rmodule.h
|
||||
struct.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h
|
||||
struct.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
|
||||
struct.$(OBJEXT): {$(VPATH)}builtin.h
|
||||
struct.$(OBJEXT): {$(VPATH)}config.h
|
||||
struct.$(OBJEXT): {$(VPATH)}defines.h
|
||||
struct.$(OBJEXT): {$(VPATH)}encoding.h
|
||||
|
|
17
compile.c
17
compile.c
|
@ -9681,19 +9681,19 @@ caller_location(VALUE *path, VALUE *realpath)
|
|||
|
||||
typedef struct {
|
||||
VALUE arg;
|
||||
rb_insn_func_t func;
|
||||
VALUE func;
|
||||
int line;
|
||||
} accessor_args;
|
||||
|
||||
static const rb_iseq_t *
|
||||
method_for_self(VALUE name, VALUE arg, rb_insn_func_t func,
|
||||
method_for_self(VALUE name, VALUE arg, const struct rb_builtin_function *func,
|
||||
void (*build)(rb_iseq_t *, LINK_ANCHOR *, const void *))
|
||||
{
|
||||
VALUE path, realpath;
|
||||
accessor_args acc;
|
||||
|
||||
acc.arg = arg;
|
||||
acc.func = func;
|
||||
acc.func = (VALUE)func;
|
||||
acc.line = caller_location(&path, &realpath);
|
||||
struct rb_iseq_new_with_callback_callback_func *ifunc =
|
||||
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;
|
||||
|
||||
ADD_INSN1(ret, line, putobject, args->arg);
|
||||
ADD_INSN1(ret, line, opt_call_c_function, (VALUE)args->func);
|
||||
ADD_INSN1(ret, line, invokebuiltin, args->func);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -9731,24 +9731,23 @@ for_self_aset(rb_iseq_t *iseq, LINK_ANCHOR *ret, const void *a)
|
|||
|
||||
ADD_GETLOCAL(ret, line, numberof(vars)-1, 0);
|
||||
ADD_INSN1(ret, line, putobject, args->arg);
|
||||
ADD_INSN1(ret, line, opt_call_c_function, (VALUE)args->func);
|
||||
ADD_INSN(ret, line, pop);
|
||||
ADD_INSN1(ret, line, invokebuiltin, args->func);
|
||||
}
|
||||
|
||||
/*
|
||||
* func (index) -> (value)
|
||||
*/
|
||||
const rb_iseq_t *
|
||||
rb_method_for_self_aref(VALUE name, VALUE arg, rb_insn_func_t func)
|
||||
rb_method_for_self_aref(VALUE name, VALUE arg, const struct rb_builtin_function *func)
|
||||
{
|
||||
return method_for_self(name, arg, func, for_self_aref);
|
||||
}
|
||||
|
||||
/*
|
||||
* func (index, value) -> (index, value)
|
||||
* func (index, value) -> (value)
|
||||
*/
|
||||
const rb_iseq_t *
|
||||
rb_method_for_self_aset(VALUE name, VALUE arg, rb_insn_func_t func)
|
||||
rb_method_for_self_aset(VALUE name, VALUE arg, const struct rb_builtin_function *func)
|
||||
{
|
||||
return method_for_self(name, arg, func, for_self_aset);
|
||||
}
|
||||
|
|
43
struct.c
43
struct.c
|
@ -20,6 +20,7 @@
|
|||
#include "internal/symbol.h"
|
||||
#include "transient_heap.h"
|
||||
#include "vm_core.h"
|
||||
#include "builtin.h"
|
||||
|
||||
/* only for struct[:field] access */
|
||||
enum {
|
||||
|
@ -27,8 +28,8 @@ enum {
|
|||
AREF_HASH_THRESHOLD = 10
|
||||
};
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
VALUE rb_cStruct;
|
||||
static ID id_members, id_back_members, id_keyword_init;
|
||||
|
@ -288,11 +289,41 @@ 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)
|
||||
{
|
||||
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);
|
||||
const rb_iseq_t *iseq = rb_method_for_self_aref(name, off, &struct_aref_builtin);
|
||||
|
||||
rb_add_method_iseq(nstr, SYM2ID(name), iseq, NULL, METHOD_VISI_PUBLIC);
|
||||
}
|
||||
|
@ -300,8 +331,7 @@ define_aref_method(VALUE nstr, VALUE name, VALUE off)
|
|||
static void
|
||||
define_aset_method(VALUE nstr, VALUE name, VALUE off)
|
||||
{
|
||||
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);
|
||||
const rb_iseq_t *iseq = rb_method_for_self_aset(name, off, &struct_aset_builtin);
|
||||
|
||||
rb_add_method_iseq(nstr, SYM2ID(name), iseq, NULL, METHOD_VISI_PUBLIC);
|
||||
}
|
||||
|
@ -1023,7 +1053,6 @@ 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)
|
||||
{
|
||||
|
|
|
@ -3621,20 +3621,6 @@ vm_once_clear(VALUE data)
|
|||
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 */
|
||||
|
||||
static enum defined_type
|
||||
|
|
Loading…
Reference in a new issue