1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/tool/ruby_vm/helpers/dumper.rb
k0kubun be27efdb83 dumper.rb: stop getting --destdir option value
via current directory. It's kind of a global state and fragile to
implementation changes in other places, and how the `Dir.getwd` is set
is not obvious from just reading around `RubyVM::Dumper#initialize` if
it depends on the global state.

tool/ruby_vm/controllers/application_controller.rb: explicitly pass
destdir to RubyVM::Dumper.

tool/ruby_vm/scripts/insns2vm.rb: explicitly pass destdir parsed from
optparse.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62064 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-01-27 01:59:08 +00:00

108 lines
2.5 KiB
Ruby

#! /your/favourite/path/to/ruby
# -*- mode: ruby; coding: utf-8; indent-tabs-mode: nil; ruby-indent-level: 2 -*-
# -*- frozen_string_literal: true; -*-
# -*- warn_indent: true; -*-
#
# Copyright (c) 2017 Urabe, Shyouhei. All rights reserved.
#
# This file is a part of the programming language Ruby. Permission is hereby
# granted, to either redistribute and/or modify this file, provided that the
# conditions mentioned in the file COPYING are met. Consult the file for
# details.
require 'pathname'
require 'erb'
require_relative 'c_escape'
class RubyVM::Dumper
include RubyVM::CEscape
private
def new_binding
# This `eval 'binding'` does not return the current binding
# but creates one on top of it.
return eval 'binding'
end
def new_erb spec
path = Pathname.new(__FILE__).realpath.dirname
path += '../views'
path += spec
src = path.read mode: 'rt:utf-8:utf-8'
rescue Errno::ENOENT
raise "don't know how to generate #{path}"
else
erb = ERB.new src, nil, '%-'
erb.filename = path.realpath.to_path
return erb
end
def finderb spec
return @erb.fetch spec do |k|
erb = new_erb k
@erb[k] = erb
end
end
def replace_pragma_line str, lineno
if str == "#pragma RubyVM reset source\n" then
return "#line #{lineno + 2} #{@file}\n"
else
return str
end
end
def local_variable_set bnd, var, val
eval '__locals__ ||= {}', bnd
locals = eval '__locals__', bnd
locals[var] = val
eval "#{var} = __locals__[:#{var}]", bnd
test = eval "#{var}", bnd
raise unless test == val
end
public
def do_render source, locals
erb = finderb source
bnd = @empty.dup
locals.each_pair do |k, v|
local_variable_set bnd, k, v
end
return erb.result bnd
end
def replace_pragma str
return str \
. each_line \
. with_index \
. map {|i, j| replace_pragma_line i, j } \
. join
end
def initialize dst
@erb = {}
@empty = new_binding
@file = cstr dst.realdirpath.to_path
end
def render partial, opts = { :locals => {} }
return do_render "_#{partial}.erb", opts[:locals]
end
def generate template
str = do_render "#{template}.erb", {}
return replace_pragma str
end
private
# view helpers
alias cstr rstring2cstr
alias comm commentify
def render_c_expr expr
render 'c_expr', locals: { expr: expr, }
end
end