blob: ac35df64f406496cbdec4097e0e3eaffcf6b0179 (
plain)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
%# -*- 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__ %>
#include "iseq.h"
extern const bool rb_vm_insn_leaf_p[];
#ifdef RUBY_VM_INSNS_INFO
const bool rb_vm_insn_leaf_p[] = {
% RubyVM::Instructions.each_slice(20) do |insns|
<%= insns.map do |insn|
if insn.is_a?(RubyVM::BareInstructions)
insn.always_leaf? ? '1' : '0'
else
'0'
end
end.join(', ')
%>,
% end
};
#endif
CONSTFUNC(MAYBE_UNUSED(static bool insn_leaf_p(VALUE insn)));
bool
insn_leaf_p(VALUE insn)
{
return rb_vm_insn_leaf_p[insn];
}
// This is used to tell RJIT that this insn would be leaf if CHECK_INTS didn't exist.
// It should be used only when RUBY_VM_CHECK_INTS is directly written in insns.def.
static bool leafness_of_check_ints = false;
static bool
leafness_of_defined(rb_num_t op_type)
{
/* see also: vm_insnhelper.c:vm_defined() */
switch (op_type) {
case DEFINED_IVAR:
case DEFINED_GVAR:
case DEFINED_CVAR:
case DEFINED_YIELD:
case DEFINED_REF:
case DEFINED_ZSUPER:
return false;
case DEFINED_CONST:
case DEFINED_CONST_FROM:
/* has rb_autoload_load(); */
return false;
case DEFINED_FUNC:
case DEFINED_METHOD:
/* calls #respond_to_missing? */
return false;
default:
rb_bug("unknown operand %ld: blame @shyouhei.", op_type);
}
}
static bool
leafness_of_checkmatch(rb_num_t flag)
{
/* see also: vm_insnhelper.c:check_match() */
if (flag == VM_CHECKMATCH_TYPE_WHEN) {
return true;
}
else {
/* has rb_funcallv() */
return false;
}
}
#pragma RubyVM reset source
|