-
Notifications
You must be signed in to change notification settings - Fork 65
/
utils.c
72 lines (54 loc) · 1.76 KB
/
utils.c
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
#include "pThreadedFFI.h"
void writeAddress(sqInt anExternalAddress, void* value){
if(!isKindOfClass(anExternalAddress, classExternalAddress())){
primitiveFail();
return;
}
*((void**)firstIndexableField(anExternalAddress)) = value;
}
sqInt getAttributeOf(sqInt receiver, int index) {
return fetchPointerofObject(index, receiver);
}
void *getHandlerOf(sqInt receiver, int index) {
return readAddress(getAttributeOf(receiver, index));
}
void setHandler(sqInt anExternalObject, void* value){
if(!(isPointers(anExternalObject) && slotSizeOf(anExternalObject) >= 1)) {
primitiveFail();
return;
}
writeAddress(fetchPointerofObject(0, anExternalObject), value);
}
void* getAddressFromExternalAddressOrByteArray(sqInt anExternalAddressOrByteArray){
if(isKindOfClass(anExternalAddressOrByteArray, classExternalAddress())){
return readAddress(anExternalAddressOrByteArray);
}
if(isKindOfClass(anExternalAddressOrByteArray, classByteArray())){
return firstIndexableField(anExternalAddressOrByteArray);
}
primitiveFail();
return NULL;
}
char *readString(sqInt aString) {
if(!isKindOfClass(aString, classString())){
primitiveFail();
return NULL;
}
return (char *)firstIndexableField(aString);
}
// Extras
inline sqInt newExternalAddress(void *address) {
sqInt externalAddress = instantiateClassindexableSize(classExternalAddress(), sizeof(void*));
writeAddress(externalAddress, address);
return externalAddress;
}
// Array
inline sqInt arrayObjectAt(sqInt array, sqInt index) {
return stObjectat(array, index + 1);
}
inline sqInt arrayObjectAtPut(sqInt array, sqInt index, sqInt object) {
return stObjectatput(array, index + 1, object);
}
inline sqInt arrayObjectSize(sqInt array) {
return stSizeOf(array);
}