From eae7300a09a4b9bd87045b313dcdd464d12dd683 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 30 Nov 2025 16:53:59 +0900 Subject: Typed data check for core data types --- proc.c | 4 +++- vm.c | 3 ++- vm_core.h | 15 +++++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/proc.c b/proc.c index 5f23e5fed6..298497401d 100644 --- a/proc.c +++ b/proc.c @@ -98,7 +98,7 @@ proc_memsize(const void *ptr) return sizeof(rb_proc_t); } -static const rb_data_type_t proc_data_type = { +const rb_data_type_t ruby_proc_data_type = { "proc", { proc_mark_and_move, @@ -109,6 +109,8 @@ static const rb_data_type_t proc_data_type = { 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED }; +#define proc_data_type ruby_proc_data_type + VALUE rb_proc_alloc(VALUE klass) { diff --git a/vm.c b/vm.c index f2e2ba1b89..05d2025a12 100644 --- a/vm.c +++ b/vm.c @@ -3525,12 +3525,13 @@ vm_memsize(const void *ptr) // struct rb_objspace *objspace; } -static const rb_data_type_t vm_data_type = { +const rb_data_type_t ruby_vm_data_type = { "VM", {0, 0, vm_memsize,}, 0, 0, RUBY_TYPED_FREE_IMMEDIATELY }; +#define vm_data_type ruby_vm_data_type static VALUE vm_default_params(void) diff --git a/vm_core.h b/vm_core.h index e1a21afc01..39f8a4749f 100644 --- a/vm_core.h +++ b/vm_core.h @@ -324,11 +324,10 @@ struct rb_calling_info { struct rb_execution_context_struct; #if 1 -#define CoreDataFromValue(obj, type) (type*)DATA_PTR(obj) +#define GetCoreDataFromValue(obj, type, data_type, ptr) ((ptr) = (type*)RTYPEDDATA_GET_DATA(obj)) #else -#define CoreDataFromValue(obj, type) (type*)rb_data_object_get(obj) +#define GetCoreDataFromValue(obj, type, data_type, ptr) TypedData_Get_Struct(obj, type, data_type, ptr) #endif -#define GetCoreDataFromValue(obj, type, ptr) ((ptr) = CoreDataFromValue((obj), type)) typedef struct rb_iseq_location_struct { VALUE pathobj; /* String (path) or Array [path, realpath]. Frozen. */ @@ -635,8 +634,10 @@ enum ruby_special_exceptions { ruby_special_error_count }; +extern const rb_data_type_t ruby_vm_data_type; + #define GetVMPtr(obj, ptr) \ - GetCoreDataFromValue((obj), rb_vm_t, (ptr)) + GetCoreDataFromValue((obj), rb_vm_t, &ruby_vm_data_type, (ptr)) struct rb_vm_struct; typedef void rb_vm_at_exit_func(struct rb_vm_struct*); @@ -1282,8 +1283,10 @@ RUBY_EXTERN VALUE rb_mRubyVMFrozenCore; RUBY_EXTERN VALUE rb_block_param_proxy; RUBY_SYMBOL_EXPORT_END +extern const rb_data_type_t ruby_proc_data_type; + #define GetProcPtr(obj, ptr) \ - GetCoreDataFromValue((obj), rb_proc_t, (ptr)) + GetCoreDataFromValue((obj), rb_proc_t, &ruby_proc_data_type, (ptr)) typedef struct { const struct rb_block block; @@ -1309,7 +1312,7 @@ typedef struct { extern const rb_data_type_t ruby_binding_data_type; #define GetBindingPtr(obj, ptr) \ - GetCoreDataFromValue((obj), rb_binding_t, (ptr)) + GetCoreDataFromValue((obj), rb_binding_t, &ruby_binding_data_type, (ptr)) typedef struct { const struct rb_block block; -- cgit v1.2.3