@@ -116,29 +116,6 @@ static const uint8_t flisp_system_image[] = {
116
116
#include <julia_flisp.boot.inc>
117
117
};
118
118
119
- typedef struct _jl_ast_context_list_t {
120
- struct _jl_ast_context_list_t * next ;
121
- struct _jl_ast_context_list_t * * prev ;
122
- } jl_ast_context_list_t ;
123
-
124
- STATIC_INLINE void jl_ast_context_list_insert (jl_ast_context_list_t * * head ,
125
- jl_ast_context_list_t * node ) JL_NOTSAFEPOINT
126
- {
127
- jl_ast_context_list_t * next = * head ;
128
- if (next )
129
- next -> prev = & node -> next ;
130
- node -> next = next ;
131
- node -> prev = head ;
132
- * head = node ;
133
- }
134
-
135
- STATIC_INLINE void jl_ast_context_list_delete (jl_ast_context_list_t * node ) JL_NOTSAFEPOINT
136
- {
137
- if (node -> next )
138
- node -> next -> prev = node -> prev ;
139
- * node -> prev = node -> next ;
140
- }
141
-
142
119
typedef struct _jl_ast_context_t {
143
120
fl_context_t fl ;
144
121
fltype_t * jvtype ;
@@ -149,10 +126,8 @@ typedef struct _jl_ast_context_t {
149
126
value_t null_sym ;
150
127
value_t ssavalue_sym ;
151
128
value_t slot_sym ;
152
- jl_ast_context_list_t list ;
153
- int ref ;
154
- jl_task_t * task ; // the current owner (user) of this jl_ast_context_t
155
129
jl_module_t * module ; // context module for `current-julia-module-counter`
130
+ struct _jl_ast_context_t * next ; // invasive list pointer for getting free contexts
156
131
} jl_ast_context_t ;
157
132
158
133
static jl_ast_context_t jl_ast_main_ctx ;
@@ -162,20 +137,12 @@ jl_ast_context_t *jl_ast_ctx(fl_context_t *fl) JL_GLOBALLY_ROOTED JL_NOTSAFEPOIN
162
137
#else
163
138
#define jl_ast_ctx (fl_ctx ) container_of(fl_ctx, jl_ast_context_t, fl)
164
139
#endif
165
- #define jl_ast_context_list_item (node ) \
166
- container_of(node, jl_ast_context_t, list)
167
140
168
141
struct macroctx_stack {
169
142
jl_module_t * m ;
170
143
struct macroctx_stack * parent ;
171
144
};
172
145
173
- #define JL_AST_PRESERVE_PUSH (ctx , old , inmodule ) \
174
- jl_module_t *(old) = ctx->module; \
175
- ctx->module = (inmodule)
176
- #define JL_AST_PRESERVE_POP (ctx , old ) \
177
- ctx->module = (old)
178
-
179
146
static jl_value_t * scm_to_julia (fl_context_t * fl_ctx , value_t e , jl_module_t * mod );
180
147
static value_t julia_to_scm (fl_context_t * fl_ctx , jl_value_t * v );
181
148
static jl_value_t * jl_expand_macros (jl_value_t * expr , jl_module_t * inmodule , struct macroctx_stack * macroctx , int onelevel , size_t world , int throw_load_error );
@@ -235,9 +202,9 @@ static const builtinspec_t julia_flisp_ast_ext[] = {
235
202
{ NULL , NULL }
236
203
};
237
204
238
- static void jl_init_ast_ctx (jl_ast_context_t * ast_ctx ) JL_NOTSAFEPOINT
205
+ static void jl_init_ast_ctx (jl_ast_context_t * ctx ) JL_NOTSAFEPOINT
239
206
{
240
- fl_context_t * fl_ctx = & ast_ctx -> fl ;
207
+ fl_context_t * fl_ctx = & ctx -> fl ;
241
208
fl_init (fl_ctx , 4 * 1024 * 1024 );
242
209
243
210
if (fl_load_system_image_str (fl_ctx , (char * )flisp_system_image ,
@@ -247,7 +214,6 @@ static void jl_init_ast_ctx(jl_ast_context_t *ast_ctx) JL_NOTSAFEPOINT
247
214
248
215
fl_applyn (fl_ctx , 0 , symbol_value (symbol (fl_ctx , "__init_globals" )));
249
216
250
- jl_ast_context_t * ctx = jl_ast_ctx (fl_ctx );
251
217
ctx -> jvtype = define_opaque_type (fl_ctx -> jl_sym , sizeof (void * ), NULL , NULL );
252
218
assign_global_builtins (fl_ctx , julia_flisp_ast_ext );
253
219
ctx -> true_sym = symbol (fl_ctx , "true" );
@@ -256,76 +222,48 @@ static void jl_init_ast_ctx(jl_ast_context_t *ast_ctx) JL_NOTSAFEPOINT
256
222
ctx -> null_sym = symbol (fl_ctx , "null" );
257
223
ctx -> ssavalue_sym = symbol (fl_ctx , "ssavalue" );
258
224
ctx -> slot_sym = symbol (fl_ctx , "slot" );
259
- ctx -> task = NULL ;
260
225
ctx -> module = NULL ;
261
226
set (symbol (fl_ctx , "*scopewarn-opt*" ), fixnum (jl_options .warn_scope ));
262
227
}
263
228
264
229
// There should be no GC allocation while holding this lock
265
230
static uv_mutex_t flisp_lock ;
266
- static jl_ast_context_list_t * jl_ast_ctx_using = NULL ;
267
- static jl_ast_context_list_t * jl_ast_ctx_freed = NULL ;
231
+ static jl_ast_context_t * jl_ast_ctx_freed = NULL ;
268
232
269
- static jl_ast_context_t * jl_ast_ctx_enter (void ) JL_GLOBALLY_ROOTED JL_NOTSAFEPOINT
233
+ static jl_ast_context_t * jl_ast_ctx_enter (jl_module_t * m ) JL_GLOBALLY_ROOTED JL_NOTSAFEPOINT
270
234
{
271
- jl_task_t * ct = jl_current_task ;
272
235
JL_SIGATOMIC_BEGIN ();
273
236
uv_mutex_lock (& flisp_lock );
274
- jl_ast_context_list_t * node ;
275
- jl_ast_context_t * ctx ;
276
- // First check if the current task is using one of the contexts
277
- for (node = jl_ast_ctx_using ;node ;(node = node -> next )) {
278
- ctx = jl_ast_context_list_item (node );
279
- if (ctx -> task == ct ) {
280
- ctx -> ref ++ ;
281
- uv_mutex_unlock (& flisp_lock );
282
- return ctx ;
283
- }
284
- }
285
- // If not, grab one from the free list
286
- if ((node = jl_ast_ctx_freed )) {
287
- jl_ast_context_list_delete (node );
288
- jl_ast_context_list_insert (& jl_ast_ctx_using , node );
289
- ctx = jl_ast_context_list_item (node );
290
- ctx -> ref = 1 ;
291
- ctx -> task = ct ;
292
- ctx -> module = NULL ;
293
- uv_mutex_unlock (& flisp_lock );
294
- return ctx ;
237
+ jl_ast_context_t * ctx = jl_ast_ctx_freed ;
238
+ if (ctx != NULL ) {
239
+ jl_ast_ctx_freed = ctx -> next ;
240
+ ctx -> next = NULL ;
295
241
}
296
- // Construct a new one if we can't find any
297
- ctx = (jl_ast_context_t * )calloc (1 , sizeof (jl_ast_context_t ));
298
- ctx -> ref = 1 ;
299
- ctx -> task = ct ;
300
- node = & ctx -> list ;
301
- jl_ast_context_list_insert (& jl_ast_ctx_using , node );
302
242
uv_mutex_unlock (& flisp_lock );
303
- jl_init_ast_ctx (ctx );
243
+ if (ctx == NULL ) {
244
+ // Construct a new one if we can't find any
245
+ ctx = (jl_ast_context_t * )calloc (1 , sizeof (jl_ast_context_t ));
246
+ jl_init_ast_ctx (ctx );
247
+ }
248
+ ctx -> module = m ;
304
249
return ctx ;
305
250
}
306
251
307
252
static void jl_ast_ctx_leave (jl_ast_context_t * ctx )
308
253
{
309
- JL_SIGATOMIC_END ();
310
- if (-- ctx -> ref )
311
- return ;
312
254
uv_mutex_lock (& flisp_lock );
313
- ctx -> task = NULL ;
314
- jl_ast_context_list_t * node = & ctx -> list ;
315
- jl_ast_context_list_delete (node );
316
- jl_ast_context_list_insert (& jl_ast_ctx_freed , node );
255
+ ctx -> module = NULL ;
256
+ ctx -> next = jl_ast_ctx_freed ;
257
+ jl_ast_ctx_freed = ctx ;
317
258
uv_mutex_unlock (& flisp_lock );
259
+ JL_SIGATOMIC_END ();
318
260
}
319
261
320
262
void jl_init_flisp (void )
321
263
{
322
- jl_task_t * ct = jl_current_task ;
323
- if (jl_ast_ctx_using || jl_ast_ctx_freed )
264
+ if (jl_ast_ctx_freed )
324
265
return ;
325
266
uv_mutex_init (& flisp_lock );
326
- jl_ast_main_ctx .ref = 1 ;
327
- jl_ast_main_ctx .task = ct ;
328
- jl_ast_context_list_insert (& jl_ast_ctx_using , & jl_ast_main_ctx .list );
329
267
jl_init_ast_ctx (& jl_ast_main_ctx );
330
268
// To match the one in jl_ast_ctx_leave
331
269
JL_SIGATOMIC_BEGIN ();
@@ -432,33 +370,31 @@ JL_DLLEXPORT void jl_lisp_prompt(void)
432
370
// We don't have our signal handler registered in that case anyway...
433
371
JL_SIGATOMIC_BEGIN ();
434
372
jl_init_flisp ();
435
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
436
- JL_AST_PRESERVE_PUSH (ctx , old_roots , jl_main_module );
373
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (jl_main_module );
437
374
fl_context_t * fl_ctx = & ctx -> fl ;
438
375
fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , "__start" )), fl_cons (fl_ctx , fl_ctx -> NIL ,fl_ctx -> NIL ));
439
- JL_AST_PRESERVE_POP (ctx , old_roots );
440
376
jl_ast_ctx_leave (ctx );
441
377
}
442
378
443
379
JL_DLLEXPORT void fl_show_profile (void )
444
380
{
445
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
381
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
446
382
fl_context_t * fl_ctx = & ctx -> fl ;
447
383
fl_applyn (fl_ctx , 0 , symbol_value (symbol (fl_ctx , "show-profiles" )));
448
384
jl_ast_ctx_leave (ctx );
449
385
}
450
386
451
387
JL_DLLEXPORT void fl_clear_profile (void )
452
388
{
453
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
389
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
454
390
fl_context_t * fl_ctx = & ctx -> fl ;
455
391
fl_applyn (fl_ctx , 0 , symbol_value (symbol (fl_ctx , "clear-profiles" )));
456
392
jl_ast_ctx_leave (ctx );
457
393
}
458
394
459
395
JL_DLLEXPORT void fl_profile (const char * fname )
460
396
{
461
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
397
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
462
398
fl_context_t * fl_ctx = & ctx -> fl ;
463
399
fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , "profile-e" )), symbol (fl_ctx , fname ));
464
400
jl_ast_ctx_leave (ctx );
@@ -843,7 +779,7 @@ JL_DLLEXPORT jl_value_t *jl_fl_parse(const char *text, size_t text_len,
843
779
jl_error ("Parse `all`: offset not supported" );
844
780
}
845
781
846
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
782
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
847
783
fl_context_t * fl_ctx = & ctx -> fl ;
848
784
value_t fl_text = cvalue_static_cstrn (fl_ctx , text , text_len );
849
785
fl_gc_handle (fl_ctx , & fl_text );
@@ -881,14 +817,12 @@ JL_DLLEXPORT jl_value_t *jl_fl_parse(const char *text, size_t text_len,
881
817
// returns either an expression or a thunk
882
818
jl_value_t * jl_call_scm_on_ast (const char * funcname , jl_value_t * expr , jl_module_t * inmodule )
883
819
{
884
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
820
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (inmodule );
885
821
fl_context_t * fl_ctx = & ctx -> fl ;
886
- JL_AST_PRESERVE_PUSH (ctx , old_roots , inmodule );
887
822
value_t arg = julia_to_scm (fl_ctx , expr );
888
823
value_t e = fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , funcname )), arg );
889
824
jl_value_t * result = scm_to_julia (fl_ctx , e , inmodule );
890
825
JL_GC_PUSH1 (& result );
891
- JL_AST_PRESERVE_POP (ctx , old_roots );
892
826
jl_ast_ctx_leave (ctx );
893
827
JL_GC_POP ();
894
828
return result ;
@@ -897,15 +831,13 @@ jl_value_t *jl_call_scm_on_ast(const char *funcname, jl_value_t *expr, jl_module
897
831
static jl_value_t * jl_call_scm_on_ast_and_loc (const char * funcname , jl_value_t * expr ,
898
832
jl_module_t * inmodule , const char * file , int line )
899
833
{
900
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
834
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (inmodule );
901
835
fl_context_t * fl_ctx = & ctx -> fl ;
902
- JL_AST_PRESERVE_PUSH (ctx , old_roots , inmodule );
903
836
value_t arg = julia_to_scm (fl_ctx , expr );
904
837
value_t e = fl_applyn (fl_ctx , 3 , symbol_value (symbol (fl_ctx , funcname )), arg ,
905
838
symbol (fl_ctx , file ), fixnum (line ));
906
839
jl_value_t * result = scm_to_julia (fl_ctx , e , inmodule );
907
840
JL_GC_PUSH1 (& result );
908
- JL_AST_PRESERVE_POP (ctx , old_roots );
909
841
jl_ast_ctx_leave (ctx );
910
842
JL_GC_POP ();
911
843
return result ;
@@ -989,7 +921,7 @@ JL_DLLEXPORT jl_value_t *jl_copy_ast(jl_value_t *expr)
989
921
990
922
JL_DLLEXPORT int jl_is_operator (char * sym )
991
923
{
992
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
924
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
993
925
fl_context_t * fl_ctx = & ctx -> fl ;
994
926
int res = fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , "operator?" )), symbol (fl_ctx , sym )) == fl_ctx -> T ;
995
927
jl_ast_ctx_leave (ctx );
@@ -998,7 +930,7 @@ JL_DLLEXPORT int jl_is_operator(char *sym)
998
930
999
931
JL_DLLEXPORT int jl_is_unary_operator (char * sym )
1000
932
{
1001
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
933
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
1002
934
fl_context_t * fl_ctx = & ctx -> fl ;
1003
935
int res = fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , "unary-op?" )), symbol (fl_ctx , sym )) == fl_ctx -> T ;
1004
936
jl_ast_ctx_leave (ctx );
@@ -1007,7 +939,7 @@ JL_DLLEXPORT int jl_is_unary_operator(char *sym)
1007
939
1008
940
JL_DLLEXPORT int jl_is_unary_and_binary_operator (char * sym )
1009
941
{
1010
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
942
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
1011
943
fl_context_t * fl_ctx = & ctx -> fl ;
1012
944
int res = fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , "unary-and-binary-op?" )), symbol (fl_ctx , sym )) == fl_ctx -> T ;
1013
945
jl_ast_ctx_leave (ctx );
@@ -1016,7 +948,7 @@ JL_DLLEXPORT int jl_is_unary_and_binary_operator(char *sym)
1016
948
1017
949
JL_DLLEXPORT int jl_is_syntactic_operator (char * sym )
1018
950
{
1019
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
951
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
1020
952
fl_context_t * fl_ctx = & ctx -> fl ;
1021
953
int res = fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , "syntactic-op?" )), symbol (fl_ctx , sym )) == fl_ctx -> T ;
1022
954
jl_ast_ctx_leave (ctx );
@@ -1025,7 +957,7 @@ JL_DLLEXPORT int jl_is_syntactic_operator(char *sym)
1025
957
1026
958
JL_DLLEXPORT int jl_operator_precedence (char * sym )
1027
959
{
1028
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
960
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (NULL );
1029
961
fl_context_t * fl_ctx = & ctx -> fl ;
1030
962
int res = numval (fl_applyn (fl_ctx , 1 , symbol_value (symbol (fl_ctx , "operator-precedence" )), symbol (fl_ctx , sym )));
1031
963
jl_ast_ctx_leave (ctx );
@@ -1244,14 +1176,12 @@ JL_DLLEXPORT jl_value_t *jl_expand_with_loc_warn(jl_value_t *expr, jl_module_t *
1244
1176
JL_GC_PUSH2 (& expr , & kwargs );
1245
1177
expr = jl_copy_ast (expr );
1246
1178
expr = jl_expand_macros (expr , inmodule , NULL , 0 , ~(size_t )0 , 1 );
1247
- jl_ast_context_t * ctx = jl_ast_ctx_enter ();
1179
+ jl_ast_context_t * ctx = jl_ast_ctx_enter (inmodule );
1248
1180
fl_context_t * fl_ctx = & ctx -> fl ;
1249
- JL_AST_PRESERVE_PUSH (ctx , old_roots , inmodule );
1250
1181
value_t arg = julia_to_scm (fl_ctx , expr );
1251
1182
value_t e = fl_applyn (fl_ctx , 4 , symbol_value (symbol (fl_ctx , "jl-expand-to-thunk-warn" )), arg ,
1252
1183
symbol (fl_ctx , file ), fixnum (line ), fl_ctx -> F );
1253
1184
expr = scm_to_julia (fl_ctx , e , inmodule );
1254
- JL_AST_PRESERVE_POP (ctx , old_roots );
1255
1185
jl_ast_ctx_leave (ctx );
1256
1186
jl_sym_t * warn_sym = jl_symbol ("warn" );
1257
1187
if (jl_is_expr (expr ) && ((jl_expr_t * )expr )-> head == warn_sym ) {
0 commit comments