Class: VirtualModule::Builder

Inherits:
Object
  • Object
show all
Includes:
SexpParser
Defined in:
lib/virtual_module.rb

Defined Under Namespace

Classes: ProxyObjectTransmitter

Instance Method Summary collapse

Methods included from SexpParser

#extract_args, #extract_defs

Constructor Details

#initialize(option) ⇒ Builder

Returns a new instance of Builder.



71
72
73
74
# File 'lib/virtual_module.rb', line 71

def initialize(option)
  @provider = instance_eval("#{option[:lang].capitalize}SourceProvider").new(self, option[:pkgs], option[:transpiler])
  @ipc = instance_eval("#{option[:ipc].to_s.capitalize}IpcInterface").new(@provider)
end

Instance Method Details

#add(methods = "") ⇒ Object



76
77
78
79
80
# File 'lib/virtual_module.rb', line 76

def add(methods="")
  @provider.source << methods
  @provider.compile
  @ipc.reset @provider
end

#buildObject



82
83
84
85
# File 'lib/virtual_module.rb', line 82

def build
  @vm = new_vm(nil)
  @vm
end

#call(receiver, name, *args) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/virtual_module.rb', line 87

def call(receiver, name, *args)
  if args.last.class==Hash
    kwargs = args.pop
  else
    kwargs = {}
  end
  begin
    @ipc.call(receiver, name, *args, **kwargs)
  rescue => e
    new_vm(e.message)
  rescue RuntimeException => e
    raise e.message
  end
end

#serialize(object_lookup_id) ⇒ Object



102
103
104
# File 'lib/virtual_module.rb', line 102

def serialize(object_lookup_id)
  @ipc.serialize(object_lookup_id)
end

#virtual_module_eval(receiver, script, auto_binding = true) ⇒ Object Also known as: virtual_instance_eval, virtual_eval



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/virtual_module.rb', line 106

def virtual_module_eval(receiver, script, auto_binding=true)
  vars, type_info, params = inspect_local_vars(binding.of_caller(2), script)
  @provider.compile(vars, type_info, params, script, auto_binding)
  @ipc.reset @provider
  evaluated = self.call(receiver, :vm_builtin_eval_func, [params, type_info])

  if auto_binding
    binding.of_caller(2).eval(evaluated[1].map{|k,v| "#{k}=#{v};" if !v.nil? }.join)
  end

  return evaluated[0]
end