@@ -1278,95 +1278,88 @@ JL_DLLEXPORT jl_value_t *jl_macroexpand1(jl_value_t *expr, jl_module_t *inmodule
1278
1278
// Lower an expression tree into Julia's intermediate-representation.
1279
1279
JL_DLLEXPORT jl_value_t * jl_expand (jl_value_t * expr , jl_module_t * inmodule )
1280
1280
{
1281
- return jl_expand_with_loc (expr , inmodule , "none" , 0 );
1281
+ return jl_lower (expr , inmodule , "none" , 0 , ~( size_t ) 0 , 0 , 0 );
1282
1282
}
1283
1283
1284
1284
// Lowering, with starting program location specified
1285
1285
JL_DLLEXPORT jl_value_t * jl_expand_with_loc (jl_value_t * expr , jl_module_t * inmodule ,
1286
1286
const char * file , int line )
1287
1287
{
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 );
1289
1289
}
1290
1290
1291
1291
// Lowering, with starting program location and worldage specified
1292
1292
JL_DLLEXPORT jl_value_t * jl_expand_in_world (jl_value_t * expr , jl_module_t * inmodule ,
1293
1293
const char * file , int line , size_t world )
1294
1294
{
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 );
1303
1296
}
1304
1297
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 )
1308
1303
{
1309
1304
JL_TIMING (LOWERING , LOWERING );
1310
1305
jl_timing_show_location (file , line , inmodule , JL_TIMING_DEFAULT_BLOCK );
1311
1306
jl_array_t * kwargs = NULL ;
1312
- JL_GC_PUSH2 (& expr , & kwargs );
1307
+ JL_GC_PUSH3 (& expr , & kwargs , & inmodule );
1313
1308
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 );
1315
1310
jl_ast_context_t * ctx = jl_ast_ctx_enter (inmodule );
1316
1311
fl_context_t * fl_ctx = & ctx -> fl ;
1317
1312
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 );
1321
1318
jl_ast_ctx_leave (ctx );
1322
1319
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 ));
1347
1339
}
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 );
1349
1342
}
1350
1343
JL_GC_POP ();
1351
1344
return expr ;
1352
1345
}
1353
1346
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
+
1355
1354
JL_DLLEXPORT jl_value_t * jl_expand_stmt_with_loc (jl_value_t * expr , jl_module_t * inmodule ,
1356
1355
const char * file , int line )
1357
1356
{
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 );
1365
1358
}
1366
1359
1367
1360
JL_DLLEXPORT jl_value_t * jl_expand_stmt (jl_value_t * expr , jl_module_t * inmodule )
1368
1361
{
1369
- return jl_expand_stmt_with_loc (expr , inmodule , "none" , 0 );
1362
+ return jl_lower (expr , inmodule , "none" , 0 , ~( size_t ) 0 , 0 , 1 );
1370
1363
}
1371
1364
1372
1365
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 )
0 commit comments