static TYPE makePointerToModType( // MAKE POINTER TO [OPTIONALLY MODIFIED] TYPE TYPE type, // - base type type_flag flags ) // - flags { if( flags != 0 ) { type = MakeModifiedType( type, flags ); } return( MakePointerTo( type ) ); }
static TYPE augmentWithNear( // AUGMENT TYPE WITH TF1_NEAR, IF REQ'D TYPE type ) // - type to be augmented { type_flag flags; // - existing flags TypeGetActualFlags( type, &flags ); if( 0 == ( flags & TF1_MEM_MODEL ) ) { type = MakeModifiedType( type, TF1_NEAR ); } return( type ); }
TYPE TypeThisSymbol( // GET TYPE OF THIS FOR SYMBOL MEMBER SYMBOL sym, // - symbol bool reference ) // - use reference? { TYPE base; // - return: NULL or TYPE of "this" for symbol type_flag flags; // - flags for "this" pointer base = getThisBaseType( sym ); if( base != NULL ) { flags = FunctionThisFlags( sym ); base = MakeModifiedType( base, flags ); if( reference ) { base = MakeReferenceTo( base ); } else { base = MakePointerTo( base ); } base = MakeModifiedType( base, TF1_CONST ); } return( base ); }
SYMBOL StaticInitSymbol( // CREATE STATIC INITIALIZATION SYMBOL SYMBOL sym ) // - symbol type { TYPE type; // - type for symbol type_flag flags; // - modifier flags type = sym->sym_type; TypeModFlags( type, &flags ); if(( flags & TF1_CONST ) == 0 ) { /* make it a constant symbol */ type = MakeModifiedType( type, TF1_CONST ); } return SymCreateTempScope( type , SC_STATIC , SF_REFERENCED , CppStaticInitName( sym ) ); }
static boolean convertEllipsisArg(// CONVERT AN ELLIPSIS (...) ARGUMENT PTREE arg ) // - argument { boolean retn; // - return: TRUE ==> ok PTREE right; // - argument PTREE afun; // - &[ function ] TYPE type; // - node type switch( NodeAddrOfFun( PTreeOpRight( arg ), &afun ) ) { case ADDR_FN_MANY : case ADDR_FN_MANY_USED : PTreeErrorExpr( arg->u.subtree[1], ERR_ELLIPSE_ADDR_OVERLOAD ); retn = FALSE; break; default : right = NodeRvalue( arg->u.subtree[1] ); arg->u.subtree[1] = right; type = TypedefModifierRemove( right->type ); switch( type->id ) { case TYP_CHAR : case TYP_SCHAR : case TYP_UCHAR : case TYP_SSHORT : case TYP_WCHAR : case TYP_USHORT : type = TypeUnArithResult( type ); right = NodeConvert( type, right ); arg_finish( right, arg ); retn = TRUE; break; case TYP_FLOAT : type = GetBasicType( TYP_DOUBLE ); right = NodeConvert( type, right ); arg_finish( right, arg ); retn = TRUE; break; case TYP_ARRAY : type = PointerTypeForArray( right->type ); right = NodeConvert( type, right ); arg_finish( right, arg ); retn = TRUE; break; case TYP_MEMBER_POINTER : ConvertMembPtrConst( &arg->u.subtree[1] ); arg_fillout( arg ); retn = TRUE; break; case TYP_POINTER : if( NULL == FunctionDeclarationType( type->of ) ) { type_flag def_flags; type_flag act_flags; type_flag arg_flags; TYPE base_type; PTREE cnv; base_type = TypeGetActualFlags( type->of, &arg_flags ); act_flags = arg_flags & TF1_MEM_MODEL; def_flags = DefaultMemoryFlag( type->of ); if( ( ( def_flags & TF1_FAR ) &&( act_flags != TF1_HUGE ) &&( act_flags != TF1_FAR ) ) ||( ( def_flags & TF1_HUGE ) &&( act_flags != TF1_HUGE ) ) ) { type = MakeModifiedType( base_type , ( arg_flags & ~TF1_MEM_MODEL ) | def_flags ); type = MakePointerTo( type ); cnv = CastImplicit( arg->u.subtree[1] , type , CNV_EXPR , NULL ); arg->u.subtree[1] = cnv; DbgVerify( PT_ERROR != cnv->op , "convertEllipsisArg -- failed ptr.cnv" ); arg_fillout( arg ); retn = TRUE; } else { arg_fillout( arg ); retn = TRUE; } } else { arg_fillout( arg ); retn = TRUE; } break; case TYP_CLASS : retn = passStructOnStack( arg, WARN_ELLIPSIS_CLASS_ARG ); break; default : arg_fillout( arg ); retn = TRUE; break; } break; } return retn; }