-
Notifications
You must be signed in to change notification settings - Fork 47
/
fix_mem2.go
152 lines (123 loc) · 4.17 KB
/
fix_mem2.go
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package cxcore
//NOTE: Temp file for resolving CalculateDereferences issue
//TODO: What should this function be called?
// CalculateDereferences ... ...
//Todo: This function needs comments? What does it do?
//Todo: Can this function be specialized?
//CalculateDeference
// ->
//CalculateDeferenceSlice
//CalculateDeferenceArray
//CalculateDeferencePointer
//CalculateDeferenceInt32, etc (FIXED)
//TODO: Why are we calling this function for fixed data types in flow path
//TODO: For int32, f32, etc, this function should not be called at all
//reduce loops and switches in op code execution flow path
func CalculateDereferences(arg *CXArgument, finalOffset *int, fp int) {
var isPointer bool
var baseOffset int
var sizeofElement int
idxCounter := 0
for _, op := range arg.DereferenceOperations {
switch op {
case DEREF_SLICE:
if len(arg.Indexes) == 0 {
continue
}
isPointer = false
var offset int32
var byts []byte
byts = PROGRAM.Memory[*finalOffset : *finalOffset+TYPE_POINTER_SIZE]
offset = Deserialize_i32(byts)
*finalOffset = int(offset)
baseOffset = *finalOffset
*finalOffset += OBJECT_HEADER_SIZE
*finalOffset += SLICE_HEADER_SIZE
sizeToUse := GetDerefSize(arg)
*finalOffset += int(ReadI32(fp, arg.Indexes[idxCounter])) * sizeToUse
if !IsValidSliceIndex(baseOffset, *finalOffset, sizeToUse) {
panic(CX_RUNTIME_SLICE_INDEX_OUT_OF_RANGE)
}
idxCounter++
case DEREF_ARRAY:
if len(arg.Indexes) == 0 {
continue
}
var subSize = int(1)
for _, len := range arg.Lengths[idxCounter+1:] {
subSize *= len
}
sizeToUse := GetDerefSize(arg)
baseOffset = *finalOffset
sizeofElement = subSize * sizeToUse
*finalOffset += int(ReadI32(fp, arg.Indexes[idxCounter])) * sizeofElement
idxCounter++
case DEREF_POINTER:
isPointer = true
var offset int32
var byts []byte
byts = PROGRAM.Memory[*finalOffset : *finalOffset+TYPE_POINTER_SIZE]
offset = Deserialize_i32(byts)
*finalOffset = int(offset)
}
}
// if *finalOffset >= PROGRAM.HeapStartsAt {
if *finalOffset >= PROGRAM.HeapStartsAt && isPointer {
// then it's an object
*finalOffset += OBJECT_HEADER_SIZE
if arg.IsSlice {
*finalOffset += SLICE_HEADER_SIZE
if !IsValidSliceIndex(baseOffset, *finalOffset, sizeofElement) {
panic(CX_RUNTIME_SLICE_INDEX_OUT_OF_RANGE)
}
}
}
}
// CalculateDereferences_i8 ...
func CalculateDereferences_i8(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_i16 ...
func CalculateDereferences_i16(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_i32 ...
func CalculateDereferences_i32(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_i64 ...
func CalculateDereferences_i64(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_ui8 ...
func CalculateDereferences_ui8(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_ui16 ...
func CalculateDereferences_ui16(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_ui32 ...
func CalculateDereferences_ui32(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_ui64 ...
func CalculateDereferences_ui64(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_f32 ...
func CalculateDereferences_f32(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_f64 ...
func CalculateDereferences_f64(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_str ...
func CalculateDereferences_str(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}
// CalculateDereferences_bool ...
func CalculateDereferences_bool(arg *CXArgument, finalOffset *int, fp int) {
CalculateDereferences(arg, finalOffset, fp)
}