@@ -76,6 +76,7 @@ External links:
76
76
77
77
#include "julia.h"
78
78
#include "julia_internal.h"
79
+ #include "julia_gcext.h"
79
80
#include "builtin_proto.h"
80
81
#include "processor.h"
81
82
#include "serialize.h"
@@ -1248,6 +1249,9 @@ static void jl_write_values(jl_serializer_state *s) JL_GC_DISABLED
1248
1249
ios_write (s -> s , (char * )v , sizeof (void * ) + jl_string_len (v ));
1249
1250
write_uint8 (s -> s , '\0' ); // null-terminated strings for easier C-compatibility
1250
1251
}
1252
+ else if (jl_is_foreign_type (t ) == 1 ) {
1253
+ jl_error ("Cannot serialize instances of foreign datatypes" );
1254
+ }
1251
1255
else if (jl_datatype_nfields (t ) == 0 ) {
1252
1256
// The object has no fields, so we just snapshot its byte representation
1253
1257
assert (!t -> layout -> npointers );
@@ -1437,10 +1441,14 @@ static void jl_write_values(jl_serializer_state *s) JL_GC_DISABLED
1437
1441
if (dt -> layout != NULL ) {
1438
1442
size_t nf = dt -> layout -> nfields ;
1439
1443
size_t np = dt -> layout -> npointers ;
1440
- size_t fieldsize = jl_fielddesc_size (dt -> layout -> fielddesc_type );
1444
+ size_t fieldsize = 0 ;
1445
+ uint8_t is_foreign_type = dt -> layout -> fielddesc_type == 3 ;
1446
+ if (!is_foreign_type ) {
1447
+ fieldsize = jl_fielddesc_size (dt -> layout -> fielddesc_type );
1448
+ }
1441
1449
char * flddesc = (char * )dt -> layout ;
1442
1450
size_t fldsize = sizeof (jl_datatype_layout_t ) + nf * fieldsize ;
1443
- if (dt -> layout -> first_ptr != -1 )
1451
+ if (! is_foreign_type && dt -> layout -> first_ptr != -1 )
1444
1452
fldsize += np << dt -> layout -> fielddesc_type ;
1445
1453
uintptr_t layout = LLT_ALIGN (ios_pos (s -> const_data ), sizeof (void * ));
1446
1454
write_padding (s -> const_data , layout - ios_pos (s -> const_data )); // realign stream
@@ -1449,6 +1457,13 @@ static void jl_write_values(jl_serializer_state *s) JL_GC_DISABLED
1449
1457
arraylist_push (& s -> relocs_list , (void * )(reloc_offset + offsetof(jl_datatype_t , layout ))); // relocation location
1450
1458
arraylist_push (& s -> relocs_list , (void * )(((uintptr_t )ConstDataRef << RELOC_TAG_OFFSET ) + layout )); // relocation target
1451
1459
ios_write (s -> const_data , flddesc , fldsize );
1460
+ if (is_foreign_type ) {
1461
+ // make sure we have space for the extra hidden pointers
1462
+ // zero them since they will need to be re-initialized externally
1463
+ assert (fldsize == sizeof (jl_datatype_layout_t ));
1464
+ jl_fielddescdyn_t dyn = {0 , 0 };
1465
+ ios_write (s -> const_data , (char * )& dyn , sizeof (jl_fielddescdyn_t ));
1466
+ }
1452
1467
}
1453
1468
}
1454
1469
else if (jl_is_typename (v )) {
0 commit comments