Sha256: 4d8ef57e9ec8b023c324e39a8e9ed29a6bef52075f89e509c79bcf0cd2712e61

Contents?: true

Size: 1.39 KB

Versions: 4

Compression:

Stored size: 1.39 KB

Contents

module Perl
  module Common
    PERL_EXIT_EXPECTED      = 0x01
    PERL_EXIT_DESTRUCT_END  = 0x02

    def start
      Perl.setup
      argc, argv = embedded_argv_to_ffi

      @my_perl = Perl.perl_alloc
      Perl.perl_construct(@my_perl)

      Perl.curinterp[:Iexit_flags] |= PERL_EXIT_DESTRUCT_END

      Perl.perl_parse(@my_perl, nil, argc, argv, nil)
      Perl.perl_run(@my_perl)
    end

    def stop
      Perl.perl_destruct(@my_perl)
      Perl.perl_free(@my_perl)

      @my_perl = nil
      Perl.PL_curinterp = nil
    end

    #
    # Returns a C-style tuple of <argc,argv> corresponding to the real
    # arguments the application was invoked with.
    #
    def argv_to_ffi
      array_to_ffi(ARGV)
    end

    #
    # Returns a C-style tuple of <argc,argv> suitable for running an
    # embedded Perl interpreter.
    #
    def embedded_argv_to_ffi
      array_to_ffi(%w[-e 0])
    end

  protected
    def array_to_ffi(array)
      strptrs = [].tap do |ptrs|
        ptrs << FFI::MemoryPointer.from_string("")  # XXX
        array.each do |arg|
          ptrs << FFI::MemoryPointer.from_string(arg)
        end
        ptrs << nil
      end

      [strptrs.length-1, array_ptr(strptrs)]
    end

    def array_ptr(list)
      FFI::MemoryPointer.new(:pointer, list.length).tap do |argv|
        list.each_with_index do |p, i|
          argv[i].put_pointer(0,  p)
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ruby-perl-04.01.2011.2 lib/perl/common.rb
ruby-perl-04.01.2011.1 lib/perl/common.rb
ruby-perl-04.01.2011 lib/perl/common.rb
ruby-perl-0.99.15j lib/perl/common.rb