static int ClassLattice::deriveHook( dr_sym_type, dr_handle handle, char * name, dr_handle inheritHandle, void * obj ) //------------------------------------------------------------------------- { ClassLattice * addnode; dr_access effAccess; dr_access access; dr_virtuality virtuality; ClassLattice * me = (ClassLattice *) obj; access = DRGetAccess( inheritHandle ); virtuality = DRGetVirtuality( inheritHandle ); if( access > me->_effAccess ) { effAccess = access; } else { effAccess = me->_effAccess; } addnode = me->joinTo( handle, virtuality, effAccess, me->_level + 1 ); if( addnode != NULL ) { WBRFree( name ); } else { addnode = me->newLattice( handle, me->_module, name, me->_flatClasses, access, (dr_virtuality) VIRT_NOT_SET, me->_level + 1 ); } DerivationPtr * ptr = me->ClassLattice::newPtr( addnode, access, virtuality ); me->_deriveds.add( ptr ); return TRUE; }
static int ClassLattice::baseHook( dr_sym_type, dr_handle handle, char * name, dr_handle inheritHandle, void * obj ) //---------------------------------------------------------------------------- { dr_access access; dr_access effAccess; dr_virtuality virtuality; ClassLattice * addnode = NULL; ClassLattice * me = (ClassLattice *) obj; access = DRGetAccess( inheritHandle ); virtuality = DRGetVirtuality( inheritHandle ); if( access > me->_effAccess ) { effAccess = access; } else { effAccess = me->_effAccess; } addnode = me->joinTo( handle, virtuality, effAccess, me->_level - 1 ); if( addnode != NULL ) { WBRFree( name ); } else { // NYI - _module isn't necessarily what we want it to be! addnode = me->newLattice( handle, me->_module, name, me->_flatClasses, effAccess, virtuality, me->_level - 1 ); } DerivationPtr * ptr = me->newPtr( addnode, access, virtuality ); me->_bases.add( ptr ); return TRUE; }
static bool AInherit( dr_handle inh, int index, void *_d ) /********************************************************/ { //TODO: Need to track virtual base as not to visit same place twice type_wlk_wlk *d = _d; bool cont; dr_handle btype; dr_handle old_inh; imp_sym_handle *is; dr_dbg_handle saved; walk_result wr; index = index; cont = TRUE; btype = DRGetTypeAT( inh ); btype = DRSkipTypeChain( btype ); /* skip modifiers and typedefs */ if( DRGetVirtuality( inh ) == DR_VIRTUALITY_VIRTUAL ) { if( !AddBase( btype, &d->com.vbase ) ) { return( cont ); } } is = d->is; SetSymHandle( (type_wlk *)d, is ); is->sym = inh; is->sclass = SYM_MEM; // treat inherit like a var saved = DRGetDebug(); wr = d->wk( d->com.ii, SWI_INHERIT_START, is, d->com.d ); DRSetDebug( saved ); if( wr == WR_CONTINUE ) { old_inh = d->com.inh; d->com.inh = inh; DRWalkStruct( btype, StrucWlk, d ); d->com.inh = old_inh; saved = DRGetDebug(); d->wk( d->com.ii, SWI_INHERIT_END, NULL, d->com.d ); DRSetDebug( saved ); if( d->wr != WR_CONTINUE ) { cont = FALSE; } } return( cont ); }
static bool AMemLookup( dr_handle var, int index, void *_d ) /**********************************************************/ { type_wlk_lookup *d = _d; imp_sym_handle *is; char *name; unsigned len; name = DRGetName( var ); if( name == NULL ) { DCStatus( DS_FAIL ); return( FALSE ); } len = strlen( name ); if( len == d->li->name.len && d->comp( name, d->li->name.start, len ) == 0 ) { is = DCSymCreate( d->com.ii, d->com.d ); SetSymHandle( (type_wlk *)d, is ); is->sym = var; switch( index ) { case 0: is->sclass = SYM_MEM; break; case 2: is->sclass = SYM_MEMVAR; // static member break; case 3: if( DRGetVirtuality( var ) == DR_VIRTUALITY_VIRTUAL ) { is->sclass = SYM_VIRTF; // virtual func } else if( !DRIsSymDefined( var ) ) { is->sclass = SYM_MEMF; // memfunc decl } else { is->sclass = SYM_MEMVAR; // inlined defn treat like a var } break; } d->sr = SR_EXACT; } DCFree( name ); return( TRUE ); }
static bool AInheritLookup( dr_handle inh, int index, void *_d ) /**************************************************************/ //Push inherit handle and search { type_wlk_lookup *d = _d; dr_handle btype; dr_handle old_inh; index = index; btype = DRGetTypeAT( inh ); btype = DRSkipTypeChain( btype ); /* skip modifiers and typedefs */ if( DRGetVirtuality( inh ) == DR_VIRTUALITY_VIRTUAL ) { if( !AddBase( btype, &d->com.vbase ) ) { return( TRUE ); } } old_inh = d->com.inh; d->com.inh = inh; DRWalkStruct( btype, StrucWlkLookup, d ); d->com.inh = old_inh; return( TRUE ); }
static bool AMem( dr_handle var, int index, void *_d ) /****************************************************/ { type_wlk_wlk *d = _d; bool cont; imp_sym_handle *is; dr_dbg_handle saved; cont = TRUE; is = d->is; SetSymHandle( (type_wlk *)d, is ); is->sym = var; switch( index ) { case 0: is->sclass = SYM_MEM; break; case 2: is->sclass = SYM_MEMVAR; // static member break; case 3: if( DRGetVirtuality( var ) == DR_VIRTUALITY_VIRTUAL ) { is->sclass = SYM_VIRTF; // virtual func } else if( !DRIsSymDefined( var ) ) { is->sclass = SYM_MEMF; // memfunc decl } else { is->sclass = SYM_MEMVAR; // inlined defn treat like a var } break; } saved = DRGetDebug(); d->wr = d->wk( d->com.ii, SWI_SYMBOL, is, d->com.d ); DRSetDebug( saved ); if( d->wr != WR_CONTINUE ) { cont = FALSE; } return( cont ); }