@@ -24,11 +24,15 @@ static htable_t id_to_fptr;
24
24
static const ptrint_t LongSymbol_tag = 23 ;
25
25
static const ptrint_t LongTuple_tag = 24 ;
26
26
static const ptrint_t LongExpr_tag = 25 ;
27
+ static const ptrint_t LiteralVal_tag = 26 ;
27
28
static const ptrint_t Null_tag = 254 ;
28
29
static const ptrint_t BackRef_tag = 255 ;
29
30
30
31
static ptrint_t VALUE_TAGS ;
31
32
33
+ // pointers to non-AST-ish objects in a compressed tree
34
+ static jl_array_t * tree_literal_values = NULL ;
35
+
32
36
#define write_uint8 (s , n ) ios_putc((n), (s))
33
37
#define read_uint8 (s ) ((uint8_t)ios_getc(s))
34
38
#define write_int8 (s , n ) write_uint8(s, n)
@@ -67,17 +71,17 @@ static void write_as_tag(ios_t *s, uint8_t tag)
67
71
68
72
#define jl_serialize_value (s , v ) jl_serialize_value_(s,(jl_value_t*)(v))
69
73
70
- void jl_serialize_value_ (ios_t * s , jl_value_t * v );
74
+ static void jl_serialize_value_ (ios_t * s , jl_value_t * v );
71
75
72
- void jl_serialize_fptr (ios_t * s , void * fptr )
76
+ static void jl_serialize_fptr (ios_t * s , void * fptr )
73
77
{
74
78
void * * pbp = ptrhash_bp (& fptr_to_id , fptr );
75
79
if (* pbp == HT_NOTFOUND )
76
80
jl_error ("unknown function pointer" );
77
81
write_int32 (s , * (ptrint_t * )pbp );
78
82
}
79
83
80
- void jl_serialize_tag_type (ios_t * s , jl_value_t * v )
84
+ static void jl_serialize_tag_type (ios_t * s , jl_value_t * v )
81
85
{
82
86
if (jl_is_struct_type (v )) {
83
87
writetag (s , (jl_value_t * )jl_struct_kind );
@@ -119,7 +123,7 @@ void jl_serialize_tag_type(ios_t *s, jl_value_t *v)
119
123
}
120
124
}
121
125
122
- void jl_serialize_methlist (ios_t * s , jl_methlist_t * ml )
126
+ static void jl_serialize_methlist (ios_t * s , jl_methlist_t * ml )
123
127
{
124
128
while (ml != NULL ) {
125
129
jl_serialize_value (s , ml -> sig );
@@ -134,7 +138,7 @@ void jl_serialize_methlist(ios_t *s, jl_methlist_t *ml)
134
138
jl_serialize_value (s , NULL );
135
139
}
136
140
137
- void jl_serialize_typecache (ios_t * s , jl_typename_t * tn )
141
+ static void jl_serialize_typecache (ios_t * s , jl_typename_t * tn )
138
142
{
139
143
typekey_stack_t * tc = (typekey_stack_t * )tn -> cache ;
140
144
while (tc != NULL ) {
@@ -150,7 +154,27 @@ void jl_serialize_typecache(ios_t *s, jl_typename_t *tn)
150
154
jl_serialize_value (s , NULL );
151
155
}
152
156
153
- void jl_serialize_value_ (ios_t * s , jl_value_t * v )
157
+ static int is_ast_node (jl_value_t * v )
158
+ {
159
+ return jl_is_symbol (v ) || jl_is_expr (v ) ||
160
+ jl_typeis (v , jl_array_any_type ) ||
161
+ jl_is_tuple (v ) || jl_is_typevar (v ) ||
162
+ jl_is_symbolnode (v ) || jl_is_bool (v ) ||
163
+ jl_is_topnode (v ) || jl_is_quotenode (v ) || jl_is_gotonode (v ) ||
164
+ jl_is_labelnode (v ) || jl_is_linenode (v );
165
+ }
166
+
167
+ static int literal_val_id (jl_value_t * v )
168
+ {
169
+ for (int i = 0 ; i < jl_array_len (tree_literal_values ); i ++ ) {
170
+ if (jl_cellref (tree_literal_values ,i ) == v )
171
+ return i ;
172
+ }
173
+ jl_cell_1d_push (tree_literal_values , v );
174
+ return jl_array_len (tree_literal_values )- 1 ;
175
+ }
176
+
177
+ static void jl_serialize_value_ (ios_t * s , jl_value_t * v )
154
178
{
155
179
if (v == NULL ) {
156
180
write_uint8 (s , Null_tag );
@@ -163,13 +187,23 @@ void jl_serialize_value_(ios_t *s, jl_value_t *v)
163
187
return ;
164
188
}
165
189
166
- bp = ptrhash_bp (& backref_table , v );
167
- if (* bp != HT_NOTFOUND ) {
168
- write_uint8 (s , BackRef_tag );
169
- write_int32 (s , (ptrint_t )* bp );
170
- return ;
190
+ if (tree_literal_values ) {
191
+ // compressing tree
192
+ if (!is_ast_node (v )) {
193
+ writetag (s , (jl_value_t * )LiteralVal_tag );
194
+ write_int32 (s , literal_val_id (v ));
195
+ return ;
196
+ }
197
+ }
198
+ else {
199
+ bp = ptrhash_bp (& backref_table , v );
200
+ if (* bp != HT_NOTFOUND ) {
201
+ write_uint8 (s , BackRef_tag );
202
+ write_int32 (s , (ptrint_t )* bp );
203
+ return ;
204
+ }
205
+ ptrhash_put (& backref_table , v , (void * )(ptrint_t )ios_pos (s ));
171
206
}
172
- ptrhash_put (& backref_table , v , (void * )(ptrint_t )ios_pos (s ));
173
207
174
208
size_t i ;
175
209
if (jl_is_tuple (v )) {
@@ -254,7 +288,8 @@ void jl_serialize_value_(ios_t *s, jl_value_t *v)
254
288
jl_function_t * f = (jl_function_t * )v ;
255
289
jl_serialize_value (s , (jl_value_t * )f -> linfo );
256
290
jl_serialize_value (s , f -> env );
257
- if (f -> linfo && f -> linfo -> ast && jl_is_expr (f -> linfo -> ast ) &&
291
+ if (f -> linfo && f -> linfo -> ast &&
292
+ (jl_is_expr (f -> linfo -> ast ) || jl_is_tuple (f -> linfo -> ast )) &&
258
293
f -> fptr != & jl_trampoline ) {
259
294
write_int32 (s , 0 );
260
295
}
@@ -310,7 +345,7 @@ void jl_serialize_value_(ios_t *s, jl_value_t *v)
310
345
}
311
346
}
312
347
313
- void jl_serialize_module (ios_t * s , jl_module_t * m )
348
+ static void jl_serialize_module (ios_t * s , jl_module_t * m )
314
349
{
315
350
size_t i ;
316
351
void * * table = m -> bindings .table ;
@@ -336,8 +371,8 @@ void jl_serialize_module(ios_t *s, jl_module_t *m)
336
371
}
337
372
338
373
htable_t * jl_gc_get_finalizer_table ();
339
-
340
- void jl_serialize_finalizers (ios_t * s )
374
+ /*
375
+ static void jl_serialize_finalizers(ios_t *s)
341
376
{
342
377
htable_t *finalizer_table = jl_gc_get_finalizer_table();
343
378
int i;
@@ -349,12 +384,12 @@ void jl_serialize_finalizers(ios_t *s)
349
384
}
350
385
jl_serialize_value(s, NULL);
351
386
}
352
-
387
+ */
353
388
// --- deserialize ---
354
389
355
- jl_value_t * jl_deserialize_value (ios_t * s );
390
+ static jl_value_t * jl_deserialize_value (ios_t * s );
356
391
357
- jl_fptr_t jl_deserialize_fptr (ios_t * s )
392
+ static jl_fptr_t jl_deserialize_fptr (ios_t * s )
358
393
{
359
394
int fptr = read_int32 (s );
360
395
if (fptr == 0 )
@@ -365,7 +400,7 @@ jl_fptr_t jl_deserialize_fptr(ios_t *s)
365
400
return * (jl_fptr_t * )pbp ;
366
401
}
367
402
368
- jl_value_t * jl_deserialize_tag_type (ios_t * s , jl_struct_type_t * kind , int pos )
403
+ static jl_value_t * jl_deserialize_tag_type (ios_t * s , jl_struct_type_t * kind , int pos )
369
404
{
370
405
if (kind == jl_struct_kind ) {
371
406
jl_struct_type_t * st =
@@ -428,7 +463,7 @@ jl_value_t *jl_deserialize_tag_type(ios_t *s, jl_struct_type_t *kind, int pos)
428
463
return NULL ;
429
464
}
430
465
431
- jl_methlist_t * jl_deserialize_methlist (ios_t * s )
466
+ static jl_methlist_t * jl_deserialize_methlist (ios_t * s )
432
467
{
433
468
jl_methlist_t * ml = NULL ;
434
469
jl_methlist_t * * pnext = & ml ;
@@ -451,7 +486,7 @@ jl_methlist_t *jl_deserialize_methlist(ios_t *s)
451
486
return ml ;
452
487
}
453
488
454
- typekey_stack_t * jl_deserialize_typecache (ios_t * s )
489
+ static typekey_stack_t * jl_deserialize_typecache (ios_t * s )
455
490
{
456
491
typekey_stack_t * tk = NULL ;
457
492
typekey_stack_t * * pnext = & tk ;
@@ -480,7 +515,7 @@ typekey_stack_t *jl_deserialize_typecache(ios_t *s)
480
515
jl_struct_type_t * jl_idtable_type = NULL ;
481
516
void jl_idtable_rehash (jl_array_t * * pa , size_t newsz );
482
517
483
- jl_value_t * jl_deserialize_value (ios_t * s )
518
+ static jl_value_t * jl_deserialize_value (ios_t * s )
484
519
{
485
520
int pos = ios_pos (s );
486
521
int32_t tag = read_uint8 (s );
@@ -491,6 +526,7 @@ jl_value_t *jl_deserialize_value(ios_t *s)
491
526
return (jl_value_t * )ptrhash_get (& deser_tag , (void * )(ptrint_t )tag );
492
527
}
493
528
if (tag == BackRef_tag ) {
529
+ assert (tree_literal_values == NULL );
494
530
ptrint_t offs = read_int32 (s );
495
531
void * * bp = ptrhash_bp (& backref_table , (void * )(ptrint_t )offs );
496
532
assert (* bp != HT_NOTFOUND );
@@ -564,6 +600,9 @@ jl_value_t *jl_deserialize_value(ios_t *s)
564
600
}
565
601
return (jl_value_t * )e ;
566
602
}
603
+ else if (vtag == (jl_value_t * )LiteralVal_tag ) {
604
+ return jl_cellref (tree_literal_values , read_int32 (s ));
605
+ }
567
606
else if (vtag == (jl_value_t * )jl_typename_type ) {
568
607
jl_sym_t * name = (jl_sym_t * )jl_deserialize_value (s );
569
608
jl_typename_t * tn = jl_new_typename (name );
@@ -682,7 +721,7 @@ jl_value_t *jl_deserialize_value(ios_t *s)
682
721
return NULL ;
683
722
}
684
723
685
- void jl_deserialize_module (ios_t * s , jl_module_t * m )
724
+ static void jl_deserialize_module (ios_t * s , jl_module_t * m )
686
725
{
687
726
while (1 ) {
688
727
jl_value_t * name = jl_deserialize_value (s );
@@ -702,8 +741,8 @@ void jl_deserialize_module(ios_t *s, jl_module_t *m)
702
741
(jl_function_t * )jl_deserialize_value (s ));
703
742
}
704
743
}
705
-
706
- void jl_deserialize_finalizers (ios_t * s )
744
+ /*
745
+ static void jl_deserialize_finalizers(ios_t *s)
707
746
{
708
747
htable_t *finalizer_table = jl_gc_get_finalizer_table();
709
748
while (1) {
@@ -714,7 +753,7 @@ void jl_deserialize_finalizers(ios_t *s)
714
753
*bp = jl_deserialize_value(s);
715
754
}
716
755
}
717
-
756
+ */
718
757
// --- entry points ---
719
758
720
759
DLLEXPORT
@@ -822,6 +861,44 @@ void jl_restore_system_image(char *fname)
822
861
JL_GC_POP ();
823
862
}
824
863
864
+ DLLEXPORT
865
+ jl_value_t * jl_compress_ast (jl_value_t * ast , jl_array_t * vals )
866
+ {
867
+ ios_t dest ;
868
+ jl_ios_mem (& dest , 0 );
869
+ int en = jl_gc_is_enabled ();
870
+ jl_gc_disable ();
871
+
872
+ tree_literal_values = vals ;
873
+ jl_serialize_value (& dest , ast );
874
+ tree_literal_values = NULL ;
875
+
876
+ //ios_printf(ios_stderr, "%d bytes, %d values\n", dest.size, vals->length);
877
+
878
+ jl_value_t * v = (jl_value_t * )jl_takebuf_array (& dest );
879
+ if (en )
880
+ jl_gc_enable ();
881
+ return v ;
882
+ }
883
+
884
+ DLLEXPORT
885
+ jl_value_t * jl_uncompress_ast (jl_tuple_t * data )
886
+ {
887
+ jl_array_t * bytes = (jl_array_t * )jl_tupleref (data , 0 );
888
+ tree_literal_values = (jl_array_t * )jl_tupleref (data , 1 );
889
+ ios_t src ;
890
+ jl_ios_mem (& src , 0 );
891
+ ios_setbuf (& src , bytes -> data , bytes -> length , 0 );
892
+ src .size = bytes -> length ;
893
+ int en = jl_gc_is_enabled ();
894
+ jl_gc_disable ();
895
+ jl_value_t * v = jl_deserialize_value (& src );
896
+ if (en )
897
+ jl_gc_enable ();
898
+ tree_literal_values = NULL ;
899
+ return v ;
900
+ }
901
+
825
902
// --- init ---
826
903
827
904
void jl_init_serializer (void )
@@ -835,7 +912,8 @@ void jl_init_serializer(void)
835
912
void * tags [] = { jl_symbol_type , jl_tag_kind , jl_bits_kind , jl_struct_kind ,
836
913
jl_func_kind , jl_tuple_type , jl_array_type , jl_expr_type ,
837
914
(void * )LongSymbol_tag , (void * )LongTuple_tag ,
838
- (void * )LongExpr_tag , jl_intrinsic_type , jl_methtable_type ,
915
+ (void * )LongExpr_tag , (void * )LiteralVal_tag ,
916
+ jl_intrinsic_type , jl_methtable_type ,
839
917
jl_typename_type , jl_lambda_info_type , jl_tvar_type ,
840
918
841
919
jl_null , jl_any_type , jl_symbol ("Any" ),
0 commit comments