* 2022-01-18 [ci skip]
[ruby-80x24.org.git] / tool / gen_ruby_tapset.rb
blobae3c1eccd28fb2f5f28308d82e05b00a26581fc8
1 #!/usr/bin/ruby
2 # -*- coding: us-ascii -*-
3 # Create a tapset for systemtap and DTrace
4 # usage: ./ruby gen_ruby_tapset.rb --ruby-path=/path/to/ruby probes.d > output
6 require "optparse"
8 def set_argument(argname, nth)
9   # remove C style type info
10   argname.gsub!(/.+ (.+)/, '\1') # e.g. char *hoge -> *hoge
11   argname.gsub!(/^\*/, '')       # e.g. *filename -> filename
13   "#{argname} = $arg#{nth}"
14 end
16 ruby_path = "/usr/local/ruby"
18 opts = OptionParser.new
19 opts.on("--ruby-path=PATH"){|v| ruby_path = v}
20 opts.parse!(ARGV)
22 text = ARGF.read
24 # remove preprocessor directives
25 text.gsub!(/^#.*$/, '')
27 # remove provider name
28 text.gsub!(/^provider ruby \{/, "")
29 text.gsub!(/^\};/, "")
31 # probename()
32 text.gsub!(/probe (.+)\( *\);/) {
33   probe_name = $1
34   <<-End
35     probe #{probe_name} = process("ruby").provider("ruby").mark("#{probe_name}")
36     {
37     }
38   End
41 # probename(arg1)
42 text.gsub!(/ *probe (.+)\(([^,)]+)\);/) {
43   probe_name = $1
44   arg1 = $2
46   <<-End
47     probe #{probe_name} = process("ruby").provider("ruby").mark("#{probe_name}")
48     {
49       #{set_argument(arg1, 1)}
50     }
51   End
54 # probename(arg1, arg2)
55 text.gsub!(/ *probe (.+)\(([^,)]+),([^,)]+)\);/) {
56   probe_name = $1
57   arg1 = $2
58   arg2 = $3
60   <<-End
61     probe #{probe_name} = process("#{ruby_path}").provider("ruby").mark("#{probe_name}")
62     {
63       #{set_argument(arg1, 1)}
64       #{set_argument(arg2, 2)}
65     }
66   End
69 # probename(arg1, arg2, arg3)
70 text.gsub!(/ *probe (.+)\(([^,)]+),([^,)]+),([^,)]+)\);/) {
71   probe_name = $1
72   arg1 = $2
73   arg2 = $3
74   arg3 = $4
76   <<-End
77     probe #{probe_name} = process("#{ruby_path}").provider("ruby").mark("#{probe_name}")
78     {
79       #{set_argument(arg1, 1)}
80       #{set_argument(arg2, 2)}
81       #{set_argument(arg3, 3)}
82     }
83   End
86 # probename(arg1, arg2, arg3, arg4)
87 text.gsub!(/ *probe (.+)\(([^,)]+),([^,)]+),([^,)]+),([^,)]+)\);/) {
88   probe_name = $1
89   arg1 = $2
90   arg2 = $3
91   arg3 = $4
92   arg4 = $5
94   <<-End
95     probe #{probe_name} = process("#{ruby_path}").provider("ruby").mark("#{probe_name}")
96     {
97       #{set_argument(arg1, 1)}
98       #{set_argument(arg2, 2)}
99       #{set_argument(arg3, 3)}
100       #{set_argument(arg4, 4)}
101     }
102   End
105 print text