@@ -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.
12791279JL_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
12851285JL_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
12921292JL_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+
13551354JL_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
13671360JL_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
13721365jl_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