static bool UserType( type_handle *th ) { unsigned i; unsigned len; sym_info info; //NYI:begin temp if( ExprSP->flags & SF_NAME ) { static const char * const TagIds[] = { "struct", "class", "union", "enum", NULL }; ExprSP->v.li.type = ST_TYPE; for( i = 0; TagIds[i] != NULL; ++i ) { len = strlen( TagIds[i] ); if( len == ExprSP->v.li.name.len && memcmp( ExprSP->v.li.name.start, TagIds[i], len ) == 0 ) { ExprSP->v.li.type = ST_STRUCT_TAG + i; ExprSP->v.li.name.start = NamePos(); ExprSP->v.li.name.len = NameLen(); Scan(); } } } //NYI: end temp NameResolve( ExprSP, TRUE ); if( !(ExprSP->flags & SF_SYM) ) return( FALSE ); if( ExprSP->th == NULL ) return( FALSE ); SymInfo( ExprSP->v.sh, ExprSP->lc, &info ); if( info.kind != SK_TYPE ) return( FALSE ); HDLAssign( type, th, ExprSP->th ); return( TRUE ); }
void LValue( stack_entry *entry ) { if( !NameResolve( entry, FALSE ) ) { Error( ERR_NONE, LIT( ERR_UNKNOWN_SYMBOL ), entry->v.li.name.start, entry->v.li.name.len ); } SymResolve( entry ); GetTrueEntry( entry ); }
static bool DoNameResolve( stack_entry *entry ) { unsigned_64 val; if( NameResolve( entry, FALSE ) ) return( TRUE ); /* check for raw name */ if( entry->lc->sh != NULL ) return( FALSE ); if( entry->lc->th != NULL ) return( FALSE ); if( entry->v.li.mod != NO_MOD ) return( FALSE ); if( entry->v.li.file_scope ) return( FALSE ); if( entry->v.li.type != ST_NONE ) return( FALSE ); if( entry->v.li.scope.start != NULL ) return( FALSE ); if( !ForceSym2Num( entry->v.li.name.start, entry->v.li.name.len, &val ) ) return( FALSE ); entry->v.uint = val; ClassNum( entry ); return( TRUE ); }
static unsigned MechStack( unsigned select, unsigned parm ) { unsigned result = 0; stack_entry *entry; sym_info info; switch( select ) { case 0: SwapStack( parm ); break; case 1: MoveSP( parm ); break; case 2: entry = StkEntry( parm ); LValue( entry ); result = TypeInfoToClass( &entry->info ) & (BASE_TYPE | STK_UNSIGNED); break; case 3: ExprValue( StkEntry( parm ) ); break; case 4: LValue( StkEntry( parm ) ); break; case 5: RValue( StkEntry( parm ) ); break; case 6: LRValue( StkEntry( parm ) ); break; case 7: entry = StkEntry( parm ); LValue( entry ); result = TI_CREATE( entry->info.kind, TM_NONE, 0 ); break; case 8: entry = StkEntry( parm ); NameResolve( entry, FALSE ); if( entry->flags & SF_SYM ) { SymInfo( entry->v.sh, entry->lc, &info ); result = info.kind; } else { result = SK_NONE; } break; case 9: entry = StkEntry( parm ); result = NameResolve( entry, FALSE ); break; case 10: entry = StkEntry( parm ); if( entry->flags & SF_NAME ) { result = 0; } else if( entry->flags & SF_SYM ) { result = 1; } else if( entry->flags & SF_LOCATION ) { result = 2; } else { result = 3; } break; } return( result ); }