Skip to content

Commit fd91ab7

Browse files
chrisseatonLillian Zhang
authored andcommitted
Move recursion utilities into Truffle::ThreadOperations
1 parent 53b2eec commit fd91ab7

File tree

16 files changed

+205
-163
lines changed

16 files changed

+205
-163
lines changed

lib/truffle/truffle/cext.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1508,7 +1508,7 @@ def rb_rescue2(b_proc, data1, r_proc, data2, rescued)
15081508
def rb_exec_recursive(func, obj, arg)
15091509
result = nil
15101510

1511-
recursive = Thread.detect_recursion(obj) do
1511+
recursive = Truffle::ThreadOperations.detect_recursion(obj) do
15121512
result = Primitive.cext_unwrap(Primitive.call_with_c_mutex(func, [Primitive.cext_wrap(obj), Primitive.cext_wrap(arg), 0]))
15131513
end
15141514

spec/truffle/thread/detect_recursion_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module TruffleThreadDetectRecursionSpecFixtures
1212
def self.check_recursion_to_depth(obj, depth)
1313
# checks that obj recurses to a given depth
1414
return false unless obj.respond_to?(:each)
15-
Thread.detect_recursion(obj) do
15+
Truffle::ThreadOperations.detect_recursion(obj) do
1616
if depth > 1
1717
obj.each do |el|
1818
if check_recursion_to_depth(el, depth-1)
@@ -31,7 +31,7 @@ def self.check_double_recursion_equality_to_depth(obj1, obj2, depth)
3131
return false unless obj1.respond_to?(:each)
3232
return false unless obj1.size == obj2.size
3333

34-
Thread.detect_recursion(obj1, obj2) do
34+
Truffle::ThreadOperations.detect_recursion(obj1, obj2) do
3535
if depth > 1
3636
if obj1.class == Hash
3737
obj1.each do |key, val|

