-
Notifications
You must be signed in to change notification settings - Fork 609
/
executable.hpp
93 lines (64 loc) · 1.91 KB
/
executable.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
#ifndef RBX_BUILTIN_EXECUTABLE_HPP
#define RBX_BUILTIN_EXECUTABLE_HPP
#include <assert.h>
#include "builtin/object.hpp"
#include "type_info.hpp"
#include "executor.hpp"
#include "gc/code_resource.hpp"
#include <list>
namespace rubinius {
class Arguments;
class MachineCode;
class CompiledCode;
class ObjectMemory;
class Inliners : public CodeResource {
std::list<CompiledCode*> inliners_;
public:
Inliners(ObjectMemory* om);
std::list<CompiledCode*>& inliners() {
return inliners_;
}
void cleanup(State* state, CodeManager* cm);
};
class Executable : public Object {
public:
const static object_type type = ExecutableType;
private:
Symbol* primitive_; // slot
Fixnum* serial_; // slot
public:
// This one is public so it can be directly invoked.
executor execute;
protected:
int prim_index_;
Inliners* inliners_;
public:
/* accessors */
attr_accessor(primitive, Symbol);
attr_accessor(serial, Fixnum);
void set_executor(rubinius::executor exc) {
execute = exc;
}
int prim_index() {
return prim_index_;
}
/* interface */
// Rubinius.primitive :executable_allocate
static Executable* allocate(STATE, Object* self);
static void init(STATE);
static Object* default_executor(STATE, CallFrame* call_frame, Executable* exec, Module* mod, Arguments& args);
// Rubinius.primitive :executable_invoke
Object* invoke(STATE, Symbol* name, Module* mod, Object* recv, Array* args, Object* block, CallFrame* calling_environment);
bool resolve_primitive(STATE);
void add_inliner(ObjectMemory* om, CompiledCode* cm);
void clear_inliners(STATE);
class Info : public TypeInfo {
public:
BASIC_TYPEINFO(TypeInfo)
virtual void mark(Object* obj, ObjectMark& mark);
void mark_inliners(Object* obj, ObjectMark& mark);
};
friend class Info;
};
}
#endif