Skip to content

Commit 506ecbe

Browse files
JeffBezansontkelman
authored andcommitted
fix JuliaLang#9799, module init order
- still wait until outermost module finishes loading before running initializers, but run them innermost-first - allow a non-Main module to be the "outermost" module
1 parent aacc8fe commit 506ecbe

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/toplevel.c

+14-3
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
9393
{
9494
static arraylist_t module_stack;
9595
static int initialized=0;
96+
static jl_module_t *outermost = NULL;
9697
if (!initialized) {
9798
arraylist_new(&module_stack, 0);
9899
initialized = 1;
@@ -145,6 +146,10 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
145146
JL_GC_PUSH1(&last_module);
146147
jl_module_t *task_last_m = jl_current_task->current_module;
147148
jl_current_task->current_module = jl_current_module = newm;
149+
jl_module_t *prev_outermost = outermost;
150+
size_t stackidx = module_stack.len;
151+
if (outermost == NULL)
152+
outermost = newm;
148153

149154
jl_array_t *exprs = ((jl_expr_t*)jl_exprarg(ex, 2))->args;
150155
JL_TRY {
@@ -157,11 +162,14 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
157162
JL_CATCH {
158163
jl_current_module = last_module;
159164
jl_current_task->current_module = task_last_m;
165+
outermost = prev_outermost;
166+
module_stack.len = stackidx;
160167
jl_rethrow();
161168
}
162169
JL_GC_POP();
163170
jl_current_module = last_module;
164171
jl_current_task->current_module = task_last_m;
172+
outermost = prev_outermost;
165173

166174
#if 0
167175
// some optional post-processing steps
@@ -185,10 +193,13 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
185193

186194
arraylist_push(&module_stack, newm);
187195

188-
if (jl_current_module == jl_main_module) {
189-
while (module_stack.len > 0) {
190-
jl_module_load_time_initialize((jl_module_t *) arraylist_pop(&module_stack));
196+
if (outermost == NULL || jl_current_module == jl_main_module) {
197+
size_t i, l=module_stack.len;
198+
for(i = stackidx; i < l; i++) {
199+
jl_module_load_time_initialize((jl_module_t*)module_stack.items[i]);
191200
}
201+
assert(module_stack.len == l);
202+
module_stack.len = stackidx;
192203
}
193204

194205
return jl_nothing;

0 commit comments

Comments
 (0)