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