diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2020-10-27 18:49:17 -0400 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2021-10-20 18:19:26 -0400 |
commit | c378c7a7cb937cd9fe5814f2838b1d6cd1d177b2 (patch) | |
tree | 1a809c1a7a7606ac2ec624e7e6083bc5828c832d /vm_method.c | |
parent | 0c52371c47d8b65f91ed5d2a7e2c14c96d286f57 (diff) |
MicroJIT: generate less code for CFUNCs
Added UJIT_CHECK_MODE. Set to 1 to double check method dispatch in
generated code.
It's surprising to me that we need to watch both cc and cme. There might
be opportunities to simplify there.
Diffstat (limited to 'vm_method.c')
-rw-r--r-- | vm_method.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/vm_method.c b/vm_method.c index 842c19c12b..55fb2b5337 100644 --- a/vm_method.c +++ b/vm_method.c @@ -3,6 +3,7 @@ */ #include "id_table.h" +#include "ujit_compile.h" #define METHOD_DEBUG 0 @@ -114,6 +115,19 @@ rb_vm_mtbl_dump(const char *msg, VALUE klass, ID target_mid) vm_mtbl_dump(klass, target_mid); } +void +rb_vm_cc_invalidate(const struct rb_callcache *cc) +{ + VM_ASSERT(IMEMO_TYPE_P(cc, imemo_callcache)); + VM_ASSERT(cc != vm_cc_empty()); + VM_ASSERT(cc->klass != 0); // should be enable + + *(VALUE *)&cc->klass = 0; + rb_ujit_method_lookup_change((VALUE)cc); + RB_DEBUG_COUNTER_INC(cc_ent_invalidate); +} + + static inline void vm_cme_invalidate(rb_callable_method_entry_t *cme) { @@ -121,6 +135,7 @@ vm_cme_invalidate(rb_callable_method_entry_t *cme) VM_ASSERT(callable_method_entry_p(cme)); METHOD_ENTRY_INVALIDATED_SET(cme); RB_DEBUG_COUNTER_INC(cc_cme_invalidate); + rb_ujit_method_lookup_change((VALUE)cme); } void |