Skip to content

Commit d83ebfb

Browse files
committed
Do not convert the elements to Ruby Strings for Truffle::Interop.members
* Let them be as foreign strings.
1 parent 13f893d commit d83ebfb

File tree

6 files changed

+37
-22
lines changed

6 files changed

+37
-22
lines changed

doc/contributor/interop.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,6 @@ using `Truffle::Interop.unbox_without_conversion`.
130130

131131
Import also converts `byte/short/float`, and has a `import_without_conversion` counterpart.
132132

133-
`Truffle::Interop.members` converts Java string member names to Ruby strings, so it
134-
also has a `Truffle::Interop.members_without_conversion` equivalent.
135-
TODO remove?
136-
137133
## Import and export
138134

139135
`Truffle::Interop.export(:name, value)`

spec/truffle/interop/members_spec.rb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,19 @@
1616
keys.should be_an_instance_of(Array)
1717
end
1818

19-
it "returns an array of Ruby strings by default" do
20-
keys = Truffle::Interop.members({'a' => 1, 'b' => 2, 'c' => 3})
21-
keys[0].should be_an_instance_of(String)
22-
end
19+
it "returns an array of interop strings" do
20+
keys = Truffle::Interop.members(Object.new)
21+
keys.each do |key|
22+
Truffle::Interop.should.string? key
23+
String.should === key # actually Ruby Strings
24+
end
2325

24-
it "returns an array of Java strings if you don't use conversion" do
25-
keys = Truffle::Interop.members_without_conversion({'a' => 1, 'b' => 2, 'c' => 3})
26-
key = keys[0]
27-
Truffle::Interop.java_string?(key).should be_true
26+
members = Truffle::Interop.members(Truffle::Debug.foreign_object_with_members)
27+
members.should == ["a", "b", "c", "method1", "method2"]
28+
members.each do |key|
29+
Truffle::Interop.should.string? key
30+
Truffle::Interop.should.java_string? key # actually Java Strings
31+
end
2832
end
2933

3034
it "returns an array of public methods for an array" do

spec/truffle/interop/polyglot/foreign_array_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@
1414
@empty = Truffle::Interop.to_java_array([])
1515
end
1616

17+
it "compares #== if elements are #==" do
18+
foreign = Truffle::Interop.to_java_array([
19+
Truffle::Debug.foreign_string("one"),
20+
Truffle::Interop.as_string("two"),
21+
Truffle::Interop.as_truffle_string("three")])
22+
ruby = ["one", "two", "three"]
23+
24+
foreign.should == ruby
25+
ruby.should == foreign
26+
end
27+
1728
it "supports #length and #size" do
1829
@foreign.size.should == 3
1930
@foreign.length.should == 3

src/main/java/org/truffleruby/interop/InteropNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1230,7 +1230,7 @@ protected boolean hasMembers(Object receiver,
12301230
}
12311231
}
12321232

1233-
@CoreMethod(names = "members_without_conversion", onSingleton = true, required = 1, optional = 1)
1233+
@CoreMethod(names = "members", onSingleton = true, required = 1, optional = 1)
12341234
public abstract static class GetMembersNode extends PrimitiveArrayArgumentsNode {
12351235

12361236
protected abstract Object executeMembers(Object receiver, boolean internal);

src/main/ruby/truffleruby/core/truffle/interop.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,6 @@ def self.import(name)
9797
Primitive.foreign_to_ruby(import_without_conversion(name))
9898
end
9999

100-
def self.members(object, internal = false)
101-
members_without_conversion(object, internal).map { |key| from_java_string(key) }
102-
end
103-
104100
def self.get_members_implementation(object, internal)
105101
keys = []
106102

@@ -125,7 +121,7 @@ def self.get_members_implementation(object, internal)
125121
end
126122
end
127123

128-
keys.map { |s| Truffle::Interop.to_java_string(s) }
124+
keys
129125
end
130126
private_class_method :get_members_implementation
131127

src/main/ruby/truffleruby/core/truffle/polyglot.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,14 @@ def to_ary
246246
end
247247
alias_method :to_a, :to_ary
248248

249+
def ==(other)
250+
to_ary == other
251+
end
252+
253+
def index(...)
254+
to_a.index(...)
255+
end
256+
249257
def reverse
250258
to_a.reverse
251259
end
@@ -483,19 +491,19 @@ def instance_variable_set(member, value)
483491

484492
def instance_variables
485493
return [] unless Truffle::Interop.has_members?(self)
486-
Truffle::Interop.members_without_conversion(self).filter_map do |member|
494+
Truffle::Interop.members(self).filter_map do |member|
487495
# Ruby does not have the concept of non-readable members, ignore those
488496
if Truffle::Interop.member_readable?(self, member) &&
489497
!Truffle::Interop.member_invocable?(self, member)
490-
member.to_s.to_sym
498+
member.to_sym
491499
end
492500
end
493501
end
494502

495503
def methods(regular = true)
496504
if regular
497-
super() | Truffle::Interop.members_without_conversion(self).filter_map do |member|
498-
member.to_s.to_sym if Truffle::Interop.member_invocable?(self, member)
505+
super() | Truffle::Interop.members(self).filter_map do |member|
506+
member.to_sym if Truffle::Interop.member_invocable?(self, member)
499507
end
500508
else
501509
super(regular)

0 commit comments

Comments
 (0)