fe_attr FEAttr( CGSYM_HANDLE cgsym_handle ) /*****************************************/ { SYM_HANDLE sym_handle = (SYM_HANDLE)cgsym_handle; return( FESymAttr( SymGetPtr( sym_handle ) ) ); }
static int EndTry( void ) { int parent_scope; TREEPTR expr; TREEPTR func; TREEPTR tree; TYPEPTR typ; int expr_type; DropBreakLabel(); /* _leave jumps to this label */ parent_scope = BlockStack->parent_index; tree = LeafNode( OPR_TRY ); tree->op.st.try_index = BlockStack->try_index; tree->op.st.parent_scope = parent_scope; AddStmt( tree ); if( (CurToken == T__EXCEPT) || (CurToken == T___EXCEPT) ) { NextToken(); BlockStack->block_type = T__EXCEPT; BlockStack->break_label = NextLabel(); Jump( BlockStack->break_label ); DeadCode = 0; tree = LeafNode( OPR_EXCEPT ); tree->op.st.try_sym_handle = DummyTrySymbol(); tree->op.st.parent_scope = parent_scope; AddStmt( tree ); CompFlags.exception_filter_expr = 1; expr = RValue( BracketExpr() ); CompFlags.exception_filter_expr = 0; CompFlags.exception_handler = 1; typ = TypeOf( expr ); expr_type = DataTypeOf( typ ); if( expr_type != TYPE_VOID ) { if( expr_type > TYPE_ULONG ) { CErr1( ERR_EXPR_MUST_BE_INTEGRAL ); } } func = VarLeaf( SymGetPtr( SymExcept ), SymExcept ); func->op.opr = OPR_FUNCNAME; expr = ExprNode( NULL, OPR_PARM, expr ); expr->expr_type = typ; expr->op.result_type = typ; tree = ExprNode( func, OPR_CALL, expr ); tree->expr_type = GetType( TYPE_VOID ); AddStmt( tree ); return( 1 ); } else if( (CurToken == T__FINALLY) || (CurToken == T___FINALLY) ) { CompFlags.in_finally_block = 1; NextToken(); BlockStack->block_type = T__FINALLY; DeadCode = 0; tree = LeafNode( OPR_FINALLY ); tree->op.st.try_sym_handle = DummyTrySymbol(); tree->op.st.parent_scope = parent_scope; AddStmt( tree ); return( 1 ); } return( 0 ); }
char *FEName( CGSYM_HANDLE cgsym_handle ) /**** return unmangled names ***********/ { SYM_HANDLE sym_handle; SYMPTR sym; sym_handle = cgsym_handle; if( sym_handle == 0 ) return( "*** NULL ***" ); sym = SymGetPtr( sym_handle ); return( sym->name ); }
void GenFunctionNode( SYM_HANDLE sym_handle ) { TREEPTR tree; SYMPTR sym; tree = LeafNode( OPR_FUNCTION ); sym = SymGetPtr( sym_handle ); tree->op.func.sym_handle = sym_handle; tree->op.func.flags = FUNC_NONE; if( ( Toggles & TOGGLE_INLINE ) | ( sym->attrib & FLAG_INLINE ) ) { if( !sym->naked ) { if( strcmp( sym->name, "main" ) != 0 ) { tree->op.func.flags |= FUNC_OK_TO_INLINE; } } } tree->op.flags = OpFlags( sym->attrib ); tree->expr_type = sym->sym_type->object; // function return type AddStmt( tree ); // Evil, evil globals! But we need this for later lookups in cgen.c sym->u.func.start_of_func = LastStmt; CurFuncNode = tree; NodeCount = 0; }