summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2020-10-27 18:49:17 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:26 -0400
commitc378c7a7cb937cd9fe5814f2838b1d6cd1d177b2 (patch)
tree1a809c1a7a7606ac2ec624e7e6083bc5828c832d /vm_method.c
parent0c52371c47d8b65f91ed5d2a7e2c14c96d286f57 (diff)
downloadruby-c378c7a7cb937cd9fe5814f2838b1d6cd1d177b2.tar.gz
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.c15
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