Slide 162
Slide 162 text
content = File.read(source_path)
require 'parser/current'
# class CustomBuilder < Parser::Builders::Default
builder = CustomBuilder.new
# class CustomParser < Parser::CurrentRuby
parser = CustomParser.new(builder)
# class CustomRewriter < Parser::Rewriter
rewriter = CustomRewriter.new
rewriter.instance_variable_set(:@parser, parser)
buffer = Parser::Base.send(:setup_source_buffer, '(string)', 1,
content, parser.default_encoding)
ast = parser.parse(content)
content = rewriter.rewrite(buffer, ast)
iseq = RubyVM::InstructionSequence.compile(content)
File.binwrite(iseq_path, iseq.to_binary)
iseq
Tokenize • Build AST • (Interpret AST) • Build ISeq • Execute ISeq • Read/write ISeq • The fun part
module Utils
def self.add(left, right)
unless left.is_a?(Integer)
raise ArgumentError, "Invalid type, " \
"expected Integer, got #{left.class.name}"
end
unless right.is_a?(Integer)
raise ArgumentError, "Invalid type, " \
"expected Integer, got #{right.class.name}"
end
left + right
end
end