2018-12-27 01:12:09 -05:00
|
|
|
%# -*- C -*-
|
2018-12-25 19:58:26 -05:00
|
|
|
%# Copyright (c) 2018 Urabe, Shyouhei. All rights reserved.
|
|
|
|
%#
|
|
|
|
%# This file is a part of the programming language Ruby. Permission is hereby
|
|
|
|
%# granted, to either redistribute and/or modify this file, provided that the
|
|
|
|
%# conditions mentioned in the file COPYING are met. Consult the file for
|
|
|
|
%# details.
|
|
|
|
%;
|
2018-12-26 02:23:35 -05:00
|
|
|
#line <%= __LINE__ + 1 %> <%=cstr __FILE__ %>
|
2018-12-25 19:58:26 -05:00
|
|
|
|
|
|
|
static rb_snum_t
|
VALUE size packed callinfo (ci).
Now, rb_call_info contains how to call the method with tuple of
(mid, orig_argc, flags, kwarg). Most of cases, kwarg == NULL and
mid+argc+flags only requires 64bits. So this patch packed
rb_call_info to VALUE (1 word) on such cases. If we can not
represent it in VALUE, then use imemo_callinfo which contains
conventional callinfo (rb_callinfo, renamed from rb_call_info).
iseq->body->ci_kw_size is removed because all of callinfo is VALUE
size (packed ci or a pointer to imemo_callinfo).
To access ci information, we need to use these functions:
vm_ci_mid(ci), _flag(ci), _argc(ci), _kwarg(ci).
struct rb_call_info_kw_arg is renamed to rb_callinfo_kwarg.
rb_funcallv_with_cc() and rb_method_basic_definition_p_with_cc()
is temporary removed because cd->ci should be marked.
2020-01-07 18:20:36 -05:00
|
|
|
sp_inc_of_sendish(const struct rb_callinfo *ci)
|
2018-12-25 19:58:26 -05:00
|
|
|
{
|
|
|
|
/* Send-ish instructions will:
|
|
|
|
*
|
|
|
|
* 1. Pop block argument, if any.
|
2018-12-26 04:14:28 -05:00
|
|
|
* 2. Pop ordinal arguments.
|
2018-12-25 19:58:26 -05:00
|
|
|
* 3. Pop receiver.
|
|
|
|
* 4. Push return value.
|
|
|
|
*/
|
VALUE size packed callinfo (ci).
Now, rb_call_info contains how to call the method with tuple of
(mid, orig_argc, flags, kwarg). Most of cases, kwarg == NULL and
mid+argc+flags only requires 64bits. So this patch packed
rb_call_info to VALUE (1 word) on such cases. If we can not
represent it in VALUE, then use imemo_callinfo which contains
conventional callinfo (rb_callinfo, renamed from rb_call_info).
iseq->body->ci_kw_size is removed because all of callinfo is VALUE
size (packed ci or a pointer to imemo_callinfo).
To access ci information, we need to use these functions:
vm_ci_mid(ci), _flag(ci), _argc(ci), _kwarg(ci).
struct rb_call_info_kw_arg is renamed to rb_callinfo_kwarg.
rb_funcallv_with_cc() and rb_method_basic_definition_p_with_cc()
is temporary removed because cd->ci should be marked.
2020-01-07 18:20:36 -05:00
|
|
|
const int argb = (vm_ci_flag(ci) & VM_CALL_ARGS_BLOCKARG) ? 1 : 0;
|
|
|
|
const int argc = vm_ci_argc(ci);
|
2018-12-25 19:58:26 -05:00
|
|
|
const int recv = 1;
|
|
|
|
const int retn = 1;
|
|
|
|
|
|
|
|
/* 1. 2. 3. 4. */
|
|
|
|
return 0 - argb - argc - recv + retn;
|
|
|
|
}
|
|
|
|
|
|
|
|
static rb_snum_t
|
VALUE size packed callinfo (ci).
Now, rb_call_info contains how to call the method with tuple of
(mid, orig_argc, flags, kwarg). Most of cases, kwarg == NULL and
mid+argc+flags only requires 64bits. So this patch packed
rb_call_info to VALUE (1 word) on such cases. If we can not
represent it in VALUE, then use imemo_callinfo which contains
conventional callinfo (rb_callinfo, renamed from rb_call_info).
iseq->body->ci_kw_size is removed because all of callinfo is VALUE
size (packed ci or a pointer to imemo_callinfo).
To access ci information, we need to use these functions:
vm_ci_mid(ci), _flag(ci), _argc(ci), _kwarg(ci).
struct rb_call_info_kw_arg is renamed to rb_callinfo_kwarg.
rb_funcallv_with_cc() and rb_method_basic_definition_p_with_cc()
is temporary removed because cd->ci should be marked.
2020-01-07 18:20:36 -05:00
|
|
|
sp_inc_of_invokeblock(const struct rb_callinfo *ci)
|
2018-12-25 19:58:26 -05:00
|
|
|
{
|
|
|
|
/* sp_inc of invokeblock is almost identical to that of sendish
|
2018-12-26 04:14:28 -05:00
|
|
|
* instructions, except that it does not pop receiver. */
|
2018-12-25 19:58:26 -05:00
|
|
|
return sp_inc_of_sendish(ci) + 1;
|
|
|
|
}
|
2018-12-26 02:23:35 -05:00
|
|
|
#pragma RubyVM reset source
|