/* REVISIT_TODO Thu 12/01/2005
* Handle fixups
*/
- PTR_MethodTable parent( ReadPointerMaybeNull((MethodTable *) mt, &MethodTable::m_pParentMethodTable) );
+ PTR_MethodTable parent( mt->m_pParentMethodTable );
_ASSERTE(!CORCOMPILE_IS_POINTER_TAGGED(PTR_TO_TADDR(parent)));
return parent;
}
- PTR_MethodTable parent = ReadPointerMaybeNull((MethodTable *) mt, &MethodTable::m_pParentMethodTable);
+ PTR_MethodTable parent = mt->m_pParentMethodTable;
if( parent == NULL )
{
DisplayWriteFieldPointer( m_pParentMethodTable, NULL, MethodTable,
}
}
-/*static*/
-void Module::RestoreMethodTablePointer(PlainPointer<PTR_MethodTable> * ppMT,
- Module *pContainingModule,
- ClassLoadLevel level)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- if (ppMT->IsNull())
- return;
-
- if (ppMT->IsTagged())
- {
- RestoreMethodTablePointerRaw(ppMT->GetValuePtr(), pContainingModule, level);
- }
- else
- {
- ClassLoader::EnsureLoaded(ppMT->GetValue(), level);
- }
-}
-
#endif // !DACCESS_COMPILE
BOOL Module::IsZappedCode(PCODE code)
ClassLoadLevel level = CLASS_LOADED);
static void RestoreFieldDescPointer(RelativeFixupPointer<PTR_FieldDesc> * ppFD);
- static void RestoreMethodTablePointer(PlainPointer<PTR_MethodTable> * ppMT,
- Module *pContainingModule = NULL,
- ClassLoadLevel level = CLASS_LOADED);
-
static void RestoreModulePointer(RelativeFixupPointer<PTR_Module> * ppModule, Module *pContainingModule);
static PTR_Module RestoreModulePointerIfLoaded(DPTR(RelativeFixupPointer<PTR_Module>) ppModule, Module *pContainingModule);
LOG((LF_CLASSLOADER, LL_INFO1000, "GENERICS: Replaced approximate parent %s with exact parent %s from token %x\n", pParentMT->GetDebugClassName(), pNewParentMT->GetDebugClassName(), crExtends));
// SetParentMethodTable is not used here since we want to update the indirection cell in the NGen case
- if (pMT->GetParentMethodTablePlainOrRelativePointerPtr()->IsIndirectPtrMaybeNull())
- {
- *EnsureWritablePages(pMT->GetParentMethodTablePlainOrRelativePointerPtr()->GetValuePtr()) = pNewParentMT;
- }
- else
- {
- EnsureWritablePages(pMT->GetParentMethodTablePlainOrRelativePointerPtr());
- pMT->GetParentMethodTablePlainOrRelativePointerPtr()->SetValueMaybeNull(pNewParentMT);
- }
+ *EnsureWritablePages(pMT->GetParentMethodTablePtr()) = pNewParentMT;
pParentMT = pNewParentMT;
}
pMT->ClearFlag(MethodTable::enum_flag_IsZapped);
pMT->ClearFlag(MethodTable::enum_flag_IsPreRestored);
- pMT->m_pParentMethodTable.SetValueMaybeNull(NULL);
+ pMT->ClearFlag(MethodTable::enum_flag_HasIndirectParent);
// Non non-virtual slots
pMT->ClearFlag(MethodTable::enum_flag_HasSingleNonVirtualSlot);
if (pMT == pTargetMT)
return pObject;
- pMT = MethodTable::GetParentMethodTable(pMT);
+ pMT = MethodTable::GetParentMethodTableOrIndirection(pMT);
} while (pMT);
ENDFORBIDGC();
PRECONDITION(pObject->GetMethodTable() != pTargetMT);
} CONTRACTL_END;
- PTR_VOID pMT = MethodTable::GetParentMethodTable(pObject->GetMethodTable());
+ PTR_VOID pMT = MethodTable::GetParentMethodTableOrIndirection(pObject->GetMethodTable());
while (pMT)
{
if (pMT == pTargetMT)
return pObject;
- pMT = MethodTable::GetParentMethodTable(pMT);
+ pMT = MethodTable::GetParentMethodTableOrIndirection(pMT);
}
ENDFORBIDGC();
if (pMT == pTargetMT)
return pObject;
- pMT = MethodTable::GetParentMethodTable(pMT);
+ pMT = MethodTable::GetParentMethodTableOrIndirection(pMT);
} while (pMT);
if (!pObject->GetMethodTable()->HasTypeEquivalence())
if (pMT == pTargetMT)
return TypeHandle::CanCast;
- pMT = MethodTable::GetParentMethodTable(pMT);
+ pMT = MethodTable::GetParentMethodTableOrIndirection(pMT);
} while (pMT);
}
#endif // _DEBUG
MethodTable * pParentMT = GetParentMethodTable();
- _ASSERTE(!pNewMT->m_pParentMethodTable.IsIndirectPtrMaybeNull());
-
- ZapRelocationType relocType;
- if (decltype(MethodTable::m_pParentMethodTable)::isRelative)
- {
- relocType = IMAGE_REL_BASED_RELPTR;
- }
- else
- {
- relocType = IMAGE_REL_BASED_PTR;
- }
+ _ASSERTE(!pNewMT->GetFlag(enum_flag_HasIndirectParent));
if (pParentMT != NULL)
{
{
if (image->CanHardBindToZapModule(pParentMT->GetLoaderModule()))
{
- _ASSERTE(!m_pParentMethodTable.IsIndirectPtr());
- image->FixupField(this, offsetof(MethodTable, m_pParentMethodTable), pParentMT, 0, relocType);
+ image->FixupPointerField(this, offsetof(MethodTable, m_pParentMethodTable));
}
else
{
if (pImport != NULL)
{
- image->FixupFieldToNode(this, offsetof(MethodTable, m_pParentMethodTable), pImport, FIXUP_POINTER_INDIRECTION, relocType);
+ image->FixupFieldToNode(this, offsetof(MethodTable, m_pParentMethodTable), pImport, -(SSIZE_T)offsetof(MethodTable, m_pParentMethodTable));
+ pNewMT->SetFlag(enum_flag_HasIndirectParent);
}
}
//
// Restore parent method table
//
- Module::RestoreMethodTablePointer(&m_pParentMethodTable, GetLoaderModule(), CLASS_LOAD_APPROXPARENTS);
+ Module::RestoreMethodTablePointerRaw(GetParentMethodTablePtr(), GetLoaderModule(), CLASS_LOAD_APPROXPARENTS);
//
// Restore interface classes
if (!GetWriteableData_NoLogging()->IsParentMethodTablePointerValid())
return FALSE;
- TADDR base = dac_cast<TADDR>(this) + offsetof(MethodTable, m_pParentMethodTable);
- return !m_pParentMethodTable.IsTagged(base);
+ if (!GetFlag(enum_flag_HasIndirectParent))
+ {
+ return TRUE;
+ }
+ TADDR pMT;
+ pMT = *PTR_TADDR(m_pParentMethodTable + offsetof(MethodTable, m_pParentMethodTable));
+ return !CORCOMPILE_IS_POINTER_TAGGED(pMT);
}
#endif
// THE METHOD TABLE PARENT (SUPERCLASS/BASE CLASS)
//
-#if defined(PLATFORM_UNIX) && defined(_TARGET_ARM_)
- typedef RelativeFixupPointer<PTR_MethodTable> ParentMT_t;
-#else
- typedef PlainPointer<PTR_MethodTable> ParentMT_t;
-#endif
-
BOOL HasApproxParent()
{
LIMITED_METHOD_DAC_CONTRACT;
LIMITED_METHOD_DAC_CONTRACT;
PRECONDITION(IsParentMethodTablePointerValid());
- return ReadPointerMaybeNull(this, &MethodTable::m_pParentMethodTable);
+
+ TADDR pMT = m_pParentMethodTable;
+#ifdef FEATURE_PREJIT
+ if (GetFlag(enum_flag_HasIndirectParent))
+ pMT = *PTR_TADDR(m_pParentMethodTable + offsetof(MethodTable, m_pParentMethodTable));
+#endif
+ return PTR_MethodTable(pMT);
}
- inline static PTR_VOID GetParentMethodTable(PTR_VOID pMT)
+ inline static PTR_VOID GetParentMethodTableOrIndirection(PTR_VOID pMT)
{
- LIMITED_METHOD_DAC_CONTRACT;
-
- PTR_MethodTable pMethodTable = dac_cast<PTR_MethodTable>(pMT);
- return pMethodTable->GetParentMethodTable();
+ WRAPPER_NO_CONTRACT;
+ return PTR_VOID(*PTR_TADDR(dac_cast<TADDR>(pMT) + offsetof(MethodTable, m_pParentMethodTable)));
}
-#ifndef DACCESS_COMPILE
- inline ParentMT_t * GetParentMethodTablePlainOrRelativePointerPtr()
+ inline MethodTable ** GetParentMethodTablePtr()
{
- LIMITED_METHOD_CONTRACT;
- return &m_pParentMethodTable;
+ WRAPPER_NO_CONTRACT;
+
+#ifdef FEATURE_PREJIT
+ return GetFlag(enum_flag_HasIndirectParent) ?
+ (MethodTable **)(m_pParentMethodTable + offsetof(MethodTable, m_pParentMethodTable)) :(MethodTable **)&m_pParentMethodTable;
+#else
+ return (MethodTable **)&m_pParentMethodTable;
+#endif
}
-#endif // !DACCESS_COMPILE
// Is the parent method table pointer equal to the given argument?
BOOL ParentEquals(PTR_MethodTable pMT)
void SetParentMethodTable (MethodTable *pParentMethodTable)
{
LIMITED_METHOD_CONTRACT;
- PRECONDITION(!m_pParentMethodTable.IsIndirectPtrMaybeNull());
- m_pParentMethodTable.SetValueMaybeNull(pParentMethodTable);
+ PRECONDITION(!GetFlag(enum_flag_HasIndirectParent));
+ m_pParentMethodTable = (TADDR)pParentMethodTable;
#ifdef _DEBUG
GetWriteableDataForWrite_NoLogging()->SetParentMethodTablePointerValid();
#endif
// if enum_flag_enum_flag_HasIndirectParent is set. The indirection is offset by offsetof(MethodTable, m_pParentMethodTable).
// It allows casting helpers to go through parent chain natually. Casting helper do not need need the explicit check
// for enum_flag_HasIndirectParentMethodTable.
- ParentMT_t m_pParentMethodTable;
+ TADDR m_pParentMethodTable;
RelativePointer<PTR_Module> m_pLoaderModule; // LoaderModule. It is equal to the ZapModule in ngened images
// running into - attempting to get the class layout for all types at module load time.
// If we don't detect this the runtime will AV during the field iteration below. Feel
// free to eliminate this check when a more complete solution is available.
- if (typeHandle.AsMethodTable()->GetParentMethodTablePlainOrRelativePointerPtr()->IsTagged())
+ if (CORCOMPILE_IS_POINTER_TAGGED(*(typeHandle.AsMethodTable()->GetParentMethodTablePtr())))
{
return CORPROF_E_DATAINCOMPLETE;
}