summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2025-12-01 15:15:42 -0800
committerJohn Hawthorn <john@hawthorn.email>2025-12-03 10:13:36 -0800
commitf9cd94f17d6fef49f1ee5cbb8f66839f0d7a5db9 (patch)
tree685719937baf45121adb62f31626778be5dbac47 /variable.c
parentfcf3939780972d587b18afc26c4abd2da2c0b7ec (diff)
wb-protect autoload_const
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c45
1 files changed, 21 insertions, 24 deletions
diff --git a/variable.c b/variable.c
index 9a7e11850d..faeffec660 100644
--- a/variable.c
+++ b/variable.c
@@ -2734,7 +2734,7 @@ autoload_const_free(void *ptr)
static const rb_data_type_t autoload_const_type = {
"autoload_const",
{autoload_const_mark_and_move, autoload_const_free, autoload_const_memsize, autoload_const_mark_and_move,},
- 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
};
static struct autoload_data *
@@ -2778,12 +2778,12 @@ autoload_copy_table_for_box_i(st_data_t key, st_data_t value, st_data_t arg)
struct autoload_data *autoload_data = rb_check_typeddata(autoload_data_value, &autoload_data_type);
VALUE new_value = TypedData_Make_Struct(0, struct autoload_const, &autoload_const_type, autoload_const);
- autoload_const->box_value = rb_get_box_object((rb_box_t *)box);
- autoload_const->module = src_const->module;
+ RB_OBJ_WRITE(new_value, &autoload_const->box_value, rb_get_box_object((rb_box_t *)box));
+ RB_OBJ_WRITE(new_value, &autoload_const->module, src_const->module);
autoload_const->name = src_const->name;
- autoload_const->value = src_const->value;
+ RB_OBJ_WRITE(new_value, &autoload_const->value, src_const->value);
autoload_const->flag = src_const->flag;
- autoload_const->autoload_data_value = autoload_data_value;
+ RB_OBJ_WRITE(new_value, &autoload_const->autoload_data_value, autoload_data_value);
ccan_list_add_tail(&autoload_data->constants, &autoload_const->cnode);
st_insert(tbl, (st_data_t)autoload_const->name, (st_data_t)new_value);
@@ -2907,12 +2907,12 @@ autoload_synchronized(VALUE _arguments)
{
struct autoload_const *autoload_const;
VALUE autoload_const_value = TypedData_Make_Struct(0, struct autoload_const, &autoload_const_type, autoload_const);
- autoload_const->box_value = arguments->box_value;
- autoload_const->module = arguments->module;
+ RB_OBJ_WRITE(autoload_const_value, &autoload_const->box_value, arguments->box_value);
+ RB_OBJ_WRITE(autoload_const_value, &autoload_const->module, arguments->module);
autoload_const->name = arguments->name;
autoload_const->value = Qundef;
autoload_const->flag = CONST_PUBLIC;
- autoload_const->autoload_data_value = autoload_data_value;
+ RB_OBJ_WRITE(autoload_const_value, &autoload_const->autoload_data_value, autoload_data_value);
ccan_list_add_tail(&autoload_data->constants, &autoload_const->cnode);
st_insert(autoload_table, (st_data_t)arguments->name, (st_data_t)autoload_const_value);
RB_OBJ_WRITTEN(autoload_table_value, Qundef, autoload_const_value);
@@ -3920,21 +3920,21 @@ rb_const_set(VALUE klass, ID id, VALUE val)
const_added(klass, id);
}
-static struct autoload_data *
-autoload_data_for_named_constant(VALUE module, ID name, struct autoload_const **autoload_const_pointer)
+static VALUE
+autoload_const_value_for_named_constant(VALUE module, ID name, struct autoload_const **autoload_const_pointer)
{
- VALUE autoload_data_value = autoload_data(module, name);
- if (!autoload_data_value) return 0;
+ VALUE autoload_const_value = autoload_data(module, name);
+ if (!autoload_const_value) return Qfalse;
- struct autoload_data *autoload_data = get_autoload_data(autoload_data_value, autoload_const_pointer);
- if (!autoload_data) return 0;
+ struct autoload_data *autoload_data = get_autoload_data(autoload_const_value, autoload_const_pointer);
+ if (!autoload_data) return Qfalse;
/* for autoloading thread, keep the defined value to autoloading storage */
if (autoload_by_current(autoload_data)) {
- return autoload_data;
+ return autoload_const_value;
}
- return 0;
+ return Qfalse;
}
static void
@@ -3954,13 +3954,13 @@ const_tbl_update(struct autoload_const *ac, int autoload_force)
RUBY_ASSERT_CRITICAL_SECTION_ENTER();
VALUE file = ac->file;
int line = ac->line;
- struct autoload_data *ele = autoload_data_for_named_constant(klass, id, &ac);
+ VALUE autoload_const_value = autoload_const_value_for_named_constant(klass, id, &ac);
- if (!autoload_force && ele) {
+ if (!autoload_force && autoload_const_value) {
rb_clear_constant_cache_for_id(id);
- ac->value = val; /* autoload_data is non-WB-protected */
- ac->file = rb_source_location(&ac->line);
+ RB_OBJ_WRITE(autoload_const_value, &ac->value, val);
+ RB_OBJ_WRITE(autoload_const_value, &ac->file, rb_source_location(&ac->line));
}
else {
/* otherwise autoloaded constant, allow to override */
@@ -4054,10 +4054,7 @@ set_const_visibility(VALUE mod, int argc, const VALUE *argv,
ce->flag &= ~mask;
ce->flag |= flag;
if (UNDEF_P(ce->value)) {
- struct autoload_data *ele;
-
- ele = autoload_data_for_named_constant(mod, id, &ac);
- if (ele) {
+ if (autoload_const_value_for_named_constant(mod, id, &ac)) {
ac->flag &= ~mask;
ac->flag |= flag;
}