PTREE MakeDeleteCall( // MAKE A CALL TO 'OPERATOR DELETE' SYMBOL del_sym, // - symbol for 'op del' PTREE ptr, // - parm 1 for delete TYPE class_parm ) // - if non-NULL, use size as second parm { PTREE size_arg; // - size argument for call PTREE args; // - arguments for call PTREE expr; // - final expression arg_list *del_args; // - op del arguments del_args = SymFuncArgList( del_sym ); args = NULL; if( class_parm != NULL ) { size_arg = NodeOffset( class_parm->u.c.info->size ); size_arg = NodeConvert( del_args->type_list[1], size_arg ); args = NodeArgument( args, size_arg ); } ptr = NodeConvert( del_args->type_list[0], ptr ); args = NodeArgument( args, ptr ); expr = NodeMakeCall( del_sym, GetBasicType( TYP_VOID ), NULL ); expr = CallArgsArrange( del_sym->sym_type , expr , args , NULL , NULL , NULL ); return expr; }
PTREE RunTimeCall( // GENERATE A RUN-TIME CALL PARSE SUBTREE PTREE expr, // - expression for operands TYPE type, // - type for function return RTF code ) // - code for function { SYMBOL func; func = RunTimeCallSymbol( code ); DbgVerify( (PointerTypeEquivalent( type ) == NULL) == (PointerTypeEquivalent( SymFuncReturnType( func ) ) == NULL) , "RunTimeCall -- return type mismatch" ); return NodeMakeCall( func, type, expr ); }