Project

General

Profile

Feature #14814 ยป 0001-rb_vm_insn_addr2insn-use-st-to-perform-addr2insn-map.patch

normalperson (Eric Wong), 06/02/2018 10:54 PM

View differences:

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;
-
    (1-1/1)