-
Notifications
You must be signed in to change notification settings - Fork 5.3k
/
_sp_inc_helpers.erb
37 lines (34 loc) · 1.1 KB
/
_sp_inc_helpers.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
%# -*- C -*-
%# 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.
%;
#line <%= __LINE__ + 1 %> <%=cstr __FILE__ %>
static rb_snum_t
sp_inc_of_sendish(const struct rb_call_info *ci)
{
/* Send-ish instructions will:
*
* 1. Pop block argument, if any.
* 2. Pop ordinal arguments.
* 3. Pop receiver.
* 4. Push return value.
*/
const int argb = (ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0;
const int argc = ci->orig_argc;
const int recv = 1;
const int retn = 1;
/* 1. 2. 3. 4. */
return 0 - argb - argc - recv + retn;
}
static rb_snum_t
sp_inc_of_invokeblock(const struct rb_call_info *ci)
{
/* sp_inc of invokeblock is almost identical to that of sendish
* instructions, except that it does not pop receiver. */
return sp_inc_of_sendish(ci) + 1;
}
#pragma RubyVM reset source