-
Notifications
You must be signed in to change notification settings - Fork 0
/
PackageData.ulam
176 lines (132 loc) · 4.25 KB
/
PackageData.ulam
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
transient PackageData {
typedef DataUtils.Datum Datum;
typedef DataUtils.Byte Byte;
typedef DataUtils.Integer Integer;
typedef ITaggable.Tag Tag;
typedef Unsigned(2) Arity;
typedef Unsigned(2) Type;
typedef Byte Symbol;
constant Datum cNO_DATA = 0x0;
constant Byte cNIL = 0x0;
constant Type cTYPE_BLOCK = 0;
constant Type cTYPE_FUNCTION = 1;
constant Type cTYPE_CONDITIONAL = 2;
constant Type cTYPE_CONSTANT = 3;
// Data
//
// arity type unused symbol/value
// v v v v
// | 0 1 | 2 3 | 4 5 | 6 | 7 | 0 1 2 3 4 5 6 7
// ^ ^
// executable? has value?
//
constant Byte cARITY_MASK = 0b11000000;
constant Unsigned cARITY_SHIFT = 6;
constant Byte cTYPE_MASK = 0b00110000;
constant Unsigned cTYPE_SHIFT = 4;
constant Byte cIS_EXEC_MASK = 0b00000010;
constant Unsigned cIS_EXEC_SHIFT = 1;
// Aux
// Non-executable: tag
// Executable: either final result of node evaluation or stored 1st argument
//
// unused active/final? tag/value
// v v v
// | 0 1 2 3 4 | 5 | 6 | 7 | 0 1 2 3 4 5 6 7
// ^ ^
// active has value?
// default
// Aux: non-executable
constant Byte cIS_ACTIVE_DEFAULT_MASK = 0b00000100;
constant Unsigned cIS_ACTIVE_DEFAULT_SHIFT = 2;
constant Byte cIS_ACTIVE_MASK = 0b00000010;
constant Unsigned cIS_ACTIVE_SHIFT = 1;
// Aux: executable
constant Byte cIS_FINAL_MASK = cIS_ACTIVE_MASK;
constant Unsigned cIS_FINAL_SHIFT = cIS_ACTIVE_SHIFT;
// Common
constant Byte cHAS_VALUE_MASK = 0b00000001;
constant Unsigned cHAS_VALUE_SHIFT = 0;
DataUtils dd;
// Data
Arity getArity(Datum datum) {
return (Arity) dd.getHi(datum, cARITY_MASK, cARITY_SHIFT);
}
Datum setArity(Datum datum, Arity arity) {
return dd.setHi(datum, arity, cARITY_MASK, cARITY_SHIFT);
}
Type getType(Datum datum) {
return (Type) dd.getHi(datum, cTYPE_MASK, cTYPE_SHIFT);
}
Datum setType(Datum datum, Type type) {
return dd.setHi(datum, type, cTYPE_MASK, cTYPE_SHIFT);
}
Bool isExec(Datum datum) {
return (Bool) dd.getHi(datum, cIS_EXEC_MASK, cIS_EXEC_SHIFT);
}
Datum setIsExec(Datum datum, Bool exec) {
return dd.setHi(datum, (Byte) exec, cIS_EXEC_MASK, cIS_EXEC_SHIFT);
}
Symbol getSymbol(Datum datum) {
return getValue(datum);
}
Datum setSymbol(Datum datum, Symbol symbol) {
return setValue(datum, symbol);
}
// Aux (non-executable)
Bool hasTag(Datum datum) {
return hasValue(datum);
}
Tag getTag(Datum datum) {
return getValue(datum);
}
Datum setTag(Datum datum, Tag tag) {
return setValue(datum, tag);
}
// Aux: non-executable
Bool isActiveDefault(Datum datum) {
return (Bool) dd.getHi(datum, cIS_ACTIVE_DEFAULT_MASK, cIS_ACTIVE_DEFAULT_SHIFT);
}
Datum setIsActiveDefault(Datum datum, Bool isActive) {
return dd.setHi(datum, (Byte) isActive, cIS_ACTIVE_DEFAULT_MASK, cIS_ACTIVE_DEFAULT_SHIFT);
}
Bool isActive(Datum datum) {
return (Bool) dd.getHi(datum, cIS_ACTIVE_MASK, cIS_ACTIVE_SHIFT);
}
Datum setIsActive(Datum datum, Bool isActive) {
return dd.setHi(datum, (Byte) isActive, cIS_ACTIVE_MASK, cIS_ACTIVE_SHIFT);
}
Datum resetIsActive(Datum datum) {
return setIsActive(datum, isActiveDefault(datum));
}
// Aux: executable
Bool isFinal(Datum datum) {
return (Bool) dd.getHi(datum, cIS_FINAL_MASK, cIS_FINAL_SHIFT);
}
Datum setIsFinal(Datum datum, Bool isFinal) {
return dd.setHi(datum, (Byte) isFinal, cIS_FINAL_MASK, cIS_FINAL_SHIFT);
}
// Common
Bool hasValue(Datum datum) {
return (Bool) dd.getHi(datum, cHAS_VALUE_MASK, cHAS_VALUE_SHIFT);
}
Byte getValue(Datum datum) {
return dd.getLo(datum);
}
Datum setValue(Datum datum, Byte value) {
datum = dd.setLo(datum, value);
datum = dd.setHi(datum, 0x1, cHAS_VALUE_MASK, cHAS_VALUE_SHIFT);
return datum;
}
Datum unsValue(Datum datum) {
datum = dd.setLo(datum, cNIL);
datum = dd.setHi(datum, 0x0, cHAS_VALUE_MASK, cHAS_VALUE_SHIFT);
return datum;
}
Integer getInteger(Datum datum) {
return dd.toInteger(getValue(datum));
}
Datum setInteger(Datum datum, Integer value) {
return setValue(datum, dd.fromInteger(value));
}
}