1#ifndef RUBY_VM_CALLINFO_H
2#define RUBY_VM_CALLINFO_H
31#define VM_CALL_ARGS_SPLAT (0x01 << VM_CALL_ARGS_SPLAT_bit)
32#define VM_CALL_ARGS_BLOCKARG (0x01 << VM_CALL_ARGS_BLOCKARG_bit)
33#define VM_CALL_FCALL (0x01 << VM_CALL_FCALL_bit)
34#define VM_CALL_VCALL (0x01 << VM_CALL_VCALL_bit)
35#define VM_CALL_ARGS_SIMPLE (0x01 << VM_CALL_ARGS_SIMPLE_bit)
36#define VM_CALL_BLOCKISEQ (0x01 << VM_CALL_BLOCKISEQ_bit)
37#define VM_CALL_KWARG (0x01 << VM_CALL_KWARG_bit)
38#define VM_CALL_KW_SPLAT (0x01 << VM_CALL_KW_SPLAT_bit)
39#define VM_CALL_TAILCALL (0x01 << VM_CALL_TAILCALL_bit)
40#define VM_CALL_SUPER (0x01 << VM_CALL_SUPER_bit)
41#define VM_CALL_ZSUPER (0x01 << VM_CALL_ZSUPER_bit)
42#define VM_CALL_OPT_SEND (0x01 << VM_CALL_OPT_SEND_bit)
43#define VM_CALL_KW_SPLAT_MUT (0x01 << VM_CALL_KW_SPLAT_MUT_bit)
51rb_callinfo_kwarg_bytes(
int keyword_len)
74#define CI_EMBED_TAG_bits 1
75#define CI_EMBED_ARGC_bits 15
76#define CI_EMBED_FLAG_bits 16
77#define CI_EMBED_ID_bits 32
78#elif SIZEOF_VALUE == 4
79#define CI_EMBED_TAG_bits 1
80#define CI_EMBED_ARGC_bits 3
81#define CI_EMBED_FLAG_bits 13
82#define CI_EMBED_ID_bits 15
85#if (CI_EMBED_TAG_bits + CI_EMBED_ARGC_bits + CI_EMBED_FLAG_bits + CI_EMBED_ID_bits) != (SIZEOF_VALUE * 8)
89#define CI_EMBED_FLAG 0x01
90#define CI_EMBED_ARGC_SHFT (CI_EMBED_TAG_bits)
91#define CI_EMBED_ARGC_MASK ((((VALUE)1)<<CI_EMBED_ARGC_bits) - 1)
92#define CI_EMBED_FLAG_SHFT (CI_EMBED_TAG_bits + CI_EMBED_ARGC_bits)
93#define CI_EMBED_FLAG_MASK ((((VALUE)1)<<CI_EMBED_FLAG_bits) - 1)
94#define CI_EMBED_ID_SHFT (CI_EMBED_TAG_bits + CI_EMBED_ARGC_bits + CI_EMBED_FLAG_bits)
95#define CI_EMBED_ID_MASK ((((VALUE)1)<<CI_EMBED_ID_bits) - 1)
127 if (vm_ci_packed_p(ci)) {
135static inline unsigned int
138 if (vm_ci_packed_p(ci)) {
142 return (
unsigned int)ci->
flag;
146static inline unsigned int
149 if (vm_ci_packed_p(ci)) {
153 return (
unsigned int)ci->
argc;
160 if (vm_ci_packed_p(ci)) {
171 if (vm_ci_packed_p(ci)) {
172 fprintf(stderr,
"packed_ci ID:%s flag:%x argc:%u\n",
173 rb_id2name(vm_ci_mid(ci)), vm_ci_flag(ci), vm_ci_argc(ci));
180#define vm_ci_new(mid, flag, argc, kwarg) vm_ci_new_(mid, flag, argc, kwarg, __FILE__, __LINE__)
181#define vm_ci_new_runtime(mid, flag, argc, kwarg) vm_ci_new_runtime_(mid, flag, argc, kwarg, __FILE__, __LINE__)
184#define VM_CI_EMBEDDABLE_P(mid, flag, argc, kwarg) \
185 (((mid ) & ~CI_EMBED_ID_MASK) ? false : \
186 ((flag) & ~CI_EMBED_FLAG_MASK) ? false : \
187 ((argc) & ~CI_EMBED_ARGC_MASK) ? false : \
188 (kwarg) ? false : true)
190#define vm_ci_new_id(mid, flag, argc, must_zero) \
191 ((const struct rb_callinfo *) \
192 ((((VALUE)(mid )) << CI_EMBED_ID_SHFT) | \
193 (((VALUE)(flag)) << CI_EMBED_FLAG_SHFT) | \
194 (((VALUE)(argc)) << CI_EMBED_ARGC_SHFT) | \
207 const bool debug = 0;
208 if (
debug) fprintf(stderr,
"%s:%d ",
file, line);
239#define VM_CALLINFO_NOT_UNDER_GC IMEMO_FL_USER0
247 else if (vm_ci_packed_p(ci)) {
256#define VM_CI_ON_STACK(mid_, flags_, argc_, kwarg_) \
257 (struct rb_callinfo) { \
259 (imemo_callinfo << FL_USHIFT) | \
260 VM_CALLINFO_NOT_UNDER_GC, \
293#define VM_CALLCACHE_UNMARKABLE IMEMO_FL_USER0
305#define VM_CC_ON_STACK(clazz, call, aux, cme) \
306 (struct rb_callcache) { \
308 (imemo_callcache << FL_USHIFT) | \
309 VM_CALLCACHE_UNMARKABLE, \
339static inline unsigned int
346static inline unsigned int
347vm_cc_cmethod_missing_reason(
const struct rb_callcache *cc)
385#define vm_cc_empty() rb_vm_empty_cc()
398vm_cc_attr_index_set(
const struct rb_callcache *cc,
int index)
448 return ccs->debug_sig == ~(
VALUE)ccs;
#define RB_DEBUG_COUNTER_INC(type)
size_t rb_size_mul_add_or_raise(size_t x, size_t y, size_t z, VALUE exc)
VALUE rb_imemo_new(enum imemo_type type, VALUE v1, VALUE v2, VALUE v3, VALUE v0)
#define IMEMO_TYPE_P(v, t)
const char * rb_id2name(ID)
#define METHOD_ENTRY_INVALIDATED(me)
const struct rb_callcache * cc
const struct rb_callinfo * ci
const vm_call_handler call_
const struct rb_callable_method_entry_struct *const cme_
union rb_callcache::@184 aux_
enum method_missing_reason method_missing_reason
const unsigned int attr_index
const struct rb_callinfo_kwarg * kwarg
const struct rb_callcache * cc
const struct rb_callinfo * ci
const struct rb_callable_method_entry_struct * cme
struct rb_class_cc_entries::rb_class_cc_entries_entry * entries
VALUE(* vm_call_handler)(struct rb_execution_context_struct *ec, struct rb_control_frame_struct *cfp, struct rb_calling_info *calling)
@ VM_CALL_ARGS_SIMPLE_bit
@ VM_CALL_KW_SPLAT_MUT_bit
@ VM_CALL_ARGS_BLOCKARG_bit
#define CI_EMBED_ARGC_MASK
#define VM_CALLCACHE_UNMARKABLE
#define CI_EMBED_ARGC_SHFT
#define vm_ci_new_id(mid, flag, argc, must_zero)
#define VM_CALLINFO_NOT_UNDER_GC
#define CI_EMBED_FLAG_SHFT
#define CI_EMBED_FLAG_MASK
void rb_vm_ccs_free(struct rb_class_cc_entries *ccs)
const struct rb_callcache * rb_vm_empty_cc(void)
#define VM_CI_EMBEDDABLE_P(mid, flag, argc, kwarg)