Ejemplo n.º 1
0
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 );
}
Ejemplo n.º 2
0
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 );
}
Ejemplo n.º 3
0
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 );
}
Ejemplo n.º 4
0
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 );
}