Skip to content

Commit d7163da

Browse files
committed
Create single entry point for lowering jl_lower
and redirect all calls to lowering through it. `jl_fl_lower` is essentially a renamed `jl_expand_with_loc_warn`, but change the structure of the return value of its callee `jl-expand-to-thunk-warn` so we can ignore the warnings if they aren't relevant.
1 parent ff0a931 commit d7163da

File tree

5 files changed

+59
-67
lines changed

5 files changed

+59
-67
lines changed

src/ast.c

Lines changed: 45 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,95 +1278,88 @@ JL_DLLEXPORT jl_value_t *jl_macroexpand1(jl_value_t *expr, jl_module_t *inmodule
12781278
// Lower an expression tree into Julia's intermediate-representation.
12791279
JL_DLLEXPORT jl_value_t *jl_expand(jl_value_t *expr, jl_module_t *inmodule)
12801280
{
1281-
return jl_expand_with_loc(expr, inmodule, "none", 0);
1281+
return jl_lower(expr, inmodule, "none", 0, ~(size_t)0, 0, 0);
12821282
}
12831283

12841284
// Lowering, with starting program location specified
12851285
JL_DLLEXPORT jl_value_t *jl_expand_with_loc(jl_value_t *expr, jl_module_t *inmodule,
12861286
const char *file, int line)
12871287
{
1288-
return jl_expand_in_world(expr, inmodule, file, line, ~(size_t)0);
1288+
return jl_lower(expr, inmodule, file, line, ~(size_t)0, 0, 0);
12891289
}
12901290

12911291
// Lowering, with starting program location and worldage specified
12921292
JL_DLLEXPORT jl_value_t *jl_expand_in_world(jl_value_t *expr, jl_module_t *inmodule,
12931293
const char *file, int line, size_t world)
12941294
{
1295-
JL_TIMING(LOWERING, LOWERING);
1296-
jl_timing_show_location(file, line, inmodule, JL_TIMING_DEFAULT_BLOCK);
1297-
JL_GC_PUSH1(&expr);
1298-
expr = jl_copy_ast(expr);
1299-
expr = jl_expand_macros(expr, inmodule, NULL, 0, world, 1);
1300-
expr = jl_call_scm_on_ast_and_loc("jl-expand-to-thunk", expr, inmodule, file, line);
1301-
JL_GC_POP();
1302-
return expr;
1295+
return jl_lower(expr, inmodule, file, line, world, 0, 0);
13031296
}
13041297

1305-
// Same as the above, but printing warnings when applicable
1306-
JL_DLLEXPORT jl_value_t *jl_expand_with_loc_warn(jl_value_t *expr, jl_module_t *inmodule,
1307-
const char *file, int line)
1298+
// Main entry point to flisp lowering
1299+
// warn: Print any lowering warnings returned; otherwise ignore
1300+
// stmt: Lower knowing that the value of expr is unused
1301+
JL_DLLEXPORT jl_value_t *jl_fl_lower(jl_value_t *expr, jl_module_t *inmodule,
1302+
const char *file, int line, size_t world, bool_t warn, bool_t stmt)
13081303
{
13091304
JL_TIMING(LOWERING, LOWERING);
13101305
jl_timing_show_location(file, line, inmodule, JL_TIMING_DEFAULT_BLOCK);
13111306
jl_array_t *kwargs = NULL;
1312-
JL_GC_PUSH2(&expr, &kwargs);
1307+
JL_GC_PUSH3(&expr, &kwargs, &inmodule);
13131308
expr = jl_copy_ast(expr);
1314-
expr = jl_expand_macros(expr, inmodule, NULL, 0, ~(size_t)0, 1);
1309+
expr = jl_expand_macros(expr, inmodule, NULL, 0, world, 1);
13151310
jl_ast_context_t *ctx = jl_ast_ctx_enter(inmodule);
13161311
fl_context_t *fl_ctx = &ctx->fl;
13171312
value_t arg = julia_to_scm(fl_ctx, expr);
1318-
value_t e = fl_applyn(fl_ctx, 4, symbol_value(symbol(fl_ctx, "jl-expand-to-thunk-warn")), arg,
1319-
symbol(fl_ctx, file), fixnum(line), fl_ctx->F);
1320-
expr = scm_to_julia(fl_ctx, e, inmodule);
1313+
value_t e = fl_applyn(fl_ctx, 4, symbol_value(symbol(fl_ctx, "jl-lower-to-thunk")), arg,
1314+
symbol(fl_ctx, file), fixnum(line), stmt ? fl_ctx->T : fl_ctx->F);
1315+
value_t lwr = car_(e);
1316+
value_t warnings = car_(cdr_(e));
1317+
expr = scm_to_julia(fl_ctx, lwr, inmodule);
13211318
jl_ast_ctx_leave(ctx);
13221319
jl_sym_t *warn_sym = jl_symbol("warn");
1323-
if (jl_is_expr(expr) && ((jl_expr_t*)expr)->head == warn_sym) {
1324-
size_t nargs = jl_expr_nargs(expr);
1325-
for (int i = 0; i < nargs - 1; i++) {
1326-
jl_value_t *warning = jl_exprarg(expr, i);
1327-
size_t nargs = 0;
1328-
if (jl_is_expr(warning) && ((jl_expr_t*)warning)->head == warn_sym)
1329-
nargs = jl_expr_nargs(warning);
1330-
int kwargs_len = (int)nargs - 6;
1331-
if (nargs < 6 || kwargs_len % 2 != 0) {
1332-
jl_error("julia-logmsg: bad argument list - expected "
1333-
":warn level (symbol) group (symbol) id file line msg . kwargs");
1334-
}
1335-
jl_value_t *level = jl_exprarg(warning, 0);
1336-
jl_value_t *group = jl_exprarg(warning, 1);
1337-
jl_value_t *id = jl_exprarg(warning, 2);
1338-
jl_value_t *file = jl_exprarg(warning, 3);
1339-
jl_value_t *line = jl_exprarg(warning, 4);
1340-
jl_value_t *msg = jl_exprarg(warning, 5);
1341-
kwargs = jl_alloc_vec_any(kwargs_len);
1342-
for (int i = 0; i < kwargs_len; ++i) {
1343-
jl_array_ptr_set(kwargs, i, jl_exprarg(warning, i + 6));
1344-
}
1345-
JL_TYPECHK(logmsg, long, level);
1346-
jl_log(jl_unbox_long(level), NULL, group, id, file, line, (jl_value_t*)kwargs, msg);
1320+
for (; warn && iscons(warnings); warnings = cdr_(warnings)) {
1321+
jl_value_t *warning = scm_to_julia(fl_ctx, car_(warnings), inmodule);
1322+
size_t nargs = 0;
1323+
if (jl_is_expr(warning) && ((jl_expr_t*)warning)->head == warn_sym)
1324+
nargs = jl_expr_nargs(warning);
1325+
int kwargs_len = (int)nargs - 6;
1326+
if (nargs < 6 || kwargs_len % 2 != 0) {
1327+
jl_error("julia-logmsg: bad argument list - expected "
1328+
":warn level (symbol) group (symbol) id file line msg . kwargs");
1329+
}
1330+
jl_value_t *level = jl_exprarg(warning, 0);
1331+
jl_value_t *group = jl_exprarg(warning, 1);
1332+
jl_value_t *id = jl_exprarg(warning, 2);
1333+
jl_value_t *file = jl_exprarg(warning, 3);
1334+
jl_value_t *line = jl_exprarg(warning, 4);
1335+
jl_value_t *msg = jl_exprarg(warning, 5);
1336+
kwargs = jl_alloc_vec_any(kwargs_len);
1337+
for (int i = 0; i < kwargs_len; ++i) {
1338+
jl_array_ptr_set(kwargs, i, jl_exprarg(warning, i + 6));
13471339
}
1348-
expr = jl_exprarg(expr, nargs - 1);
1340+
JL_TYPECHK(logmsg, long, level);
1341+
jl_log(jl_unbox_long(level), NULL, group, id, file, line, (jl_value_t*)kwargs, msg);
13491342
}
13501343
JL_GC_POP();
13511344
return expr;
13521345
}
13531346

1354-
// expand in a context where the expression value is unused
1347+
JL_DLLEXPORT jl_value_t *jl_lower(jl_value_t *expr, jl_module_t *inmodule,
1348+
const char *file, int line, size_t world, bool_t warn, bool_t stmt)
1349+
{
1350+
// TODO: Allow change of lowerer
1351+
return jl_fl_lower(expr, inmodule, file, line, world, warn, stmt);
1352+
}
1353+
13551354
JL_DLLEXPORT jl_value_t *jl_expand_stmt_with_loc(jl_value_t *expr, jl_module_t *inmodule,
13561355
const char *file, int line)
13571356
{
1358-
JL_TIMING(LOWERING, LOWERING);
1359-
JL_GC_PUSH1(&expr);
1360-
expr = jl_copy_ast(expr);
1361-
expr = jl_expand_macros(expr, inmodule, NULL, 0, ~(size_t)0, 1);
1362-
expr = jl_call_scm_on_ast_and_loc("jl-expand-to-thunk-stmt", expr, inmodule, file, line);
1363-
JL_GC_POP();
1364-
return expr;
1357+
return jl_lower(expr, inmodule, file, line, ~(size_t)0, 0, 1);
13651358
}
13661359

13671360
JL_DLLEXPORT jl_value_t *jl_expand_stmt(jl_value_t *expr, jl_module_t *inmodule)
13681361
{
1369-
return jl_expand_stmt_with_loc(expr, inmodule, "none", 0);
1362+
return jl_lower(expr, inmodule, "none", 0, ~(size_t)0, 0, 1);
13701363
}
13711364

13721365
jl_code_info_t *jl_outer_ctor_body(jl_value_t *thistype, size_t nfields, size_t nsparams, jl_module_t *inmodule, const char *file, int line)

src/jl_exported_funcs.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@
129129
XX(jl_expand_stmt) \
130130
XX(jl_expand_stmt_with_loc) \
131131
XX(jl_expand_with_loc) \
132-
XX(jl_expand_with_loc_warn) \
133132
XX(jl_field_index) \
134133
XX(jl_field_isdefined) \
135134
XX(jl_gc_add_finalizer) \
@@ -289,6 +288,7 @@
289288
XX(jl_load_dynamic_library) \
290289
XX(jl_load_file_string) \
291290
XX(jl_lookup_code_address) \
291+
XX(jl_lower) \
292292
XX(jl_lseek) \
293293
XX(jl_lstat) \
294294
XX(jl_macroexpand) \

src/jlfrontend.scm

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,11 @@
173173
`(block ,expr (null)))
174174
file line))
175175

176-
(define (jl-expand-to-thunk-warn expr file line stmt)
176+
;; Returns a list `(,lowered-code ,warnings) where
177+
;; - warnings (currently only ambiguous soft scope assignments) may be ignored,
178+
;; e.g. when running interactively
179+
;; - more items may be added to the list later
180+
(define (jl-lower-to-thunk expr file line stmt)
177181
(let ((warnings '()))
178182
(with-bindings
179183
;; Abuse scm_to_julia here to convert arguments to warn. This is meant for
@@ -186,13 +190,7 @@
186190
(let ((thunk (if stmt
187191
(expand-to-thunk-stmt- expr file line)
188192
(expand-to-thunk- expr file line))))
189-
(if (pair? warnings) `(warn ,@(reverse warnings) ,thunk) thunk)))))
190-
191-
(define (jl-expand-to-thunk expr file line)
192-
(expand-to-thunk- expr file line))
193-
194-
(define (jl-expand-to-thunk-stmt expr file line)
195-
(expand-to-thunk-stmt- expr file line))
193+
`(,thunk ,(reverse warnings))))))
196194

197195
(define (jl-expand-macroscope expr)
198196
(error-wrap (lambda ()

src/julia.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,8 +2260,9 @@ JL_DLLEXPORT jl_value_t *jl_parse_string(const char *text, size_t text_len,
22602260
JL_DLLEXPORT jl_value_t *jl_expand(jl_value_t *expr, jl_module_t *inmodule);
22612261
JL_DLLEXPORT jl_value_t *jl_expand_with_loc(jl_value_t *expr, jl_module_t *inmodule,
22622262
const char *file, int line);
2263-
JL_DLLEXPORT jl_value_t *jl_expand_with_loc_warn(jl_value_t *expr, jl_module_t *inmodule,
2264-
const char *file, int line);
2263+
JL_DLLEXPORT jl_value_t *jl_lower(jl_value_t *expr, jl_module_t *inmodule,
2264+
const char *file, int line, size_t world,
2265+
bool_t warn, bool_t stmt);
22652266
JL_DLLEXPORT jl_value_t *jl_expand_in_world(jl_value_t *expr, jl_module_t *inmodule,
22662267
const char *file, int line, size_t world);
22672268
JL_DLLEXPORT jl_value_t *jl_expand_stmt(jl_value_t *expr, jl_module_t *inmodule);

src/toplevel.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,7 @@ JL_DLLEXPORT jl_value_t *jl_toplevel_eval_flex(jl_module_t *JL_NONNULL m, jl_val
808808
size_t last_age = ct->world_age;
809809
if (!expanded && jl_needs_lowering(e)) {
810810
ct->world_age = jl_atomic_load_acquire(&jl_world_counter);
811-
ex = (jl_expr_t*)jl_expand_with_loc_warn(e, m, *toplevel_filename, *toplevel_lineno);
811+
ex = (jl_expr_t*)jl_lower(e, m, *toplevel_filename, *toplevel_lineno, ~(size_t)0, 1, 0);
812812
ct->world_age = last_age;
813813
}
814814
jl_sym_t *head = jl_is_expr(ex) ? ex->head : NULL;
@@ -972,7 +972,7 @@ JL_DLLEXPORT jl_value_t *jl_toplevel_eval_flex(jl_module_t *JL_NONNULL m, jl_val
972972
root = jl_array_ptr_ref(ex->args, i);
973973
if (jl_needs_lowering(root)) {
974974
ct->world_age = jl_atomic_load_acquire(&jl_world_counter);
975-
root = jl_expand_with_loc_warn(root, m, *toplevel_filename, *toplevel_lineno);
975+
root = jl_lower(root, m, *toplevel_filename, *toplevel_lineno, ~(size_t)0, 1, 0);
976976
}
977977
ct->world_age = jl_atomic_load_acquire(&jl_world_counter);
978978
res = jl_toplevel_eval_flex(m, root, fast, 1, toplevel_filename, toplevel_lineno);
@@ -1151,8 +1151,8 @@ static jl_value_t *jl_parse_eval_all(jl_module_t *module, jl_value_t *text,
11511151
continue;
11521152
}
11531153
ct->world_age = jl_atomic_load_relaxed(&jl_world_counter);
1154-
expression = jl_expand_with_loc_warn(expression, module,
1155-
jl_string_data(filename), lineno);
1154+
expression = jl_lower(expression, module,
1155+
jl_string_data(filename), lineno, ~(size_t)0, 1, 0);
11561156
ct->world_age = jl_atomic_load_relaxed(&jl_world_counter);
11571157
result = jl_toplevel_eval_flex(module, expression, 1, 1, &filename_str, &lineno);
11581158
}

0 commit comments

Comments
 (0)