Skip to content

Commit c9b1136

Browse files
committed
[GR-18163] Pointer#read_pointer should return a pointer with #type_size 1
PullRequest: truffleruby/4528
2 parents daf3d0a + 780ec0c commit c9b1136

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Compatibility:
2020
* Joni has been updated from 2.2.1 to 2.2.6 (@andrykonchin).
2121
* Fix numeric coercing when `#coerce` method is not public (#3848, @andrykonchin).
2222
* Fix `Kernel#raise` and don't override `cause` at exception re-raising (#3831, @andrykonchin).
23+
* Return a pointer with `#type_size` of 1 for `Pointer#read_pointer` (@eregon).
2324

2425
Performance:
2526

spec/ffi/pointer_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ def to_ptr
8484
expect(memory.read_pointer.address).to eq(0xdeadbeef)
8585
end
8686

87+
it "#read_pointer returns a pointer with #type_size 1" do
88+
memory = FFI::MemoryPointer.new :pointer
89+
expect(memory.read_pointer.type_size).to eq(1)
90+
end
91+
92+
it "#get_pointer returns a pointer with #type_size 1" do
93+
memory = FFI::MemoryPointer.new :pointer
94+
expect(memory.get_pointer(0).type_size).to eq(1)
95+
end
96+
8797
it "#write_pointer" do
8898
memory = FFI::MemoryPointer.new :pointer
8999
memory.write_pointer(PointerTestLib.ptr_from_address(0xdeadbeef))
@@ -106,6 +116,7 @@ def to_ptr
106116
array = memory.read_array_of_pointer(values.size)
107117
values.each_with_index do |address, j|
108118
expect(array[j].address).to eq(address)
119+
expect(array[j].type_size).to eq(1)
109120
end
110121
end
111122

src/main/java/org/truffleruby/extra/ffi/PointerNodes.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.oracle.truffle.api.dsl.ImportStatic;
4848
import com.oracle.truffle.api.dsl.Specialization;
4949
import org.truffleruby.language.objects.AllocationTracing;
50+
import org.truffleruby.language.objects.WriteObjectFieldNode;
5051

5152
@CoreModule(value = "Truffle::FFI::Pointer", isClass = true)
5253
public abstract class PointerNodes {
@@ -503,7 +504,8 @@ public abstract static class PointerReadPointerNode extends PrimitiveArrayArgume
503504

504505
@Specialization
505506
RubyPointer readPointer(long address,
506-
@Cached CheckNullPointerNode checkNullPointerNode) {
507+
@Cached CheckNullPointerNode checkNullPointerNode,
508+
@Cached WriteObjectFieldNode writeTypeSize) {
507509
final Pointer ptr = new Pointer(getContext(), address);
508510
checkNullPointerNode.execute(this, ptr);
509511
final Pointer readPointer = ptr.readPointer(getContext(), 0);
@@ -512,6 +514,10 @@ RubyPointer readPointer(long address,
512514
getLanguage().truffleFFIPointerShape,
513515
readPointer);
514516
AllocationTracing.trace(instance, this);
517+
518+
// We don't call Truffle::FFI::Pointer#initialize so we manually set it instead
519+
writeTypeSize.execute(this, instance, "@type_size", 1);
520+
515521
return instance;
516522
}
517523

0 commit comments

Comments
 (0)