From a9396fd580a40ab02d50b65fe38c7d4c35ebe3cd Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 28 May 2008 08:50:41 +0000 Subject: [PATCH] * win32/mkexports.rb (Exports#objdump, Exports#each_line): extracted. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16669 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ win32/mkexports.rb | 60 +++++++++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 20bfe727f2..22e4818a61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Wed May 28 17:50:32 2008 Nobuyoshi Nakada + + * win32/mkexports.rb (Exports#objdump, Exports#each_line): extracted. + Wed May 28 17:41:43 2008 Nobuyoshi Nakada * Makefile.in (MKPREP): appended $(RBCONFIG). diff --git a/win32/mkexports.rb b/win32/mkexports.rb index e000fcf260..2ed251ec1c 100755 --- a/win32/mkexports.rb +++ b/win32/mkexports.rb @@ -27,7 +27,7 @@ class Exports def self.output(output = $output, &block) if output - open(output, 'w', &block) + open(output, 'wb', &block) else yield STDOUT end @@ -74,38 +74,50 @@ class Exports def each_export(objs) end + def objdump(objs, &block) + if objs.empty? + $stdin.each_line(&block) + else + each_line(objs, &block) + end + end + def symbols() @syms.sort.collect {|k, v| v ? v == true ? "#{k} DATA" : "#{k}=#{v}" : k} end end class Exports::Mswin < Exports + def each_line(objs, &block) + IO.popen(%w"dumpbin -symbols -exports" + objs) do |f| + f.each(&block) + end + end + def each_export(objs) noprefix = ($arch ||= nil and /^(sh|i\d86)/ !~ $arch) objs = objs.collect {|s| s.tr('/', '\\')} filetype = nil - IO.popen(%w"dumpbin -symbols -exports" + objs) do |f| - f.each do |l| - if (filetype = l[/^File Type: (.+)/, 1])..(/^\f/ =~ l) - case filetype - when /OBJECT/, /LIBRARY/ - next if /^[[:xdigit:]]+ 0+ UNDEF / =~ l - next unless /External/ =~ l - next unless l.sub!(/.*?\s(\(\)\s+)?External\s+\|\s+/, '') - is_data = !$1 - if noprefix or /^[@_]/ =~ l - next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{16}$/ =~ l - l.sub!(/^[@_]/, '') if /@\d+$/ !~ l - elsif !l.sub!(/^(\S+) \([^@?\`\']*\)$/, '\1') - next - end - when /DLL/ - next unless l.sub!(/^\s*\d+\s+[[:xdigit:]]+\s+[[:xdigit:]]+\s+/, '') - else + objdump(objs) do |l| + if (filetype = l[/^File Type: (.+)/, 1])..(/^\f/ =~ l) + case filetype + when /OBJECT/, /LIBRARY/ + next if /^[[:xdigit:]]+ 0+ UNDEF / =~ l + next unless /External/ =~ l + next unless l.sub!(/.*?\s(\(\)\s+)?External\s+\|\s+/, '') + is_data = !$1 + if noprefix or /^[@_]/ =~ l + next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{16}$/ =~ l + l.sub!(/^[@_]/, '') if /@\d+$/ !~ l + elsif !l.sub!(/^(\S+) \([^@?\`\']*\)$/, '\1') next end - yield l.strip, is_data + when /DLL/ + next unless l.sub!(/^\s*\d+\s+[[:xdigit:]]+\s+[[:xdigit:]]+\s+/, '') + else + next end + yield l.strip, is_data end end yield "strcasecmp", "msvcrt.stricmp" @@ -118,9 +130,13 @@ class Exports::Mingw < Exports @@nm ||= RbConfig::CONFIG["NM"] end + def each_line(objs, &block) + IO.foreach("|#{self.class.nm} --extern --defined #{objs.join(' ')}", &block) + end + def each_export(objs) - IO.popen([self.class.nm, "--extern", "--defined", *objs]) do |f| - f.each {|l| yield $1 if / [[:upper:]] _(.*)$/ =~ l} + objdump(objs) do |l| + yield $1 if / [[:upper:]] _(.*)$/ =~ l end yield "strcasecmp", "_stricmp" yield "strncasecmp", "_strnicmp"