Slide 27
Slide 27 text
特定のメソッドを対象にPoC
を書く
module Ext
def map(*args, &block)
source = File.readlines(block.source_location[0])
proc_binding = block.binding
ast = RubyVM::AbstractSyntaxTree.of(block)
args_tbl = ast.children[0]
block_node = ast.children[2]
if args_tbl.empty?
extracted = extract_source(
source,
block_node.first_lineno,
block_node.first_column,
block_node.last_lineno,
block_node.last_column)
new_block = proc_binding.eval("proc { |it| #{extracted} }")
super(*args, &new_block)
else
super(*args, &block)
end
end
end
Array.prepend(Ext)
n = 3
[1, 2, 3].map { p it + n }
# => [4, 5, 6]