def set_optional_args(args, args_node, names)
iseq = self.body
opt_pc = iseq.opt_pc
env = Nodewrap::ByteDecoder::Environment.new(iseq.local_table())
iseq.bytedecode(env, 0, opt_pc)
expressions = env.expressions + env.stack
expressions.sort!
opt_table = self.body.arg_opt_table
opt_table.pop
first_opt_idx =
names.size -
opt_table.size -
(self.rest_arg ? 1 : 0) -
(self.block_arg ? 1 : 0)
opt_table.each_with_index do |pc, idx|
name = names[first_opt_idx + idx]
expr = expressions.find { |e| e.pc >= pc }
args[name] = Argument.new(name, expr.rhs.to_s, nil, false, false)
end
end