예제 #1
0
static bool UserType( type_handle *th )
{
    unsigned            i;
    size_t              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) == 0 )
        return( false );
    if( ExprSP->th == NULL )
        return( false );
    DIPSymInfo( ExprSP->v.sh, ExprSP->lc, &info );
    if( info.kind != SK_TYPE )
        return( false );
    HDLAssign( type, th, ExprSP->th );
    return( true );
}
예제 #2
0
size_t QualifiedSymName( sym_handle *sh, char *name, size_t max, bool uniq )
{
    mod_handle  mod;
    size_t      name_len;
    size_t      len;
    size_t      rc;
    sym_info    sinfo;

    DIPSymInfo( sh, NULL, &sinfo );
    if( sinfo.is_global ) {
        len = 0;
    } else {
        mod = DIPSymMod( sh );
        name_len = DIPModName( mod, name, max );
        if( name_len < max ) {
            if( name != NULL ) {
                name += name_len;
                *name++ = '@';
                max -= name_len + 1;
            }
        }
        len = name_len + 1;
    }
    if( uniq && DIPSymName( sh, NULL, SN_DEMANGLED, NULL, 0 ) != 0 ) {
        if( name != NULL ) {
            *name++ = '`';
            max--;
        }
        len++;
        name_len = DIPSymName( sh, NULL, SN_OBJECT, name, max );
        len += name_len;
        if( name != NULL ) {
            name += name_len;
            *name++ = '`';
            *name = NULLCHAR;
            max -= name_len + 1;
        }
        len++;
    } else {
        rc = DIPSymName( sh, NULL, SN_SCOPED, name, max );
        if( rc == 0 ) {
            rc = DIPSymName( sh, NULL, SN_SOURCE, name, max );
        }
        len += rc;
    }
    return( len );
}
예제 #3
0
STATIC walk_result loadRoutineInfo( sym_walk_info swi, sym_handle *sym, void *_new_mod )
/**************************************************************************************/
{
    mod_info        *new_mod = _new_mod;
    sym_info        sinfo;
    file_info       *sym_file;
    rtn_info        *new_rtn;
    int             rtn_count;
    int             name_len;
    int             sym_size;
    int             demangle_type;

    if( swi != SWI_SYMBOL ) {
        return( WR_CONTINUE );
    }
    DIPSymInfo( sym, NULL, &sinfo );
    if( sinfo.kind != SK_CODE && sinfo.kind != SK_PROCEDURE ) {
        return( WR_CONTINUE );
    }
    sym_file = loadFileInfo( new_mod, sym );
    name_len = DIPSymName( sym, NULL, SN_DEMANGLED, NULL, 0 );
    if( name_len == 0 ) {
        name_len = DIPSymName( sym, NULL, SN_SOURCE, NULL, 0 );
        demangle_type = SN_SOURCE;
    } else {
        demangle_type = SN_DEMANGLED;
    }
    new_rtn = ProfCAlloc( sizeof( rtn_info ) + name_len );
    DIPSymName( sym, NULL, demangle_type, new_rtn->name, name_len + 1 );
    sym_size = DIPHandleSize( HK_SYM, false );
    new_rtn->sh = ProfAlloc( sym_size );
    memcpy( new_rtn->sh, sym, sym_size );
    rtn_count = sym_file->rtn_count;
    sym_file->rtn_count++;
    sym_file->routine = ProfRealloc( sym_file->routine, sym_file->rtn_count * sizeof( pointer ) );
    sym_file->routine[rtn_count] = new_rtn;
    return( WR_CONTINUE );
}
예제 #4
0
static ssl_value MechStack( unsigned select, ssl_value parm )
{
    ssl_value   result;
    stack_entry *entry;
    sym_info    info;

    result = 0;
    switch( select ) {
    case 0:
        SwapStack( SSL2INT( parm ) );
        break;
    case 1:
        MoveSP( SSL2INT( parm ) );
        break;
    case 2:
        entry = StkEntry( SSL2INT( parm ) );
        LValue( entry );
        result = TypeInfoToClass( &entry->ti ) & (BASE_TYPE | STK_UNSIGNED);
        break;
    case 3:
        ExprValue( StkEntry( SSL2INT( parm ) ) );
        break;
    case 4:
        LValue( StkEntry( SSL2INT( parm ) ) );
        break;
    case 5:
        RValue( StkEntry( SSL2INT( parm ) ) );
        break;
    case 6:
        LRValue( StkEntry( SSL2INT( parm ) ) );
        break;
    case 7:
        entry = StkEntry( SSL2INT( parm ) );
        LValue( entry );
        result = TI_CREATE( entry->ti.kind, TM_NONE, 0 );
        break;
    case 8:
        entry = StkEntry( SSL2INT( parm ) );
        NameResolve( entry, false );
        if( entry->flags & SF_SYM ) {
            DIPSymInfo( entry->v.sh, entry->lc, &info );
            result = info.kind;
        } else {
            result = SK_NONE;
        }
        break;
    case 9:
        entry = StkEntry( SSL2INT( parm ) );
        result = NameResolve( entry, false );
        break;
    case 10:
        entry = StkEntry( SSL2INT( 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 );
}