Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ int IXCLRDataAppDomain.IsSameObject(IXCLRDataAppDomain* appDomain)
return hr;
}

int IXCLRDataAppDomain.GetManagedObject(/*IXCLRDataValue*/ void** value)
int IXCLRDataAppDomain.GetManagedObject(DacComNullableByRef<IXCLRDataValue> value)
=> _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL;

int IXCLRDataAppDomain.Request(uint reqCode, uint inBufferSize, byte* inBuffer, uint outBufferSize, byte* outBuffer)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ int IXCLRDataFrame.GetNumArguments(uint* numArgs)

int IXCLRDataFrame.GetArgumentByIndex(
uint index,
void** arg,
DacComNullableByRef<IXCLRDataValue> arg,
uint bufLen,
uint* nameLen,
char* name)
Expand Down Expand Up @@ -172,7 +172,7 @@ int IXCLRDataFrame.GetNumLocalVariables(uint* numLocals)

int IXCLRDataFrame.GetLocalVariableByIndex(
uint index,
void** localVariable,
DacComNullableByRef<IXCLRDataValue> localVariable,
uint bufLen,
uint* nameLen,
char* name)
Expand All @@ -185,16 +185,17 @@ int IXCLRDataFrame.GetCodeName(
char* nameBuf)
=> _legacyImpl is not null ? _legacyImpl.GetCodeName(flags, bufLen, nameLen, nameBuf) : HResults.E_NOTIMPL;

