Feature #14814 ยป 0001-rb_vm_insn_addr2insn-use-st-to-perform-addr2insn-map.patch
compile.c | ||
---|---|---|
#include "ruby/encoding.h"
|
||
#include "ruby/re.h"
|
||
#include "ruby/util.h"
|
||
#include "internal.h"
|
||
#include "encindex.h"
|
||
#include <math.h>
|
||
... | ... | |
}
|
||
#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
|
||
int
|
||
rb_vm_insn_addr2insn(const void *addr) /* cold path */
|
||
static st_table *addr2insn;
|
||
void
|
||
rb_addr2insn_init(void)
|
||
{
|
||
int insn;
|
||
const void * const *table = rb_vm_get_insns_address_table();
|
||
st_data_t insn;
|
||
addr2insn = st_init_numtable_with_size(VM_INSTRUCTION_SIZE);
|
||
for (insn = 0; insn < VM_INSTRUCTION_SIZE; insn++) {
|
||
if (table[insn] == addr) {
|
||
return insn;
|
||
}
|
||
st_add_direct(addr2insn, (st_data_t)table[insn], insn);
|
||
}
|
||
}
|
||
int
|
||
rb_vm_insn_addr2insn(const void *addr)
|
||
{
|
||
st_data_t key = (st_data_t)addr;
|
||
st_data_t val;
|
||
if (st_lookup(addr2insn, key, &val)) {
|
||
return (int)val;
|
||
}
|
||
rb_bug("rb_vm_insn_addr2insn: invalid insn address: %p", addr);
|
||
}
|
||
#endif
|
||
#endif /* OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE */
|
||
VALUE *
|
||
rb_iseq_original_iseq(const rb_iseq_t *iseq) /* cold path */
|
eval.c | ||
---|---|---|
#endif
|
||
Init_BareVM();
|
||
Init_heap();
|
||
rb_addr2insn_init();
|
||
Init_vm_objects();
|
||
EC_PUSH_TAG(GET_EC());
|
iseq.c | ||
---|---|---|
static VALUE
|
||
rb_vm_insn_addr2insn2(const void *addr)
|
||
{
|
||
VALUE insn;
|
||
const void * const *table = rb_vm_get_insns_address_table();
|
||
for (insn = 0; insn < VM_INSTRUCTION_SIZE; insn++) {
|
||
if (table[insn] == addr) {
|
||
return insn;
|
||
}
|
||
}
|
||
rb_bug("rb_vm_insn_addr2insn: invalid insn address: %p", addr);
|
||
return (VALUE)rb_vm_insn_addr2insn(addr);
|
||
}
|
||
#endif
|
||
vm_core.h | ||
---|---|---|
#endif /* OPT_STACK_CACHING */
|
||
#endif /* OPT_CALL_THREADED_CODE */
|
||
#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
|
||
void rb_addr2insn_init(void);
|
||
#else
|
||
static inline void rb_addr2insn_init(void) { }
|
||
#endif
|
||
typedef unsigned long rb_num_t;
|
||
typedef signed long rb_snum_t;
|
||
-
|