|
35 | 35 | #define REFVAR_VM_ARR_INT 9
|
36 | 36 | #define REFVAR_VM_HASH_STR_VAR 10
|
37 | 37 | #define REFVAR_STATIC_CODEREF 11
|
| 38 | +#define REFVAR_CLONED_CODEREF 12 |
38 | 39 |
|
39 | 40 | /* Cached type IDs. */
|
40 | 41 | static INTVAL smo_id = 0;
|
@@ -289,14 +290,17 @@ void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref) {
|
289 | 290 | discrim = REFVAR_VM_HASH_STR_VAR;
|
290 | 291 | }
|
291 | 292 | else if (ref->vtable->base_type == enum_class_Sub) {
|
292 |
| - /* Is it a static code reference? */ |
293 | 293 | PMC *code_sc = VTABLE_getprop(interp, ref, Parrot_str_new_constant(interp, "SC"));
|
294 | 294 | PMC *static_cr = VTABLE_getprop(interp, ref, Parrot_str_new_constant(interp, "STATIC_CODE_REF"));
|
295 | 295 | if (!PMC_IS_NULL(code_sc) && !PMC_IS_NULL(static_cr)) {
|
| 296 | + /* Static code reference. */ |
296 | 297 | discrim = REFVAR_STATIC_CODEREF;
|
297 | 298 | }
|
| 299 | + else if (!PMC_IS_NULL(code_sc)) { |
| 300 | + /* Closure, but already seen and serialization already handled. */ |
| 301 | + discrim = REFVAR_CLONED_CODEREF; |
| 302 | + } |
298 | 303 | else {
|
299 |
| - printf("WARNING: No closure serialization\n"); |
300 | 304 | Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
|
301 | 305 | "Serialization Error: Closure serializatin not yet implemented");
|
302 | 306 | }
|
@@ -342,6 +346,7 @@ void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref) {
|
342 | 346 | write_hash_str_var(interp, writer, ref);
|
343 | 347 | break;
|
344 | 348 | case REFVAR_STATIC_CODEREF:
|
| 349 | + case REFVAR_CLONED_CODEREF: |
345 | 350 | write_code_ref(interp, writer, ref);
|
346 | 351 | break;
|
347 | 352 | default:
|
@@ -845,6 +850,7 @@ PMC * read_ref_func(PARROT_INTERP, SerializationReader *reader) {
|
845 | 850 | case REFVAR_VM_HASH_STR_VAR:
|
846 | 851 | return read_hash_str_var(interp, reader);
|
847 | 852 | case REFVAR_STATIC_CODEREF:
|
| 853 | + case REFVAR_CLONED_CODEREF: |
848 | 854 | return read_code_ref(interp, reader);
|
849 | 855 | default:
|
850 | 856 | Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
|
|
0 commit comments