Skip to content

Commit

Permalink
RJIT: Distinguish Pointer with Array
Browse files Browse the repository at this point in the history
This is more convenient for accessing those fields.
  • Loading branch information
k0kubun committed Dec 22, 2023
1 parent 40e3f78 commit 19d082d
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 5 deletions.
34 changes: 34 additions & 0 deletions lib/ruby_vm/rjit/c_pointer.rb
Expand Up @@ -238,6 +238,40 @@ def self.[]=(addr, value)
end
end

# Basically Immediate but without #* to skip auto-dereference of structs.
class Array
attr_reader :type

# @param addr [Integer]
# @param type [Class] RubyVM::RJIT::CType::*
def initialize(addr, type)
@addr = addr
@type = type
end

# Array access
def [](index)
@type.new(@addr)[index]
end

# Array set
# @param index [Integer]
# @param value [Integer, RubyVM::RJIT::CPointer::Struct] an address itself or an object that return an address with to_i
def []=(index, value)
@type.new(@addr)[index] = value
end

private

def self.define(block)
Class.new(self) do
define_method(:initialize) do |addr|
super(addr, block.call)
end
end
end
end

class Pointer
attr_reader :type

Expand Down
8 changes: 8 additions & 0 deletions lib/ruby_vm/rjit/c_type.rb
Expand Up @@ -62,6 +62,14 @@ def self.new
end
end

class Array
def self.new(&block)
CPointer.with_class_name('Array', block.object_id.to_s) do
CPointer::Array.define(block)
end
end
end

class Pointer
# This takes a block to avoid "stack level too deep" on a cyclic reference
# @param block [Proc]
Expand Down
8 changes: 4 additions & 4 deletions rjit_c.rb
Expand Up @@ -820,7 +820,7 @@ def C.RArray
), Primitive.cexpr!("OFFSETOF(((struct RArray *)NULL)->as.heap, aux)")],
ptr: [CType::Pointer.new { self.VALUE }, Primitive.cexpr!("OFFSETOF(((struct RArray *)NULL)->as.heap, ptr)")],
),
ary: CType::Pointer.new { self.VALUE },
ary: CType::Array.new { self.VALUE },
), Primitive.cexpr!("OFFSETOF((*((struct RArray *)NULL)), as)")],
)
end
Expand Down Expand Up @@ -848,7 +848,7 @@ def C.RObject
ivptr: [CType::Pointer.new { self.VALUE }, Primitive.cexpr!("OFFSETOF(((struct RObject *)NULL)->as.heap, ivptr)")],
iv_index_tbl: [CType::Pointer.new { self.rb_id_table }, Primitive.cexpr!("OFFSETOF(((struct RObject *)NULL)->as.heap, iv_index_tbl)")],
),
ary: CType::Pointer.new { self.VALUE },
ary: CType::Array.new { self.VALUE },
), Primitive.cexpr!("OFFSETOF((*((struct RObject *)NULL)), as)")],
)
end
Expand All @@ -871,7 +871,7 @@ def C.RString
),
embed: CType::Struct.new(
"", Primitive.cexpr!("SIZEOF(((struct RString *)NULL)->as.embed)"),
ary: [CType::Pointer.new { CType::Immediate.parse("char") }, Primitive.cexpr!("OFFSETOF(((struct RString *)NULL)->as.embed, ary)")],
ary: [CType::Array.new { CType::Immediate.parse("char") }, Primitive.cexpr!("OFFSETOF(((struct RString *)NULL)->as.embed, ary)")],
),
), Primitive.cexpr!("OFFSETOF((*((struct RString *)NULL)), as)")],
)
Expand All @@ -888,7 +888,7 @@ def C.RStruct
len: [CType::Immediate.parse("long"), Primitive.cexpr!("OFFSETOF(((struct RStruct *)NULL)->as.heap, len)")],
ptr: [CType::Pointer.new { self.VALUE }, Primitive.cexpr!("OFFSETOF(((struct RStruct *)NULL)->as.heap, ptr)")],
),
ary: CType::Pointer.new { self.VALUE },
ary: CType::Array.new { self.VALUE },
), Primitive.cexpr!("OFFSETOF((*((struct RStruct *)NULL)), as)")],
)
end
Expand Down
2 changes: 1 addition & 1 deletion tool/rjit/bindgen.rb
Expand Up @@ -296,7 +296,7 @@ def generate_node(node, sizeof_type: nil)
# @param type [String]
def generate_type(type)
if type.match?(/\[\d+\]\z/)
return "CType::Pointer.new { #{generate_type(type.sub!(/\[\d+\]\z/, ''))} }"
return "CType::Array.new { #{generate_type(type.sub!(/\[\d+\]\z/, ''))} }"
end
type = type.delete_suffix('const')
if type.end_with?('*')
Expand Down

0 comments on commit 19d082d

Please sign in to comment.