From d22ac50ad493256c707b7b39eadf3ac46d989224 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 29 Nov 2012 08:12:29 +0000 Subject: tool/vpath.rb * tool/generic_erb.rb, tool/id2token.rb: add --path-separator option for mingw where make and built ruby live in different world. * tool/vpath.rb: extract from tool/instruction.rb. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37985 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- tool/generic_erb.rb | 18 ++++-------- tool/id2token.rb | 23 ++++++---------- tool/instruction.rb | 70 +++++------------------------------------------ tool/vpath.rb | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 90 deletions(-) create mode 100644 tool/vpath.rb (limited to 'tool') diff --git a/tool/generic_erb.rb b/tool/generic_erb.rb index b2b988fb3a..344fad46f7 100644 --- a/tool/generic_erb.rb +++ b/tool/generic_erb.rb @@ -1,19 +1,11 @@ +# -*- coding: us-ascii -*- require 'erb' require 'optparse' require 'fileutils' +$:.unshift(File.dirname(__FILE__)) +require 'vpath' -vpath = ["."] -def vpath.open(file, *rest) - find do |dir| - begin - path = File.join(dir, file) - return File.open(path, *rest) {|f| yield(f)} - rescue Errno::ENOENT - nil - end - end or raise(Errno::ENOENT, file) -end - +vpath = VPath.new timestamp = nil output = nil ifchange = nil @@ -22,7 +14,7 @@ opt = OptionParser.new do |o| o.on('-t', '--timestamp[=PATH]') {|v| timestamp = v || true} o.on('-o', '--output=PATH') {|v| output = v} o.on('-c', '--[no-]if-change') {|v| ifchange = v} - o.on('-v', '--vpath=DIR') {|dirs| vpath.concat dirs.split(File::PATH_SEPARATOR)} + vpath.def_options(o) o.order!(ARGV) end template = ARGV.shift or abort opt.to_s diff --git a/tool/id2token.rb b/tool/id2token.rb index 4c7189c094..191b872c5f 100755 --- a/tool/id2token.rb +++ b/tool/id2token.rb @@ -1,27 +1,22 @@ #! /usr/bin/ruby -p +# -*- coding: us-ascii -*- BEGIN { require 'optparse' - vpath = ["."] + $:.unshift(File.dirname(__FILE__)) + require 'vpath' + vpath = VPath.new header = nil opt = OptionParser.new do |o| - o.on('-v', '--vpath=DIR') {|dirs| vpath.concat dirs.split(File::PATH_SEPARATOR)} + vpath.def_options(o) header = o.order!(ARGV).shift end or abort opt.opt_s TOKENS = {} - vpath.find do |dir| - begin - h = File.read(File.join(dir, header)) - rescue Errno::ENOENT - nil - else - h.scan(/^#define\s+RUBY_TOKEN_(\w+)\s+(\d+)/) do |token, id| - TOKENS[token] = id - end - true - end - end or abort "#{header} not found in #{vpath.inspect}" + h = vpath.read(header) rescue abort("#{header} not found in #{vpath.inspect}") + h.scan(/^#define\s+RUBY_TOKEN_(\w+)\s+(\d+)/) do |token, id| + TOKENS[token] = id + end TOKENS_RE = /\bRUBY_TOKEN\((#{TOKENS.keys.join('|')})\)\s*(?=\s)/ } diff --git a/tool/instruction.rb b/tool/instruction.rb index fb07d778bc..4e7a83560a 100755 --- a/tool/instruction.rb +++ b/tool/instruction.rb @@ -1,8 +1,11 @@ #!./miniruby +# -*- coding: us-ascii -*- # # require 'erb' +$:.unshift(File.dirname(__FILE__)) +require 'vpath' class RubyVM class Instruction @@ -1256,66 +1259,6 @@ class RubyVM end end - module VPATH - def search(meth, base, *rest) - begin - meth.call(base, *rest) - rescue Errno::ENOENT => error - each do |dir| - return meth.call(File.join(dir, base), *rest) rescue nil - end - raise error - end - end - - def process(*args, &block) - search(File.method(__callee__), *args, &block) - end - - alias stat process - alias lstat process - - def open(*args) - f = search(File.method(:open), *args) - if block_given? - begin - yield f - ensure - f.close unless f.closed? - end - else - f - end - end - - def read(*args) - open(*args) {|f| f.read} - end - - def foreach(file, *args, &block) - open(file) {|f| f.each(*args, &block)} - end - - def self.def_options(opt) - vpath = [] - path_sep = ':' - - opt.on("-I", "--srcdir=DIR", "add a directory to search path") {|dir| - vpath |= [dir] - } - opt.on("-L", "--vpath=PATH LIST", "add directories to search path") {|dirs| - vpath |= dirs.split(path_sep) - } - opt.on("--path-separator=SEP", /\A\W\z/, "separator for vpath") {|sep| - path_sep = sep - } - - proc { - vpath.extend(self) unless vpath.empty? - } - end - end - class SourceCodeGenerator Files = { # codes 'vm.inc' => VmBodyGenerator, @@ -1382,16 +1325,17 @@ class RubyVM opts[:verbose] = v } - vpath = VPATH.def_options(opt) + vpath = VPath.new + vpath.def_options(opt) proc { - opts[:VPATH] = vpath.call + opts[:VPATH] = vpath build opts } end def self.build opts, vpath = ['./'] - opts[:VPATH] = vpath.extend(VPATH) unless opts[:VPATH] + opts[:VPATH] ||= VPath.new(*vpath) self.new InstructionsLoader.new(opts) end end diff --git a/tool/vpath.rb b/tool/vpath.rb new file mode 100644 index 0000000000..5241d2d544 --- /dev/null +++ b/tool/vpath.rb @@ -0,0 +1,79 @@ +# -*- coding: us-ascii -*- + +class VPath + attr_accessor :separator + + def initialize(*list) + @list = list + @additional = [] + @separator = File::PATH_SEPARATOR + end + + def inspect + list.inspect + end + + def search(meth, base, *rest) + begin + meth.call(base, *rest) + rescue Errno::ENOENT => error + list.each do |dir| + return meth.call(File.join(dir, base), *rest) rescue nil + end + raise error + end + end + + def process(*args, &block) + search(File.method(__callee__), *args, &block) + end + + alias stat process + alias lstat process + + def open(*args) + f = search(File.method(:open), *args) + if block_given? + begin + yield f + ensure + f.close unless f.closed? + end + else + f + end + end + + def read(*args) + open(*args) {|f| f.read} + end + + def foreach(file, *args, &block) + open(file) {|f| f.each(*args, &block)} + end + + def def_options(opt) + opt.on("-I", "--srcdir=DIR", "add a directory to search path") {|dir| + @additional << dir + } + opt.on("-L", "--vpath=PATH LIST", "add directories to search path") {|dirs| + @additional << [dirs] + } + opt.on("--path-separator=SEP", /\A\W\z/, "separator for vpath") {|sep| + @separator = sep + } + end + + def list + @additional.reject! do |dirs| + case dirs + when String + @list << dirs + when Array + @list.concat(dirs[0].split(@separator)) + end + true + end + @list + end +end -- cgit v1.2.3