-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexecute.cpp
More file actions
110 lines (89 loc) · 3.46 KB
/
execute.cpp
File metadata and controls
110 lines (89 loc) · 3.46 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
#include "std.h"
#include "rope.h"
#include "sig.h"
#include "frame.h"
#include "lock.h"
#include "symbol.h"
#include "excep.h"
#include "SpmtThread.h"
#include "CertainMode.h"
#include "SpecMode.h"
#include "RvpMode.h"
#include "RopeVM.h"
#include "Message.h"
#include "Loggers.h"
#include "DebugScaffold.h"
#include "interp.h"
#define VA_DOUBLE(args, sp) \
if(*sig == 'D') \
*(double*)sp = va_arg(args, double); \
else \
*(u8*)sp = va_arg(args, u8); \
sp+=2
#define VA_SINGLE(args, sp) \
if(*sig == 'L' || *sig == '[') \
*sp = va_arg(args, uintptr_t); \
else \
if(*sig == 'F') \
*(float*)sp = va_arg(args, double); \
else \
*sp = va_arg(args, u4); \
sp++
#define JA_DOUBLE(args, sp) *(u8*)sp = *args++; sp+=2
#define JA_SINGLE(args, sp) \
switch(*sig) { \
case 'L': case '[': case 'F': \
*sp = *(uintptr_t*)args; \
break; \
case 'B': case 'Z': \
*sp = *(signed char*)args; \
break; \
case 'C': \
*sp = *(unsigned short*)args; \
break; \
case 'S': \
*sp = *(signed short*)args; \
break; \
case 'I': \
*sp = *(signed int*)args; \
break; \
} \
sp++; args++
void *executeMethodArgs(DummyFrame* dummy, Object *ob, Class *classobj, MethodBlock *mb, ...) {
va_list jargs;
void *ret;
va_start(jargs, mb);
ret = executeMethodVaList(dummy, ob, classobj, mb, jargs);
va_end(jargs);
return ret;
}
void *executeMethodVaList(DummyFrame* dummy, Object *ob, Class *classobj, MethodBlock *mb, va_list jargs) {
void *ret;
SpmtThread* current_st = g_get_current_spmt_thread();
// int args_count = ob ? mb->args_count - 1 : mb->args_count;
// std::vector<uintptr_t> args(args_count);
std::vector<uintptr_t> arguments(mb->args_count);
uintptr_t* arg = &arguments[0];
if (ob) {
*arg++ = (uintptr_t)ob;
}
char *sig = mb->type;
SCAN_SIG(sig, VA_DOUBLE(jargs, arg), VA_SINGLE(jargs, arg));
ret = current_st->get_current_mode()->do_execute_method((ob ? ob : classobj), mb, arguments, dummy);
return ret;
}
void *executeMethodList(DummyFrame* dummy, Object *ob, Class *classobj, MethodBlock *mb, u8 *jargs) {
void *ret;
SpmtThread* current_st = g_get_current_spmt_thread();
// int args_count = ob ? mb->args_count - 1 : mb->args_count;
// std::vector<uintptr_t> args(args_count);
std::vector<uintptr_t> arguments(mb->args_count);
uintptr_t* arg = &arguments[0];
if (ob) {
*arg++ = (uintptr_t)ob;
}
char *sig = mb->type;
SCAN_SIG(sig, JA_DOUBLE(jargs, arg), JA_SINGLE(jargs, arg));
ret = current_st->get_current_mode()->do_execute_method((ob ? ob : classobj), mb, arguments, dummy);
return ret;
}