зеркало из https://github.com/github/ruby.git
Added intern_ids.rb
This commit is contained in:
Родитель
13f8521c63
Коммит
0754cc4888
26
defs/id.def
26
defs/id.def
|
@ -138,6 +138,21 @@ class KeywordError < RuntimeError
|
|||
end
|
||||
end
|
||||
|
||||
def id2varname(token, prefix = nil)
|
||||
if /#/ =~ token
|
||||
token = "_#{token.gsub(/\W+/, '_')}"
|
||||
else
|
||||
token = token.sub(/\?/, 'P')
|
||||
token = prefix + token if prefix
|
||||
token.sub!(/\A[a-z]/) {$&.upcase}
|
||||
token.sub!(/\A\$/, "_G_")
|
||||
token.sub!(/\A@@/, "_C_")
|
||||
token.sub!(/\A@/, "_I_")
|
||||
token.gsub!(/\W+/, "")
|
||||
end
|
||||
token
|
||||
end
|
||||
|
||||
predefined_ids = {}
|
||||
preserved_ids = []
|
||||
local_ids = []
|
||||
|
@ -153,16 +168,7 @@ predefined.split(/^/).each_with_index do |line, num|
|
|||
line.sub!(/\s+#.*/, '')
|
||||
name, token = line.split
|
||||
next unless name
|
||||
token ||= name
|
||||
if /#/ =~ token
|
||||
token = "_#{token.gsub(/\W+/, '_')}"
|
||||
else
|
||||
token = token.sub(/\?/, 'P').sub(/\A[a-z]/) {$&.upcase}
|
||||
token.sub!(/\A\$/, "_G_")
|
||||
token.sub!(/\A@@/, "_C_")
|
||||
token.sub!(/\A@/, "_I_")
|
||||
token.gsub!(/\W+/, "")
|
||||
end
|
||||
token = id2varname(token || name)
|
||||
if name == '-'
|
||||
preserved_ids << token
|
||||
next
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/ruby -sp
|
||||
# $ ruby -i tool/intern_ids.rb -prefix=_ foo.c
|
||||
|
||||
BEGIN {
|
||||
$prefix ||= nil
|
||||
|
||||
defs = File.join(File.dirname(__dir__), "defs/id.def")
|
||||
ids = eval(File.read(defs), binding, defs)
|
||||
table = {}
|
||||
ids[:predefined].each {|v, t| table[t] = "id#{v}"}
|
||||
ids[:token_op].each {|v, t, *| table[t] = "id#{v}"}
|
||||
predefined = table.keys
|
||||
}
|
||||
|
||||
$_.gsub!(/rb_intern\("([^\"]+)"\)/) do
|
||||
token = $1
|
||||
table[token] ||= "id" + id2varname(token, $prefix)
|
||||
end
|
||||
|
||||
END {
|
||||
predefined.each {|t| table.delete(t)}
|
||||
unless table.empty?
|
||||
table = table.sort_by {|t, v| v}
|
||||
|
||||
# Append at the last, then edit and move appropriately.
|
||||
puts
|
||||
puts "==== defs"
|
||||
table.each {|t, v| puts "static ID #{v};"}
|
||||
puts ">>>>"
|
||||
puts
|
||||
puts "==== init"
|
||||
table.each {|t, v|puts "#{v} = rb_intern_const(\"#{t}\");"}
|
||||
puts ">>>>"
|
||||
end
|
||||
}
|
Загрузка…
Ссылка в новой задаче