Sha256: 61cb1622b8eead6dbecde1cbdc048264fcdf8a0aec41b7829c9b16ef5b2b574b
Contents?: true
Size: 1.45 KB
Versions: 1
Compression:
Stored size: 1.45 KB
Contents
#include "cruby.h" #define CALL_METHOD(calling, ci, cc) (*(cc)->call)(th, cfp, (calling), (ci), (cc)) void vm_search_method(const struct rb_call_info *ci, struct rb_call_cache *cc, VALUE recv); VALUE vm_exec(rb_thread_t *th); 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); static inline void _llrb_push_result(rb_control_frame_t *cfp, VALUE result) { // PUSH(result) *(cfp->sp) = result; cfp->sp += 1; } VALUE llrb_insn_send(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; VALUE recv = Qnil; va_list ar; va_start(ar, stack_size); for (unsigned int i = 0; i < stack_size; i++) { VALUE val = va_arg(ar, VALUE); if (i == 0) recv = val; _llrb_push_result(cfp, val); } va_end(ar); struct rb_calling_info calling; vm_caller_setup_arg_block(th, cfp, &calling, ci, blockiseq, 0); calling.argc = ci->orig_argc; calling.recv = recv; vm_search_method(ci, cc, recv); 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_send.c |