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 ); }
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 ); }
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 ); }
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 ); }