Sha256: 0e65dab1f1672ea0307ac3d4bcc82ca290f8d7becb3feda18a7e95deb5eb2e26

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

#include "cruby.h"

#define CALL_METHOD(calling, ci, cc) (*(cc)->call)(th, cfp, (calling), (ci), (cc))
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;
}

void vm_caller_setup_arg_block(const rb_thread_t *th, rb_control_frame_t *reg_cfp,
    struct rb_calling_info *calling, const struct rb_call_info *ci, rb_iseq_t *blockiseq, const int is_super);
void vm_search_super_method(rb_thread_t *th, rb_control_frame_t *reg_cfp,
    struct rb_calling_info *calling, struct rb_call_info *ci, struct rb_call_cache *cc);
VALUE
llrb_insn_invokesuper(VALUE th_v, VALUE cfp_v, VALUE ci_v, VALUE cc_v, VALUE blockiseq_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;
  CALL_CACHE cc = (CALL_CACHE)cc_v;
  ISEQ blockiseq = (ISEQ)blockiseq_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;

  vm_caller_setup_arg_block(th, cfp, &calling, ci, blockiseq, 1);
  calling.recv = th->cfp->self;
  vm_search_super_method(th, th->cfp, &calling, ci, cc);

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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
llrb-0.0.1 ext/llrb_insn_invokesuper.c