File tree Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Original file line number Diff line number Diff line change
1
+ # This script checks the max number of call frames under WebAssembly restriction
2
+ #
3
+ # Example runs
4
+ # $ ruby vm_deep_call.rb
5
+ # $ RUBY_EXE="wasmtime run --mapdir /::/ head-wasm32-unknown-wasi-minimal/usr/local/bin/ruby --" ruby vm_deep_call.rb
6
+ # $ RUBY_EXE="wasmtime run --env RUBY_FIBER_MACHINE_STACK_SIZE=20971520 --mapdir /::/ head-wasm32-unknown-wasi-minimal/usr/local/bin/ruby --" ruby vm_deep_call.rb
7
+
8
+ def vm_rec n
9
+ vm_rec n - 1 if n > 0
10
+ end
11
+
12
+ def vm_c_rec n
13
+ 1 . times do
14
+ vm_c_rec n - 1 if n > 0
15
+ end
16
+ end
17
+
18
+ def vm_rec_fiber n
19
+ Fiber . new { vm_rec n } . resume
20
+ end
21
+
22
+ def vm_c_rec_fiber n
23
+ Fiber . new { vm_c_rec n } . resume
24
+ end
25
+
26
+ def check ( ruby_exe , target , n )
27
+ cmd = %Q(#{ ruby_exe } -r #{ File . expand_path ( __FILE__ ) } -e "#{ target } (#{ n } )")
28
+ Kernel . system ( cmd , err : File ::NULL )
29
+ end
30
+
31
+ def bisect ( ruby_exe , target )
32
+ min = 0
33
+ max = 15000
34
+ while min < max
35
+ mid = ( min + max ) / 2
36
+ ok = check ( ruby_exe , target , mid )
37
+ if ok
38
+ min = mid + 1
39
+ else
40
+ max = mid
41
+ end
42
+ end
43
+ min
44
+ end
45
+
46
+ def main
47
+ ruby_exe = ENV [ 'RUBY_EXE' ] || 'ruby'
48
+ puts "How deep the call stack can be"
49
+ puts " with only VM calls: " + bisect ( ruby_exe , "vm_rec" ) . to_s
50
+ puts " with only VM calls in Fiber: " + bisect ( ruby_exe , "vm_rec_fiber" ) . to_s
51
+ puts " with VM and C calls: " + bisect ( ruby_exe , "vm_c_rec" ) . to_s
52
+ puts " with VM and C calls in Fiber: " + bisect ( ruby_exe , "vm_c_rec_fiber" ) . to_s
53
+ end
54
+
55
+ main if $0 == __FILE__
You can’t perform that action at this time.
0 commit comments