Skip to content

Commit 2ea450f

Browse files
committed
Introduce concept of a cloned code reference; this will be used when implementing closure serialization.
1 parent 7275a66 commit 2ea450f

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

src/6model/serialization.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#define REFVAR_VM_ARR_INT 9
3636
#define REFVAR_VM_HASH_STR_VAR 10
3737
#define REFVAR_STATIC_CODEREF 11
38+
#define REFVAR_CLONED_CODEREF 12
3839

3940
/* Cached type IDs. */
4041
static INTVAL smo_id = 0;
@@ -289,14 +290,17 @@ void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref) {
289290
discrim = REFVAR_VM_HASH_STR_VAR;
290291
}
291292
else if (ref->vtable->base_type == enum_class_Sub) {
292-
/* Is it a static code reference? */
293293
PMC *code_sc = VTABLE_getprop(interp, ref, Parrot_str_new_constant(interp, "SC"));
294294
PMC *static_cr = VTABLE_getprop(interp, ref, Parrot_str_new_constant(interp, "STATIC_CODE_REF"));
295295
if (!PMC_IS_NULL(code_sc) && !PMC_IS_NULL(static_cr)) {
296+
/* Static code reference. */
296297
discrim = REFVAR_STATIC_CODEREF;
297298
}
299+
else if (!PMC_IS_NULL(code_sc)) {
300+
/* Closure, but already seen and serialization already handled. */
301+
discrim = REFVAR_CLONED_CODEREF;
302+
}
298303
else {
299-
printf("WARNING: No closure serialization\n");
300304
Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
301305
"Serialization Error: Closure serializatin not yet implemented");
302306
}
@@ -342,6 +346,7 @@ void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref) {
342346
write_hash_str_var(interp, writer, ref);
343347
break;
344348
case REFVAR_STATIC_CODEREF:
349+
case REFVAR_CLONED_CODEREF:
345350
write_code_ref(interp, writer, ref);
346351
break;
347352
default:
@@ -845,6 +850,7 @@ PMC * read_ref_func(PARROT_INTERP, SerializationReader *reader) {
845850
case REFVAR_VM_HASH_STR_VAR:
846851
return read_hash_str_var(interp, reader);
847852
case REFVAR_STATIC_CODEREF:
853+
case REFVAR_CLONED_CODEREF:
848854
return read_code_ref(interp, reader);
849855
default:
850856
Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,

0 commit comments

Comments
 (0)