-
Notifications
You must be signed in to change notification settings - Fork 67
/
primitiveUtils.c
78 lines (60 loc) · 1.37 KB
/
primitiveUtils.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
73
74
75
76
77
78
#include "pThreadedFFI.h"
#include "pharovm/macros.h"
/**
* This primitive copy the memory from an object to the other.
* The parameters could be ByteArrays or ExternalAddress.
*
* It receives three parameters:
*
* - A From
* - A To
* - A Size
*/
PrimitiveWithDepth(primitiveCopyFromTo, 1){
sqInt from;
sqInt to;
sqInt size;
void* fromAddress;
void* toAddress;
size = stackIntegerValue(0);
checkFailed();
to = stackObjectValue(1);
checkFailed();
from = stackObjectValue(2);
checkFailed();
fromAddress = getAddressFromExternalAddressOrByteArray(from);
checkFailed();
toAddress = getAddressFromExternalAddressOrByteArray(to);
checkFailed();
memcpy(toAddress, fromAddress, size);
primitiveEnd();
}
/*
* This primitive returns the address of an image object.
* It fails if the object is not pinned.
*
* Receives an OOP as parameter and returns an SmallInteger
*/
PrimitiveWithDepth(primitiveGetAddressOfOOP, 2){
sqInt oop;
oop = stackValue(0);
checkFailed();
if(isForwarded(oop)){
primitiveFail();
return;
}
if(!isPinned(oop)){
primitiveFail();
return;
}
primitiveEndReturnInteger(oop + BaseHeaderSize);
}
/*
* This primitive returns the object in an oop passed as integer.
*/
Primitive(primitiveGetObjectFromAddress){
sqInt oop;
oop = integerValueOf(stackValue(0)) - BaseHeaderSize;
checkFailed();
primitiveEndReturn(oop);
}