summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2025-11-30 16:53:59 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2026-01-31 18:41:29 +0900
commiteae7300a09a4b9bd87045b313dcdd464d12dd683 (patch)
treef54fcb75dc14c52739eea4b7cb71b15640ba6187
parentbd6fa7f5cca426901bc9162724966339440bc6cb (diff)
Typed data check for core data types
-rw-r--r--proc.c4
-rw-r--r--vm.c3
-rw-r--r--vm_core.h15
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;