Sha256: f42f70ac1b3bcfcbf40277dd67263c4bd0f2770389712a18e01fd54a3a8bf30e

Contents?: true

Size: 1.71 KB

Versions: 1

Compression:

Stored size: 1.71 KB

Contents

require "rupy/python"
require "rupy/conversion"
require 'rupy/macros'
require 'rupy/conversion'
require 'rupy/pyobject'
require "rupy/pymainclass"
require "rupy/rubypyproxy"

module Rupy
    class << self
        def eval(code)
            globals = PyObject.new({
                "__builtins__" => PyMain.builtin.pObject,
            })
            empty_hash = PyObject.new({})
            ptr = Python.PyRun_String(code, Python::PY_FILE_INPUT, globals.pointer, empty_hash.pointer)
        end
        
        def generator_type
            @generator_type ||= lambda do
                code = <<-eof
def rupy_generator(callback):
    while True:
        yield callback()
                eof

                globals = PyObject.new({
                    "__builtins__" => PyMain.builtin.pObject,
                })
                empty_hash = PyObject.new({})
                ptr = Python.PyRun_String(code, Python::PY_FILE_INPUT, globals.pointer, empty_hash.pointer)
                ptr = Python.PyRun_String("rupy_generator", Python::PY_EVAL_INPUT, globals.pointer, empty_hash.pointer)
                if PythonError.error?
                    raise PythonError.handle_error
                end
                RubyPyProxy.new(PyObject.new(ptr))
            end.call
        end

        def generator
            return lambda do |*args|
                fib = Fiber.new do
                    yield *args
                    Python.PyErr_SetNone(Python.PyExc_StopIteration)
                    FFI::Pointer::NULL
                end
                generator_type.__call__(lambda do
                    fib.resume
                end)
            end
        end

        def yield(*args)
            Fiber.yield(*args)
        end
    end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rupy-0.4.2 lib/rupy/pygenerator.rb