summaryrefslogtreecommitdiff
path: root/vm_core.h
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-03-25 20:29:09 +0900
committerGitHub <noreply@github.com>2022-03-25 20:29:09 +0900
commit69967ee64eac9ce65b83533a566d69d12a6046d0 (patch)
treeb7012ba8b7ad5b1c99d7b1f9b2345ecd8117f433 /vm_core.h
parent7ee26740e41f99d3da37df36b956237fbf36868e (diff)
Revert "Finer-grained inline constant cache invalidation"
This reverts commits for [Feature #18589]: * 8008fb7352abc6fba433b99bf20763cf0d4adb38 "Update formatting per feedback" * 8f6eaca2e19828e92ecdb28b0fe693d606a03f96 "Delete ID from constant cache table if it becomes empty on ISEQ free" * 629908586b4bead1103267652f8b96b1083573a8 "Finer-grained inline constant cache invalidation" MSWin builds on AppVeyor have been crashing since the merger.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5715 Merged-By: nobu <nobu@ruby-lang.org>
Diffstat (limited to 'vm_core.h')
-rw-r--r--vm_core.h40
1 files changed, 32 insertions, 8 deletions
diff --git a/vm_core.h b/vm_core.h
index 76caafbdbb..d985bd40ba 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -229,14 +229,44 @@ struct iseq_inline_constant_cache_entry {
VALUE flags;
VALUE value; // v0
- VALUE _unused1; // v1
- VALUE _unused2; // v2
+ union ic_serial_entry ic_serial; // v1, v2
const rb_cref_t *ic_cref; // v3
};
STATIC_ASSERT(sizeof_iseq_inline_constant_cache_entry,
(offsetof(struct iseq_inline_constant_cache_entry, ic_cref) +
sizeof(const rb_cref_t *)) <= sizeof(struct RObject));
+#if SIZEOF_SERIAL_T <= SIZEOF_VALUE
+
+#define GET_IC_SERIAL(ice) (ice)->ic_serial.raw
+#define SET_IC_SERIAL(ice, v) (ice)->ic_serial.raw = (v)
+
+#else
+
+static inline rb_serial_t
+get_ic_serial(const struct iseq_inline_constant_cache_entry *ice)
+{
+ union ic_serial_entry tmp;
+ tmp.data[0] = ice->ic_serial.data[0];
+ tmp.data[1] = ice->ic_serial.data[1];
+ return tmp.raw;
+}
+
+#define GET_IC_SERIAL(ice) get_ic_serial(ice)
+
+static inline void
+set_ic_serial(struct iseq_inline_constant_cache_entry *ice, rb_serial_t v)
+{
+ union ic_serial_entry tmp;
+ tmp.raw = v;
+ ice->ic_serial.data[0] = tmp.data[0];
+ ice->ic_serial.data[1] = tmp.data[1];
+}
+
+#define SET_IC_SERIAL(ice, v) set_ic_serial((ice), (v))
+
+#endif
+
struct iseq_inline_constant_cache {
struct iseq_inline_constant_cache_entry *entry;
// For YJIT: the index to the opt_getinlinecache instruction in the same iseq.
@@ -692,12 +722,6 @@ typedef struct rb_vm_struct {
struct rb_id_table *negative_cme_table;
st_table *overloaded_cme_table; // cme -> overloaded_cme
- // This id table contains a mapping from ID to ICs. It does this with ID
- // keys and nested st_tables as values. The nested tables have ICs as keys
- // and Qtrue as values. It is used when inline constant caches need to be
- // invalidated or ISEQs are being freed.
- struct rb_id_table *constant_cache;
-
#ifndef VM_GLOBAL_CC_CACHE_TABLE_SIZE
#define VM_GLOBAL_CC_CACHE_TABLE_SIZE 1023
#endif