class VirtualModule::PythonSourceProvider

Constants

EXT

Public Instance Methods

compile(vars=nil, type_info=nil, params=nil, script=nil, auto_binding=nil) click to toggle source
# File lib/virtual_module.rb, line 323
    def compile(vars=nil, type_info=nil, params=nil, script=nil, auto_binding=nil)
      @compiled_lib = (load_packages + @source).join("\n")
      if !vars.nil? && !type_info.nil? && !params.nil? && !script.nil? && !auto_binding.nil?
        preprocess = vars.map{|e| e.to_s + '=params[0]["'+e.to_s+'"]'}
        postprocess = auto_binding ? vars.map{|e| 'params[0]["'+e.to_s+'"]='+e.to_s } : []
        @compiled_lib += <<EOS
def vm_builtin_eval_func(params):
  #{(preprocess.join(";") + ";") if preprocess.count>0} #{script};
  #{(postprocess.join(";") + ";") if postprocess.count>0} return (None,#{auto_binding ? "params[0]" : "-1" });

EOS
      end
    end
generate_message(input_queue_path, receiver, name, *args, **kwargs) click to toggle source
# File lib/virtual_module.rb, line 337
def generate_message(input_queue_path, receiver, name, *args, **kwargs)
  script, params = ["", ""]
  if args.count + kwargs.count > 0
    gen_driver = ->(arg, input_queue_path, i, type, param_name){
      val = arg.class == Module ?
        (
          (table_index = arg.___proxy_object_transmitter.get_index(@builder.object_id)).nil? ?
            "dill.loads(f.read())" :
            "object_lookup_table[#{table_index}]"
        ) :
        "msgpack.unpackb(f.read())"
      "f=open('#{input_queue_path}.#{i}.#{type}', 'r'); #{param_name}=#{val}; f.close();"
    }
    conv_kwargs = KwargsConverter.new("{}", ->(k){"kwargs['#{k}']"}, "**kwargs")
    script, params = prepare_params(input_queue_path, gen_driver, conv_kwargs, name, *args, **kwargs)
  end
  callee = "#{name}"
  if !receiver.nil?
    if receiver[0..5]=="\xC1VMOBJ"
      script += "receiver=object_lookup_table[#{receiver[6..-1]}];"
    else
      File.write("#{input_queue_path}_serialized", receiver)
      script += "f=open('#{input_queue_path}_serialized', 'r'); receiver=dill.load(f); f.close();"
    end
    if name==:[]
      callee = "receiver"
    else
      callee = "receiver.#{name}"
    end
  end
  script += "___result = #{callee}#{params};"
end
lib_script(ipc=nil) click to toggle source
# File lib/virtual_module.rb, line 314
def lib_script(ipc=nil)
  if ipc!=:rpc
    @compiled_lib
  else
    # :rpc mode is to be implemented
    @compiled_lib
  end
end
load_packages() click to toggle source
# File lib/virtual_module.rb, line 250
def load_packages
  @pkgs.map{|e|
    if e.class==Hash
      e.map{|k,v| "from #{k} import #{ v.class==Array ? v.join(",") : v}"}
    else
      "import #{e}"
    end
  }.flatten
end
main_loop(input_queue_path, output_queue_path, lib_script=nil) click to toggle source
# File lib/virtual_module.rb, line 276
    def main_loop(input_queue_path, output_queue_path, lib_script=nil)
      <<EOS

import sys
sys.path.append('#{File.dirname(input_queue_path)}')
from #{lib_script} import *
import dill
import msgpack

object_lookup_table = {}
while True :
  try:
    f = open('#{input_queue_path}', 'r')
    source = f.read()
    f.close()
    if source[0]=='\\n':
      f = open('#{output_queue_path}', 'w')
      f.write(dill.dumps(object_lookup_table[int(source[1:len(source)])]))
      f.close()
    else:
      exec(source)
      f = open('#{output_queue_path}', 'w')
      try:
        f.write(msgpack.packb(___result))
      except:
        object_lookup_table[id(___result)] = ___result
        f.write('\\xc1VMOBJ'+str(id(___result)))
      f.close()
  except KeyboardInterrupt:
    print(object_lookup_table.keys())
    exit(0);
  except Exception as e:
    f = open('#{output_queue_path}', 'w')
    f.write('\\xc1VMERR'+str(type(e))+','+str(e.message))
    f.close()
EOS
    end
to_a() click to toggle source
# File lib/virtual_module.rb, line 260
def to_a
  :list
end
to_s() click to toggle source
# File lib/virtual_module.rb, line 264
def to_s
  :str
end
vclass() click to toggle source
# File lib/virtual_module.rb, line 268
def vclass
  :type
end
vmethods() click to toggle source
# File lib/virtual_module.rb, line 272
def vmethods
  :dir
end