aboutsummaryrefslogtreecommitdiffstats
path: root/tool/transform_mjit_header.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-05 00:52:20 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-05 00:52:20 +0000
commit85126a54c3ce9b80cba47f61a0f71a5f9f87126a (patch)
treee78a3f8920824e763b762f5f5564ef3d0807eec1 /tool/transform_mjit_header.rb
parentca9b583901b1bf53a69e435014a729c194478db2 (diff)
downloadruby-85126a54c3ce9b80cba47f61a0f71a5f9f87126a.tar.gz
transform_mjit_header.rb: scan by regexp
* tool/transform_mjit_header.rb (find_decl): scan by regexp instead of char-by-char loop. return nil when finished. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62213 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool/transform_mjit_header.rb')
-rw-r--r--tool/transform_mjit_header.rb27
1 files changed, 14 insertions, 13 deletions
diff --git a/tool/transform_mjit_header.rb b/tool/transform_mjit_header.rb
index 0de7e0af81..7ce139f92a 100644
--- a/tool/transform_mjit_header.rb
+++ b/tool/transform_mjit_header.rb
@@ -24,24 +24,28 @@ module MJITHeader
# Return start..stop of last decl in CODE ending STOP
def self.find_decl(code, stop)
level = 0
- stop.downto(0) do |i|
- if level == 0 && stop != i && decl_found?(code, i)
- return decl_start(code, i)..stop
- elsif code[i] == '}'
+ i = stop
+ while i = code.rindex(/[;{}]/, i)
+ if level == 0 && stop != i && decl_found?($&, i)
+ return decl_start($&, i)..stop
+ end
+ case $&
+ when '}'
level += 1
- elsif code[i] == '{'
+ when '{'
level -= 1
end
+ i -= 1
end
- 0..-1
+ nil
end
def self.decl_found?(code, i)
- i == 0 || code[i] == ';' || code[i] == '}'
+ i == 0 || code == ';' || code == '}'
end
def self.decl_start(code, i)
- if i == 0 && code[i] != ';' && code[i] != '}'
+ if i == 0 && code != ';' && code != '}'
0
else
i + 1
@@ -139,14 +143,11 @@ end
puts "\nTransforming external functions to static:"
code = MJITHeader.separate_macro_and_code(code) # note: this does not work on MinGW
-stop_pos = code.match(/^#/).begin(0) # See `separate_macro_and_code`. This ignores proprocessors.
+stop_pos = -1
extern_names = []
# This loop changes function declarations to static inline.
-loop do
- decl_range = MJITHeader.find_decl(code, stop_pos)
- break if decl_range.end < 0
-
+while (decl_range = MJITHeader.find_decl(code, stop_pos))
stop_pos = decl_range.begin - 1
decl = code[decl_range]
decl_name = MJITHeader.decl_name_of(decl)