Sha256: 462464d1ae75e7833031eab34be732215f40dc3162a123b0e8aab0e58ea849b8

Contents?: true

Size: 1.01 KB

Versions: 1

Compression:

Stored size: 1.01 KB

Contents

#include "cruby.h"

VALUE vm_exec(rb_thread_t *th);

static inline void
_llrb_push_result(rb_control_frame_t *cfp, VALUE result)
{
  // PUSH(result)
  *(cfp->sp) = result;
  cfp->sp += 1;
}

VALUE vm_invoke_block(rb_thread_t *th, rb_control_frame_t *reg_cfp, struct rb_calling_info *calling, const struct rb_call_info *ci);
VALUE
llrb_insn_invokeblock(VALUE th_v, VALUE cfp_v, VALUE ci_v, unsigned int stack_size, ...)
{
  rb_thread_t *th = (rb_thread_t *)th_v;
  rb_control_frame_t *cfp = (rb_control_frame_t *)cfp_v;
  CALL_INFO ci = (CALL_INFO)ci_v;

  va_list ar;
  va_start(ar, stack_size);
  for (unsigned int i = 0; i < stack_size; i++) {
    _llrb_push_result(cfp, va_arg(ar, VALUE));
  }
  va_end(ar);

  struct rb_calling_info calling;
  calling.argc = ci->orig_argc;
  calling.block_handler = VM_BLOCK_HANDLER_NONE;
  calling.recv = cfp->self;

  VALUE val = vm_invoke_block(th, cfp, &calling, ci);
  if (val == Qundef) {
    VM_ENV_FLAGS_SET(th->cfp->ep, VM_FRAME_FLAG_FINISH);
    return vm_exec(th);
  }
  return val;
}

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
llrb-0.0.1 ext/llrb_insn_invokeblock.c