@@ -145,21 +145,11 @@ originally built for Spacetime profiling, hence the odd name.
145
145
#define Reserved_hd (hd ) ((reserved_t)(Profinfo_hd(hd)))
146
146
#define Reserved_val (val ) ((reserved_t)(Profinfo_val(val)))
147
147
148
- #define Is_mixed_block_reserved (res ) (((reserved_t)(res)) > 0)
148
+ #define Is_mixed_block_reserved (res ) (((reserved_t)(res)) > 0)
149
149
150
- #ifdef NATIVE_CODE
151
- #define Scannable_wosize_val (val ) (Scannable_wosize_hd (Hd_val (val)))
152
- #define Reserved_mixed_block_scannable_wosize (sz ) (((mlsize_t)(sz)) + 1)
153
- #define Mixed_block_scannable_wosize_reserved_native (res ) (((reserved_t)(res)) - 1)
154
-
155
- Caml_inline mlsize_t Scannable_wosize_reserved (reserved_t res , mlsize_t sz ) {
156
- return
157
- Is_mixed_block_reserved (res )
158
- ? Mixed_block_scannable_wosize_reserved_native (res )
159
- : sz ;
160
- }
150
+ /* Native code versions of mixed block macros.
161
151
162
- /* The scannable size of a block is how many fields are values as opposed
152
+ The scannable size of a block is how many fields are values as opposed
163
153
to flat floats/ints/etc. This is different than the (normal) size of a
164
154
block for mixed blocks.
165
155
@@ -175,25 +165,61 @@ Caml_inline mlsize_t Scannable_wosize_reserved(reserved_t res, mlsize_t sz) {
175
165
Otherwise, the traversal could attempt to recursively descend into
176
166
a flat field, which could segfault (or worse).
177
167
*/
178
- Caml_inline mlsize_t Scannable_wosize_hd (header_t hd ) {
168
+
169
+ #define Scannable_wosize_val_native (val ) (Scannable_wosize_hd (Hd_val (val)))
170
+ #define Reserved_mixed_block_scannable_wosize_native (sz ) (((mlsize_t)(sz)) + 1)
171
+ #define Mixed_block_scannable_wosize_reserved_native (res ) \
172
+ (((reserved_t)(res)) - 1)
173
+
174
+ Caml_inline mlsize_t Scannable_wosize_reserved_native (reserved_t res ,
175
+ mlsize_t sz ) {
176
+ return
177
+ Is_mixed_block_reserved (res )
178
+ ? Mixed_block_scannable_wosize_reserved_native (res )
179
+ : sz ;
180
+ }
181
+
182
+ Caml_inline mlsize_t Scannable_wosize_hd_native (header_t hd ) {
179
183
reserved_t res = Reserved_hd (hd );
180
184
return
181
185
Is_mixed_block_reserved (res )
182
186
? Mixed_block_scannable_wosize_reserved_native (res )
183
187
: Wosize_hd (hd );
184
188
}
185
189
186
- #else
187
- #define Scannable_wosize_hd (val ) (Wosize_hd (val))
188
- #define Scannable_wosize_val (val ) (Wosize_hd (Hd_val (val)))
189
- #define Faux_mixed_block_sentinel ((reserved_t) 0xff)
190
+ /* Bytecode versions of mixed block macros.
190
191
191
- // In bytecode always use the size of the block as the scannable size
192
- Caml_inline mlsize_t Scannable_wosize_reserved (reserved_t res , mlsize_t size ) {
192
+ Bytecode always uses the size of the block as the scannable size. That's
193
+ because bytecode doesn't represent mixed records as mixed blocks. They're
194
+ "faux mixed blocks", which are regular blocks with a sentinel value set
195
+ in the header bits.
196
+ */
197
+
198
+ #define Scannable_wosize_hd_byte (hd ) (Wosize_hd (hd))
199
+ #define Scannable_wosize_val_byte (val ) (Wosize_hd (Hd_val (val)))
200
+ Caml_inline mlsize_t Scannable_wosize_reserved_byte (reserved_t res ,
201
+ mlsize_t size ) {
202
+ (void )res ;
193
203
return size ;
194
204
}
195
205
206
+ /* Users should specify whether they want to use the bytecode or native
207
+ versions of these macros. Internally to the runtime, the NATIVE_CODE
208
+ macro lets us make that determination, so we can define suffixless
209
+ versions of the mixed block macros.
210
+ */
211
+ #ifdef CAML_INTERNALS
212
+ #ifdef NATIVE_CODE
213
+ #define Scannable_wosize_reserved (r , s ) Scannable_wosize_reserved_native(r, s)
214
+ #define Scannable_wosize_hd (hd ) Scannable_wosize_hd_native(hd)
215
+ #define Scannable_wosize_val (val ) Scannable_wosize_val_native(val)
216
+ #else
217
+ #define Faux_mixed_block_sentinel ((reserved_t) 0xff)
218
+ #define Scannable_wosize_reserved (r , s ) Scannable_wosize_reserved_byte(r, s)
219
+ #define Scannable_wosize_hd (hd ) Scannable_wosize_hd_byte(hd)
220
+ #define Scannable_wosize_val (val ) Scannable_wosize_val_byte(val)
196
221
#endif // NATIVE_CODE
222
+ #endif // CAML_INTERNALS
197
223
198
224
#define Hd_val (val ) (((header_t *) (val)) [-1]) /* Also an l-value. */
199
225
#define Hd_op (op ) (Hd_val (op)) /* Also an l-value. */
0 commit comments