int IXCLRDataFrame.GetMethodInstance(out IXCLRDataMethodInstance? method)
int IXCLRDataFrame.GetMethodInstance(DacComNullableByRef<IXCLRDataMethodInstance> method)
{
int hr = HResults.S_OK;
method = null;

int hrLocal = HResults.S_OK;
IXCLRDataMethodInstance? legacyMethod = null;
if (_legacyImpl is not null)
{
hrLocal = _legacyImpl.GetMethodInstance(out legacyMethod);
DacComNullableByRef<IXCLRDataMethodInstance> legacyMethodOut = new(isNullRef: false);
hrLocal = _legacyImpl.GetMethodInstance(legacyMethodOut);
legacyMethod = legacyMethodOut.Interface;
}

try
Expand All @@ -211,7 +212,7 @@ int IXCLRDataFrame.GetMethodInstance(out IXCLRDataMethodInstance? method)
TargetPointer appDomain = _target.ReadPointer(
_target.ReadGlobalPointer(Constants.Globals.AppDomain));

method = new ClrDataMethodInstance(_target, mdh, appDomain, legacyMethod);
method.Interface = new ClrDataMethodInstance(_target, mdh, appDomain, legacyMethod);
}
catch (System.Exception ex)
{
Expand Down Expand Up @@ -239,10 +240,10 @@ int IXCLRDataFrame.Request(
int IXCLRDataFrame.GetNumTypeArguments(uint* numTypeArgs)
=> _legacyImpl is not null ? _legacyImpl.GetNumTypeArguments(numTypeArgs) : HResults.E_NOTIMPL;

int IXCLRDataFrame.GetTypeArgumentByIndex(uint index, void** typeArg)
int IXCLRDataFrame.GetTypeArgumentByIndex(uint index, DacComNullableByRef<IXCLRDataTypeInstance> typeArg)
=> _legacyImpl is not null ? _legacyImpl.GetTypeArgumentByIndex(index, typeArg) : HResults.E_NOTIMPL;

// IXCLRDataFrame2 implementation
int IXCLRDataFrame2.GetExactGenericArgsToken(void** genericToken)
int IXCLRDataFrame2.GetExactGenericArgsToken(DacComNullableByRef<IXCLRDataValue> genericToken)
=> _legacyImpl2 is not null ? _legacyImpl2.GetExactGenericArgsToken(genericToken) : HResults.E_NOTIMPL;
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,15 @@ public ClrDataMethodInstance(
_legacyImpl = legacyImpl;
}

int IXCLRDataMethodInstance.GetTypeInstance(void** typeInstance)
int IXCLRDataMethodInstance.GetTypeInstance(DacComNullableByRef<IXCLRDataTypeInstance> typeInstance)
=> _legacyImpl is not null ? _legacyImpl.GetTypeInstance(typeInstance) : HResults.E_NOTIMPL;

int IXCLRDataMethodInstance.GetDefinition(void** methodDefinition)
int IXCLRDataMethodInstance.GetDefinition(DacComNullableByRef<IXCLRDataMethodDefinition> methodDefinition)
=> _legacyImpl is not null ? _legacyImpl.GetDefinition(methodDefinition) : HResults.E_NOTIMPL;

int IXCLRDataMethodInstance.GetTokenAndScope(uint* token, void** /*IXCLRDataModule*/ mod)
int IXCLRDataMethodInstance.GetTokenAndScope(uint* token, DacComNullableByRef<IXCLRDataModule> mod)
{
int hr = HResults.S_OK;
StrategyBasedComWrappers cw = new();

try
{
Expand All @@ -51,31 +50,22 @@ int IXCLRDataMethodInstance.GetTokenAndScope(uint* token, void** /*IXCLRDataModu
{
*token = rts.GetMethodToken(_methodDesc);
}
if (mod is not null)
if (!mod.IsNullRef)
{
IXCLRDataModule? legacyMod = null;
if (_legacyImpl is not null)
{
void* legacyModPtr = null;
int hrLegacy = _legacyImpl.GetTokenAndScope(token, &legacyModPtr);
DacComNullableByRef<IXCLRDataModule> legacyModOut = new(isNullRef: false);
int hrLegacy = _legacyImpl.GetTokenAndScope(token, legacyModOut);
if (hrLegacy < 0)
return hrLegacy;
object obj = cw.GetOrCreateObjectForComInstance((nint)legacyModPtr, CreateObjectFlags.None);
if (obj is not IXCLRDataModule)
{
throw new ArgumentException("Invalid module object", nameof(mod));
}
legacyMod = obj as IXCLRDataModule;
legacyMod = legacyModOut.Interface;
}

TargetPointer mtAddr = rts.GetMethodTable(_methodDesc);
TypeHandle mainMT = rts.GetTypeHandle(mtAddr);
TargetPointer module = rts.GetModule(mainMT);
IXCLRDataModule modImpl = new ClrDataModule(module, _target, legacyMod);
nint modImplPtr = cw.GetOrCreateComInterfaceForObject(modImpl, CreateComInterfaceFlags.None);
Marshal.QueryInterface(modImplPtr, typeof(IXCLRDataModule).GUID, out nint ptrToMod);
Marshal.Release(modImplPtr);
*mod = (void*)ptrToMod;
mod.Interface = new ClrDataModule(module, _target, legacyMod);
}
}
catch (System.Exception ex)
Expand All @@ -87,23 +77,18 @@ int IXCLRDataMethodInstance.GetTokenAndScope(uint* token, void** /*IXCLRDataModu
if (_legacyImpl is not null)
{
bool validateToken = token is not null;
bool validateMod = mod is not null;
bool validateMod = !mod.IsNullRef;

uint tokenLocal = 0;
void* legacyModPtr = null;
int hrLocal = _legacyImpl.GetTokenAndScope(validateToken ? &tokenLocal : null, validateMod ? &legacyModPtr : null);
DacComNullableByRef<IXCLRDataModule> legacyModOutLocal = new(isNullRef: !validateMod);
int hrLocal = _legacyImpl.GetTokenAndScope(validateToken ? &tokenLocal : null, legacyModOutLocal);

Debug.ValidateHResult(hr, hrLocal);

if (validateToken)
{
Debug.Assert(tokenLocal == *token, $"cDAC: {*token:x}, DAC: {tokenLocal:x}");
}

if (validateMod && hr == HResults.S_OK)
{
Marshal.Release((nint)legacyModPtr); // release the legacy module
}
}
#endif

Expand Down Expand Up @@ -200,7 +185,7 @@ int IXCLRDataMethodInstance.GetEnCVersion(uint* version)
int IXCLRDataMethodInstance.GetNumTypeArguments(uint* numTypeArgs)
=> _legacyImpl is not null ? _legacyImpl.GetNumTypeArguments(numTypeArgs) : HResults.E_NOTIMPL;

int IXCLRDataMethodInstance.GetTypeArgumentByIndex(uint index, void** typeArg)
int IXCLRDataMethodInstance.GetTypeArgumentByIndex(uint index, DacComNullableByRef<IXCLRDataTypeInstance> typeArg)
=> _legacyImpl is not null ? _legacyImpl.GetTypeArgumentByIndex(index, typeArg) : HResults.E_NOTIMPL;

int IXCLRDataMethodInstance.GetILOffsetsByAddress(ClrDataAddress address, uint offsetsLen, uint* offsetsNeeded, uint* ilOffsets)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,65 +62,62 @@ CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out

int IXCLRDataModule.StartEnumAssemblies(ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumAssemblies(handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumAssembly(ulong* handle, /*IXCLRDataAssembly*/ void** assembly)
int IXCLRDataModule.EnumAssembly(ulong* handle, DacComNullableByRef<IXCLRDataAssembly> assembly)
=> _legacyModule is not null ? _legacyModule.EnumAssembly(handle, assembly) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumAssemblies(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumAssemblies(handle) : HResults.E_NOTIMPL;

int IXCLRDataModule.StartEnumTypeDefinitions(ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumTypeDefinitions(handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumTypeDefinition(ulong* handle, /*IXCLRDataTypeDefinition*/ void** typeDefinition)
int IXCLRDataModule.EnumTypeDefinition(ulong* handle, DacComNullableByRef<IXCLRDataTypeDefinition> typeDefinition)
=> _legacyModule is not null ? _legacyModule.EnumTypeDefinition(handle, typeDefinition) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumTypeDefinitions(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumTypeDefinitions(handle) : HResults.E_NOTIMPL;

int IXCLRDataModule.StartEnumTypeInstances(/*IXCLRDataAppDomain*/ void* appDomain, ulong* handle)
int IXCLRDataModule.StartEnumTypeInstances(IXCLRDataAppDomain? appDomain, ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumTypeInstances(appDomain, handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumTypeInstance(ulong* handle, /*IXCLRDataTypeInstance*/ void** typeInstance)
int IXCLRDataModule.EnumTypeInstance(ulong* handle, DacComNullableByRef<IXCLRDataTypeInstance> typeInstance)
=> _legacyModule is not null ? _legacyModule.EnumTypeInstance(handle, typeInstance) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumTypeInstances(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumTypeInstances(handle) : HResults.E_NOTIMPL;

int IXCLRDataModule.StartEnumTypeDefinitionsByName(char* name, uint flags, ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumTypeDefinitionsByName(name, flags, handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumTypeDefinitionByName(ulong* handle, /*IXCLRDataTypeDefinition*/ void** type)
int IXCLRDataModule.EnumTypeDefinitionByName(ulong* handle, DacComNullableByRef<IXCLRDataTypeDefinition> type)
=> _legacyModule is not null ? _legacyModule.EnumTypeDefinitionByName(handle, type) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumTypeDefinitionsByName(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumTypeDefinitionsByName(handle) : HResults.E_NOTIMPL;

int IXCLRDataModule.StartEnumTypeInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle)
int IXCLRDataModule.StartEnumTypeInstancesByName(char* name, uint flags, IXCLRDataAppDomain? appDomain, ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumTypeInstancesByName(name, flags, appDomain, handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumTypeInstanceByName(ulong* handle, /*IXCLRDataTypeInstance*/ void** type)
int IXCLRDataModule.EnumTypeInstanceByName(ulong* handle, DacComNullableByRef<IXCLRDataTypeInstance> type)
=> _legacyModule is not null ? _legacyModule.EnumTypeInstanceByName(handle, type) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumTypeInstancesByName(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumTypeInstancesByName(handle) : HResults.E_NOTIMPL;

int IXCLRDataModule.GetTypeDefinitionByToken(/*mdTypeDef*/ uint token, /*IXCLRDataTypeDefinition*/ void** typeDefinition)
int IXCLRDataModule.GetTypeDefinitionByToken(/*mdTypeDef*/ uint token, DacComNullableByRef<IXCLRDataTypeDefinition> typeDefinition)
=> _legacyModule is not null ? _legacyModule.GetTypeDefinitionByToken(token, typeDefinition) : HResults.E_NOTIMPL;

int IXCLRDataModule.StartEnumMethodDefinitionsByName(char* name, uint flags, ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumMethodDefinitionsByName(name, flags, handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumMethodDefinitionByName(ulong* handle, /*IXCLRDataMethodDefinition*/ void** method)
int IXCLRDataModule.EnumMethodDefinitionByName(ulong* handle, DacComNullableByRef<IXCLRDataMethodDefinition> method)
=> _legacyModule is not null ? _legacyModule.EnumMethodDefinitionByName(handle, method) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumMethodDefinitionsByName(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumMethodDefinitionsByName(handle) : HResults.E_NOTIMPL;

int IXCLRDataModule.StartEnumMethodInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle)
int IXCLRDataModule.StartEnumMethodInstancesByName(char* name, uint flags, IXCLRDataAppDomain? appDomain, ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumMethodInstancesByName(name, flags, appDomain, handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumMethodInstanceByName(ulong* handle, out IXCLRDataMethodInstance? method)
{
method = default;
return _legacyModule is not null ? _legacyModule.EnumMethodInstanceByName(handle, out method) : HResults.E_NOTIMPL;
}
int IXCLRDataModule.EnumMethodInstanceByName(ulong* handle, DacComNullableByRef<IXCLRDataMethodInstance> method)
=> _legacyModule is not null ? _legacyModule.EnumMethodInstanceByName(handle, method) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumMethodInstancesByName(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumMethodInstancesByName(handle) : HResults.E_NOTIMPL;

int IXCLRDataModule.GetMethodDefinitionByToken(/*mdMethodDef*/ uint token, /*IXCLRDataMethodDefinition*/ void** methodDefinition)
int IXCLRDataModule.GetMethodDefinitionByToken(/*mdMethodDef*/ uint token, DacComNullableByRef<IXCLRDataMethodDefinition> methodDefinition)
=> _legacyModule is not null ? _legacyModule.GetMethodDefinitionByToken(token, methodDefinition) : HResults.E_NOTIMPL;

int IXCLRDataModule.StartEnumDataByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle)
int IXCLRDataModule.StartEnumDataByName(char* name, uint flags, IXCLRDataAppDomain? appDomain, IXCLRDataTask? tlsTask, ulong* handle)
=> _legacyModule is not null ? _legacyModule.StartEnumDataByName(name, flags, appDomain, tlsTask, handle) : HResults.E_NOTIMPL;
int IXCLRDataModule.EnumDataByName(ulong* handle, /*IXCLRDataValue*/ void** value)
int IXCLRDataModule.EnumDataByName(ulong* handle, DacComNullableByRef<IXCLRDataValue> value)
=> _legacyModule is not null ? _legacyModule.EnumDataByName(handle, value) : HResults.E_NOTIMPL;
int IXCLRDataModule.EndEnumDataByName(ulong handle)
=> _legacyModule is not null ? _legacyModule.EndEnumDataByName(handle) : HResults.E_NOTIMPL;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,25 +84,26 @@ int IXCLRDataStackWalk.GetContext(uint contextFlags, uint contextBufSize, uint*
return hr;
}

int IXCLRDataStackWalk.GetFrame(out IXCLRDataFrame? frame)
int IXCLRDataStackWalk.GetFrame(DacComNullableByRef<IXCLRDataFrame> frame)
{
int hr = HResults.S_OK;
frame = default;

IXCLRDataFrame? legacyFrame = null;
if (_legacyImpl is not null)
{
int hrLocal = _legacyImpl.GetFrame(out legacyFrame);
DacComNullableByRef<IXCLRDataFrame> legacyFrameOut = new(isNullRef: false);
int hrLocal = _legacyImpl.GetFrame(legacyFrameOut);
if (hrLocal < 0)
return hrLocal;
legacyFrame = legacyFrameOut.Interface;
}

try
{
if (!_currentFrameIsValid)
throw new ArgumentException();

frame = new ClrDataFrame(_target, _dataFrames.Current, legacyFrame);
frame.Interface = new ClrDataFrame(_target, _dataFrames.Current, legacyFrame);
}
catch (System.Exception ex)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,21 @@ public ClrDataTask(TargetPointer address, Target target, IXCLRDataTask? legacyIm

int IXCLRDataTask.GetProcess(/*IXCLRDataProcess*/ void** process)
=> _legacyImpl is not null ? _legacyImpl.GetProcess(process) : HResults.E_NOTIMPL;
int IXCLRDataTask.GetCurrentAppDomain(out IXCLRDataAppDomain? appDomain)
int IXCLRDataTask.GetCurrentAppDomain(DacComNullableByRef<IXCLRDataAppDomain> appDomain)
{
int hr = HResults.S_OK, hrLocal = HResults.S_OK;
appDomain = null;
IXCLRDataAppDomain? legacyAppDomain = null;

if (_legacyImpl is not null)
{
hrLocal = _legacyImpl.GetCurrentAppDomain(out legacyAppDomain);
DacComNullableByRef<IXCLRDataAppDomain> legacyOut = new(isNullRef: false);
hrLocal = _legacyImpl.GetCurrentAppDomain(legacyOut);
legacyAppDomain = legacyOut.Interface;
}
try
{
TargetPointer currentAppDomain = _target.ReadPointer(_target.ReadGlobalPointer(Constants.Globals.AppDomain));
appDomain = new ClrDataAppDomain(currentAppDomain, legacyAppDomain);
appDomain.Interface = new ClrDataAppDomain(currentAppDomain, legacyAppDomain);
}
catch (System.Exception ex)
{
Expand All @@ -56,30 +57,30 @@ int IXCLRDataTask.GetFlags(uint* flags)
=> _legacyImpl is not null ? _legacyImpl.GetFlags(flags) : HResults.E_NOTIMPL;
int IXCLRDataTask.IsSameObject(IXCLRDataTask* task)
=> _legacyImpl is not null ? _legacyImpl.IsSameObject(task) : HResults.E_NOTIMPL;
int IXCLRDataTask.GetManagedObject(/*IXCLRDataValue*/ void** value)
int IXCLRDataTask.GetManagedObject(DacComNullableByRef<IXCLRDataValue> value)
=> _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL;
int IXCLRDataTask.GetDesiredExecutionState(uint* state)
=> _legacyImpl is not null ? _legacyImpl.GetDesiredExecutionState(state) : HResults.E_NOTIMPL;
int IXCLRDataTask.SetDesiredExecutionState(uint state)
=> _legacyImpl is not null ? _legacyImpl.SetDesiredExecutionState(state) : HResults.E_NOTIMPL;

int IXCLRDataTask.CreateStackWalk(uint flags, out IXCLRDataStackWalk? stackWalk)
int IXCLRDataTask.CreateStackWalk(uint flags, DacComNullableByRef<IXCLRDataStackWalk> stackWalk)
{
stackWalk = default;

Contracts.ThreadData threadData = _target.Contracts.Thread.GetThreadData(_address);
if (threadData.State.HasFlag(Contracts.ThreadState.Unstarted))
return HResults.E_FAIL;

IXCLRDataStackWalk? legacyStackWalk = null;
if (_legacyImpl is not null)
{
int hr = _legacyImpl.CreateStackWalk(flags, out legacyStackWalk);
DacComNullableByRef<IXCLRDataStackWalk> legacyStackWalkOut = new(isNullRef: false);
int hr = _legacyImpl.CreateStackWalk(flags, legacyStackWalkOut);
if (hr < 0)
return hr;
legacyStackWalk = legacyStackWalkOut.Interface;
}

stackWalk = new ClrDataStackWalk(_address, flags, _target, legacyStackWalk);
stackWalk.Interface = new ClrDataStackWalk(_address, flags, _target, legacyStackWalk);
return HResults.S_OK;
}

Expand Down
Loading