Sha256: 5beb74fc325164731737f7f11018e73c052ea59018ef3e3bbc4abe35a68f9c84
Contents?: true
Size: 1.89 KB
Versions: 4
Compression:
Stored size: 1.89 KB
Contents
require 'perl' require 'perl/common' require 'perl/stack' module Perl class Interpreter include Perl::Common G_SCALAR = 0 G_ARRAY = 1 G_DISCARD = 2 G_EVAL = 4 G_NOARGS = 8 G_KEEPERR = 16 G_NODEBUG = 32 G_METHOD = 64 G_VOID = 128 def initialize start end def eval(str=nil, &block) return Perl.Perl_eval_pv(Perl.PL_curinterp, str, 1) if str if block_given? yield(Statement.new) end end alias_method :run, :eval def load(filename) file = File.read(filename) eval(file) end def call(method_name, args, return_type) Perl::Stack.function_stack(args) do |stack| rc = do_call(method_name, options_for_call(args, return_type)) ret = handle_return(rc, return_type, stack) if return_type == :void return nil else if block_given? return yield(ret) else ret.freeze! return ret end end end end protected def do_call(method_name, options) method = method_name.is_a?(String) ? :Perl_call_pv : :Perl_call_sv Perl.send(method, Perl.PL_curinterp, method_name, options) end # XXX should we have G_DISCARD ? def options_for_call(args, return_type) options = G_EVAL options |= G_NOARGS if args.empty? case return_type when :list options |= G_ARRAY when :scalar options |= G_SCALAR when :void options |= G_VOID else raise "Unknown return type #{return_type}" end end def handle_return(ret, return_type, stack) case return_type when :list when :scalar raise "Unexpected ret=#{ret}" unless ret == 1 Perl::Value::Scalar.new(stack.pop_scalar) when :void raise "Unexpected ret=#{ret}" unless ret == 0 end end end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
ruby-perl-04.01.2011.2 | lib/perl/interpreter.rb |
ruby-perl-04.01.2011.1 | lib/perl/interpreter.rb |
ruby-perl-04.01.2011 | lib/perl/interpreter.rb |
ruby-perl-0.99.15j | lib/perl/interpreter.rb |