void CgDeclParms( // DEFINE ARGS FOR CURRENT FN IN CORRECT ORDER FN_CTL *fctl, // - current function control pointer SCOPE scope ) // - argument scope { SYMBOL curr; SYMBOL stop; SYMBOL *psym; // - addr[ parameter symbol ] TYPE fn_type; auto VSTK_CTL sym_stack; SYMBOL ret_sym; NAME ret_name; fn_type = FunctionDeclarationType( fctl->func->sym_type ); VstkOpen( &sym_stack, sizeof( SYMBOL ), 16 ); stop = ScopeOrderedStart( scope ); ret_name = CppSpecialName( SPECIAL_RETURN_VALUE ); ret_sym = NULL; curr = NULL; for(;;) { curr = ScopeOrderedNext( stop, curr ); if( curr == NULL ) break; if( ( curr->name != NULL ) && ( ret_name == curr->name->name ) ) { ret_sym = curr; } else { psym = VstkPush( &sym_stack ); *psym = curr; } } IbpDefineParms(); declareParameter( fctl->this_sym ); declareParameter( fctl->cdtor_sym ); declareParameter( ret_sym ); switch( PcCallImpl( fn_type ) ) { case CALL_IMPL_REV_CPP : case CALL_IMPL_REV_C : for(;;) { psym = VstkPop( &sym_stack ); if( psym == NULL ) break; declareParameter( *psym ); } break; case CALL_IMPL_CPP : case CALL_IMPL_C : case CALL_IMPL_ELL_CPP : case CALL_IMPL_ELL_C : { unsigned index; // - parameter index unsigned max_parms; // - # parameters SYMBOL *psym1; // - addr[ parameter symbol ] max_parms = VstkDimension( &sym_stack ); for( index = 0; index < max_parms; ++index ) { psym1 = VstkIndex( &sym_stack, index ); declareParameter( *psym1 ); } } break; } VstkClose( &sym_stack ); CGLastParm(); }
static void addDtorArgs( // ADD DTOR ARGUMENTS call_handle handle, // - call handle SYMBOL dtor, // - destructor cg_name var, // - destruction address unsigned cdtor ) // - CDTOR to be used { cg_name expr; // - expression for CDTOR expr = CGInteger( cdtor, TY_UNSIGNED ); switch( PcCallImpl( dtor->sym_type ) ) { case CALL_IMPL_REV_CPP : case CALL_IMPL_REV_C : addArgument( handle, var, TY_POINTER ); addArgument( handle, expr, TY_UNSIGNED ); break; default : addArgument( handle, expr, TY_UNSIGNED ); addArgument( handle, var, TY_POINTER ); break; } }
PTREE CallArgsArrange( // ARRANGE CALL ARGUMENTS TYPE ftype, // - function type PTREE callnode, // - node for call PTREE userargs, // - user arguments PTREE thisnode, // - this node PTREE cdtor, // - cdtor node (ignored when thisnode==NULL) PTREE retnnode ) // - return node (for struct return) { PTREE arglist; // - argument list under construction OMR return_kind; // - type of return if( thisnode != NULL ) { thisnode->flags |= PTF_ARG_THIS; } return_kind = ObjModelFunctionReturn( ftype ); switch( PcCallImpl( ftype ) ) { case CALL_IMPL_REV_C : return_kind = OMR_CLASS_VAL; // drops thru case CALL_IMPL_REV_CPP : arglist = insertCDtor( thisnode, cdtor ); arglist = insertCppRetnArg( arglist, retnnode, return_kind ); arglist = appendArg( userargs, arglist ); break; case CALL_IMPL_ELL_C : case CALL_IMPL_C : return_kind = OMR_CLASS_VAL; // drops thru case CALL_IMPL_ELL_CPP : case CALL_IMPL_CPP : arglist = insertCppRetnArg( userargs, retnnode, return_kind ); arglist = insertCDtor( arglist, cdtor ); arglist = insertArg( arglist, thisnode ); break; } callnode->u.subtree[1] = arglist; callnode = insertCppRetnCopy( callnode, retnnode, return_kind ); return callnode; }