Sha256: 480f4c47c7bd75c38cf2fa46d96f4c3413be2123dc60b2cff7fdf036cee07c3b
Contents?: true
Size: 1.92 KB
Versions: 2
Compression:
Stored size: 1.92 KB
Contents
class RubyProcess #Calls a block by its block-ID with given arguments. def cmd_block_call(obj) raise "Invalid block-ID: '#{obj}'." if obj[:block_id].to_i <= 0 block_ele = @proxy_objs[obj[:block_id]] raise "No block by that ID: '#{obj[:block_id]}'." if !block_ele raise "Not a block? '#{block_ele.class.name}'." if !block_ele.respond_to?(:call) debug "Calling block #{obj[:block_id]}: #{obj}\n" if @debug answer_id = obj[:answer_id] raise "No ':answer_id' was given (#{obj})." if !answer_id if answer = @answers[answer_id] #Use a queue to sleep thread until the block has been executed. queue = Queue.new answer.push(type: :proxy_block_call, block: block_ele, args: read_args(obj[:args]), queue: queue) res = queue.pop raise "Expected true but didnt get that: '#{res}'." if res != true else block_ele.call(*read_args(obj[:args])) end return nil end #Spawns a block and returns its ID. def cmd_spawn_proxy_block(obj) block = proc{ send(cmd: :block_call, block_id: obj[:id], answer_id: obj[:answer_id]) } id = block.__id__ raise "ID already exists: '#{id}'." if @objects.key?(id) @objects[id] = block return {id: id} end #Dynamically creates a block with a certain arity. If sub-methods measure arity, they will get the correct one from the other process. def block_with_arity(args, &block) eval_str = "proc{" eval_argsarr = "\t\tblock.call(" if args[:arity] > 0 eval_str << "|" 1.upto(args[:arity]) do |i| if i > 1 eval_str << "," eval_argsarr << "," end eval_str << "arg#{i}" eval_argsarr << "arg#{i}" end eval_str << "|\n" eval_argsarr << ")\n" end eval_full = eval_str + eval_argsarr eval_full << "}" debug "Block eval: #{eval_full}\n" if @debug dynamic_proc = eval(eval_full) return dynamic_proc end end
Version data entries
2 entries across 2 versions & 2 rubygems
Version | Path |
---|---|
ruby_process-0.0.13 | cmds/blocks.rb |
RubyProcess-0.0.12 | cmds/blocks.rb |