mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Added intern_ids.rb
This commit is contained in:
		
							parent
							
								
									13f8521c63
								
							
						
					
					
						commit
						0754cc4888
					
				
				
				Notes:
				
					git
				
				2021-07-27 15:40:54 +09:00 
				
			
			
			
		
		
					 2 changed files with 51 additions and 10 deletions
				
			
		
							
								
								
									
										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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										35
									
								
								tool/intern_ids.rb
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								tool/intern_ids.rb
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue