@@ -93,6 +93,7 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
93
93
{
94
94
static arraylist_t module_stack ;
95
95
static int initialized = 0 ;
96
+ static jl_module_t * outermost = NULL ;
96
97
if (!initialized ) {
97
98
arraylist_new (& module_stack , 0 );
98
99
initialized = 1 ;
@@ -145,6 +146,10 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
145
146
JL_GC_PUSH1 (& last_module );
146
147
jl_module_t * task_last_m = jl_current_task -> current_module ;
147
148
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 ;
148
153
149
154
jl_array_t * exprs = ((jl_expr_t * )jl_exprarg (ex , 2 ))-> args ;
150
155
JL_TRY {
@@ -157,11 +162,14 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
157
162
JL_CATCH {
158
163
jl_current_module = last_module ;
159
164
jl_current_task -> current_module = task_last_m ;
165
+ outermost = prev_outermost ;
166
+ module_stack .len = stackidx ;
160
167
jl_rethrow ();
161
168
}
162
169
JL_GC_POP ();
163
170
jl_current_module = last_module ;
164
171
jl_current_task -> current_module = task_last_m ;
172
+ outermost = prev_outermost ;
165
173
166
174
#if 0
167
175
// some optional post-processing steps
@@ -185,10 +193,13 @@ jl_value_t *jl_eval_module_expr(jl_expr_t *ex)
185
193
186
194
arraylist_push (& module_stack , newm );
187
195
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 ]);
191
200
}
201
+ assert (module_stack .len == l );
202
+ module_stack .len = stackidx ;
192
203
}
193
204
194
205
return jl_nothing ;
0 commit comments