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