lib/pycall/eval.rb in pycall-0.1.0.alpha.20170302 vs lib/pycall/eval.rb in pycall-0.1.0.alpha.20170307

- old
+ new

@@ -1,30 +1,28 @@ module PyCall module Eval Py_eval_input = 258 def self.eval(str, filename: "pycall") - globals_ptr = maindict_ptr - locals_ptr = maindict_ptr + globals_ptr = main_dict + locals_ptr = main_dict defer_sigint do py_code_ptr = LibPython.Py_CompileString(str, filename, Py_eval_input) raise PyError.fetch if py_code_ptr.null? LibPython.PyEval_EvalCode(py_code_ptr, globals_ptr, locals_ptr) end end class << self private - def main_module - @main_module ||= PyCall.import_module("__main__") + def main_dict + @main_dict ||= PyCall.import_module("__main__") do |main_module| + PyCall.incref(LibPython.PyModule_GetDict(main_module)) + end end - def maindict_ptr - @maindict_ptr ||= LibPython.PyModule_GetDict(main_module) - end - def defer_sigint # TODO: should be implemented yield end end @@ -32,13 +30,20 @@ def self.import_module(name) name = name.to_s if name.kind_of? Symbol raise TypeError, "name must be a String" unless name.kind_of? String value = LibPython.PyImport_ImportModule(name) - return value.to_ruby unless value.null? - raise PyError.fetch + raise PyError.fetch if value.null? + value = value.to_ruby + return value unless block_given? + begin + yield value + ensure + PyCall.decref(value) + end end - def self.eval(str) - Eval.eval(str).to_ruby + def self.eval(str, conversion: true) + result = Eval.eval(str) + conversion ? result.to_ruby : result end end