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