Class: VirtualModule::PythonSourceProvider

Inherits:
BaseSourceProvider show all
Defined in:
lib/virtual_module.rb

Constant Summary collapse

EXT =
"py"

Instance Attribute Summary

Attributes inherited from BaseSourceProvider

#pkgs, #source

Instance Method Summary collapse

Methods inherited from BaseSourceProvider

#initialize, #lang

Constructor Details

This class inherits a constructor from VirtualModule::BaseSourceProvider

Instance Method Details

#compile(vars = nil, type_info = nil, params = nil, script = nil, auto_binding = nil) ⇒ Object



323
324
325
326
327
328
329
330
331
332
333
334
335
# 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) ⇒ Object



337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
# 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) ⇒ Object



314
315
316
317
318
319
320
321
# 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_packagesObject



250
251
252
253
254
255
256
257
258
# 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) ⇒ Object



276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
# File 'lib/virtual_module.rb', line 276

def main_loop(input_queue_path, output_queue_path, lib_script=nil)
  <<EOS
# coding: utf-8
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_aObject



260
261
262
# File 'lib/virtual_module.rb', line 260

def to_a
  :list
end

#to_sObject



264
265
266
# File 'lib/virtual_module.rb', line 264

def to_s
  :str
end

#vclassObject



268
269
270
# File 'lib/virtual_module.rb', line 268

def vclass
  :type
end

#vmethodsObject



272
273
274
# File 'lib/virtual_module.rb', line 272

def vmethods
  :dir
end