src/main/java/org/truffleruby/core/CoreLibrary.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,7 @@ public boolean isTruffleBootMainMethod(SharedMethodInfo info) {
10641064
"/core/truffle/exception_operations.rb",
10651065
"/core/truffle/feature_loader.rb",
10661066
"/core/truffle/gem_util.rb",
1067+
"/core/truffle/thread_operations.rb",
10671068
"/core/thread.rb",
10681069
"/core/true.rb",
10691070
"/core/type.rb",

src/main/ruby/truffleruby/core/array.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def <=>(other)
8989

9090
total = other.size
9191

92-
Thread.detect_recursion self, other do
92+
Truffle::ThreadOperations.detect_recursion self, other do
9393
i = 0
9494
count = Primitive.min(total, size)
9595

@@ -132,7 +132,7 @@ def ==(other)
132132

133133
return false unless size == other.size
134134

135-
Thread.detect_recursion self, other do
135+
Truffle::ThreadOperations.detect_recursion self, other do
136136
i = 0
137137
total = size
138138

@@ -325,7 +325,7 @@ def eql?(other)
325325
return false unless other.kind_of?(Array)
326326
return false if size != other.size
327327

328-
Thread.detect_recursion self, other do
328+
Truffle::ThreadOperations.detect_recursion self, other do
329329
i = 0
330330
each do |x|
331331
return false unless x.eql? other[i]
@@ -484,7 +484,7 @@ def hash
484484

485485
# If we've seen self, unwind back to the outer version
486486
if objects.key? id
487-
raise Thread::InnerRecursionDetected
487+
raise Truffle::ThreadOperations::InnerRecursionDetected
488488
end
489489

490490
# .. or compute the hash value like normal
@@ -508,13 +508,13 @@ def hash
508508
# An inner version will raise to return back here, indicating that
509509
# the whole structure is recursive. In which case, abandon most of
510510
# the work and return a simple hash value.
511-
rescue Thread::InnerRecursionDetected
512-
return size
511+
rescue Truffle::ThreadOperations::InnerRecursionDetected
512+
return size
513513
ensure
514514
objects.delete :__detect_outermost_recursion__
515515
objects.delete id
516-
end
517516
end
517+
end
518518

519519
hash_val
520520
end
@@ -549,7 +549,7 @@ def inspect
549549
comma = ', '
550550
result = +'['
551551

552-
return +'[...]' if Thread.detect_recursion self do
552+
return +'[...]' if Truffle::ThreadOperations.detect_recursion self do
553553
each_with_index do |element, index|
554554
temp = Truffle::Type.rb_inspect(element)
555555
result.force_encoding(temp.encoding) if index == 0
@@ -568,7 +568,7 @@ def join(sep=nil)
568568
return ''.encode(Encoding::US_ASCII) if size == 0
569569

570570
out = +''
571-
raise ArgumentError, 'recursive array join' if Thread.detect_recursion self do
571+
raise ArgumentError, 'recursive array join' if Truffle::ThreadOperations.detect_recursion self do
572572
sep = Primitive.nil?(sep) ? $, : StringValue(sep)
573573

574574
# We've manually unwound the first loop entry for performance
@@ -1263,7 +1263,7 @@ def recursively_flatten(array, out, max_levels = -1)
12631263
end
12641264

12651265
max_levels -= 1
1266-
recursion = Thread.detect_recursion(array) do
1266+
recursion = Truffle::ThreadOperations.detect_recursion(array) do
12671267
array = Truffle::Type.coerce_to(array, Array, :to_ary)
12681268

12691269
i = 0

src/main/ruby/truffleruby/core/comparable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ module Comparable
3030
def ==(other)
3131
return true if equal?(other)
3232

33-
return false if Thread.detect_recursion(self, other) do
33+
return false if Truffle::ThreadOperations.detect_recursion(self, other) do
3434
unless comp = (self <=> other)
3535
return false
3636
end

src/main/ruby/truffleruby/core/enumerator.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ def rewind
704704
end
705705

706706
def inspect
707-
return "#<#{self.class.name}: ...>" if Thread.detect_recursion(self) do
707+
return "#<#{self.class.name}: ...>" if Truffle::ThreadOperations.detect_recursion(self) do
708708
return "#<#{self.class.name}: #{@enums}>"
709709
end
710710
end

src/main/ruby/truffleruby/core/file.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ def self.join(*args)
733733
when String
734734
first = first.dup
735735
when Array
736-
recursion = Thread.detect_recursion(first) do
736+
recursion = Truffle::ThreadOperations.detect_recursion(first) do
737737
first = join(*first)
738738
end
739739

@@ -754,7 +754,7 @@ def self.join(*args)
754754
when String
755755
value = el
756756
when Array
757-
recursion = Thread.detect_recursion(el) do
757+
recursion = Truffle::ThreadOperations.detect_recursion(el) do
758758
value = join(*el)
759759
end
760760

src/main/ruby/truffleruby/core/hash.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def eql_op(op, other)
137137

138138
return false unless other.size == size
139139

140-
Thread.detect_recursion self, other do
140+
Truffle::ThreadOperations.detect_recursion self, other do
141141
each_pair do |key, value|
142142
other_value = other._get_or_undefined(key)
143143

@@ -361,7 +361,7 @@ def to_h
361361
def hash
362362
val = Primitive.vm_hash_start CLASS_SALT
363363
val = Primitive.vm_hash_update val, size
364-
Thread.detect_outermost_recursion self do
364+
Truffle::ThreadOperations.detect_outermost_recursion self do
365365
each_pair do |key,value|
366366
entry_val = Primitive.vm_hash_start key.hash
367367
entry_val = Primitive.vm_hash_update entry_val, value.hash
@@ -406,7 +406,7 @@ def index(value)
406406

407407
def inspect
408408
out = []
409-
return +'{...}' if Thread.detect_recursion self do
409+
return +'{...}' if Truffle::ThreadOperations.detect_recursion self do
410410
each_pair do |key,value|
411411
str = Truffle::Type.rb_inspect(key)
412412
str << '=>'

src/main/ruby/truffleruby/core/kernel.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,18 +380,17 @@ def inspect
380380
return Primitive.infect "#{prefix}>", self
381381
end
382382

383-
# If it's already been inspected, return the ...
384-
return "#{prefix} ...>" if Thread.guarding? self
385-
386-
parts = Thread.recursion_guard self do
387-
ivars.map do |var|
383+
Truffle::ThreadOperations.detect_recursion(self) do
384+
parts = ivars.map do |var|
388385
value = Primitive.object_ivar_get self, var
389386
"#{var}=#{value.inspect}"
390387
end
388+
str = "#{prefix} #{parts.join(', ')}>"
389+
return Primitive.infect str, self
391390
end
392391

393-
str = "#{prefix} #{parts.join(', ')}>"
394-
Primitive.infect str, self
392+
# If it's already been inspected, return the ...
393+
"#{prefix} ...>"
395394
end
396395

397396
def load(filename, wrap = false)

src/main/ruby/truffleruby/core/string.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1585,7 +1585,7 @@ def <=>(other)
15851585
return Primitive.string_cmp self, other
15861586
end
15871587

1588-
Thread.detect_recursion self, other do
1588+
Truffle::ThreadOperations.detect_recursion self, other do
15891589
if other.respond_to?(:<=>) && !other.respond_to?(:to_str)
15901590
return nil unless tmp = (other <=> self)
15911591
elsif other.respond_to?(:to_str)

0 commit comments

Comments
 (0)