-
Notifications
You must be signed in to change notification settings - Fork 608
/
primitives.hpp
98 lines (74 loc) · 1.99 KB
/
primitives.hpp
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#ifndef RBX_PRIMITIVES_HPP
#define RBX_PRIMITIVES_HPP
#include "executor.hpp"
#include "prelude.hpp"
#include <stdexcept>
namespace rubinius {
/* Forwards */
class Object;
class Message;
class Primitives;
class Symbol;
enum PrimitiveRuntimeCode {
// A weird value, but works well. It looks like a reference to the highest
// address in memory.
kPrimitiveFailed = ((unsigned int)-1) & ~TAG_REF_MASK
};
class JITStubResults {
int arg_count_;
const char* name_;
bool pass_callframe_;
bool can_fail_;
public:
JITStubResults()
: arg_count_(0)
, name_(0)
, pass_callframe_(true)
, can_fail_(false)
{}
void set_arg_count(int count) {
arg_count_ = count;
}
int arg_count() {
return arg_count_;
}
void set_name(const char* name) {
name_ = name;
}
const char* name() {
return name_;
}
void set_pass_callframe(bool val) {
pass_callframe_ = val;
}
bool pass_callframe() {
return pass_callframe_;
}
void set_can_fail(bool val) {
can_fail_ = val;
}
bool can_fail() {
return can_fail_;
}
};
class Primitives {
public:
static Object* failure() {
return reinterpret_cast<Object*>(kPrimitiveFailed);
}
static void queue_for_jit(STATE, CallFrame* call_frame, int which);
/*
* The primitive generator emits one 'executor' function per
* primitive. This simply checks the argument types and then
* calls the C++ code that implements the primitive.
* See VMMethod::execute for the version that handles 'regular'
* Ruby code.
*/
static executor resolve_primitive(STATE, Symbol* name, int* index = 0);
static Object* unknown_primitive(STATE, CallFrame* call_frame, Dispatch& msg, Arguments& args);
static bool get_jit_stub(int index, JITStubResults& res);
static InvokePrimitive get_invoke_stub(STATE, Symbol* name);
#include "gen/primitives_declare.hpp"
};
}
#endif