#include "compileresult.h"
#include "lightweightmap.h"
#include "callutils.h"
+#include "spmirecordhelper.h"
struct
{
void MethodContext::recResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken, DWORD exceptionCode)
{
if (ResolveToken == nullptr)
- ResolveToken = new LightWeightMap<Agnostic_CORINFO_RESOLVED_TOKENin, Agnostic_CORINFO_RESOLVED_TOKENout>();
+ ResolveToken = new LightWeightMap<Agnostic_CORINFO_RESOLVED_TOKENin, ResolveTokenValue>();
Agnostic_CORINFO_RESOLVED_TOKENin key;
ZeroMemory(&key, sizeof(Agnostic_CORINFO_RESOLVED_TOKENin)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- Agnostic_CORINFO_RESOLVED_TOKENout value;
-
- key.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.token = (DWORD)pResolvedToken->token;
- key.tokenType = (DWORD)pResolvedToken->tokenType;
-
- value.hClass = (DWORDLONG)pResolvedToken->hClass;
- value.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- value.hField = (DWORDLONG)pResolvedToken->hField;
- value.pTypeSpec_Index =
- (DWORD)ResolveToken->AddBuffer((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- value.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- value.pMethodSpec_Index =
- (DWORD)ResolveToken->AddBuffer((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- value.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
+ key = SpmiRecordsHelper::CreateAgnostic_CORINFO_RESOLVED_TOKENin(pResolvedToken);
+
+ ResolveTokenValue value;
+ value.tokenOut = SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKENout(pResolvedToken, ResolveToken);
value.exceptionCode = (DWORD)exceptionCode;
ResolveToken->Add(key, value);
DEBUG_REC(dmpResolveToken(key, value));
}
-void MethodContext::dmpResolveToken(const Agnostic_CORINFO_RESOLVED_TOKENin& key,
- const Agnostic_CORINFO_RESOLVED_TOKENout& value)
+void MethodContext::dmpResolveToken(const Agnostic_CORINFO_RESOLVED_TOKENin& key, const ResolveTokenValue& value)
{
printf("ResolveToken key tc-%016llX ts-%016llX tok-%08X tt-%u", key.tokenContext, key.tokenScope, key.token,
key.tokenType);
- printf(", value cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u mi-%u ms-%u excp-%08X", value.hClass,
- value.hMethod, value.hField, value.pTypeSpec_Index, value.cbTypeSpec, value.pMethodSpec_Index,
- value.cbMethodSpec, value.exceptionCode);
+ printf(", value cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u mi-%u ms-%u excp-%08X", value.tokenOut.hClass,
+ value.tokenOut.hMethod, value.tokenOut.hField, value.tokenOut.pTypeSpec_Index, value.tokenOut.cbTypeSpec,
+ value.tokenOut.pMethodSpec_Index, value.tokenOut.cbMethodSpec, value.exceptionCode);
}
void MethodContext::repResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken, DWORD* exceptionCode)
{
Agnostic_CORINFO_RESOLVED_TOKENin key;
ZeroMemory(&key, sizeof(Agnostic_CORINFO_RESOLVED_TOKENin)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- Agnostic_CORINFO_RESOLVED_TOKENout value;
-
- key.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.token = (DWORD)pResolvedToken->token;
- key.tokenType = (DWORD)pResolvedToken->tokenType;
+ key = SpmiRecordsHelper::CreateAgnostic_CORINFO_RESOLVED_TOKENin(pResolvedToken);
AssertCodeMsg(ResolveToken->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find %x", pResolvedToken->token);
- value = ResolveToken->Get(key);
+ ResolveTokenValue value = ResolveToken->Get(key);
- pResolvedToken->hClass = (CORINFO_CLASS_HANDLE)value.hClass;
- pResolvedToken->hMethod = (CORINFO_METHOD_HANDLE)value.hMethod;
- pResolvedToken->hField = (CORINFO_FIELD_HANDLE)value.hField;
- pResolvedToken->pTypeSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.pTypeSpec_Index);
- pResolvedToken->cbTypeSpec = (ULONG)value.cbTypeSpec;
- pResolvedToken->pMethodSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.pMethodSpec_Index);
- pResolvedToken->cbMethodSpec = (ULONG)value.cbMethodSpec;
+ pResolvedToken->hClass = (CORINFO_CLASS_HANDLE)value.tokenOut.hClass;
+ pResolvedToken->hMethod = (CORINFO_METHOD_HANDLE)value.tokenOut.hMethod;
+ pResolvedToken->hField = (CORINFO_FIELD_HANDLE)value.tokenOut.hField;
+ pResolvedToken->pTypeSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.tokenOut.pTypeSpec_Index);
+ pResolvedToken->cbTypeSpec = (ULONG)value.tokenOut.cbTypeSpec;
+ pResolvedToken->pMethodSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.tokenOut.pMethodSpec_Index);
+ pResolvedToken->cbMethodSpec = (ULONG)value.tokenOut.cbMethodSpec;
*exceptionCode = (DWORD)value.exceptionCode;
DEBUG_REP(dmpResolveToken(key, value));
void MethodContext::recTryResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken, bool success)
{
if (TryResolveToken == nullptr)
- TryResolveToken = new LightWeightMap<Agnostic_CORINFO_RESOLVED_TOKENin, Agnostic_CORINFO_RESOLVED_TOKENout>();
+ TryResolveToken = new LightWeightMap<Agnostic_CORINFO_RESOLVED_TOKENin, TryResolveTokenValue>();
Agnostic_CORINFO_RESOLVED_TOKENin key;
ZeroMemory(&key, sizeof(Agnostic_CORINFO_RESOLVED_TOKENin)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- Agnostic_CORINFO_RESOLVED_TOKENout value;
-
- key.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.token = (DWORD)pResolvedToken->token;
- key.tokenType = (DWORD)pResolvedToken->tokenType;
-
- value.hClass = (DWORDLONG)pResolvedToken->hClass;
- value.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- value.hField = (DWORDLONG)pResolvedToken->hField;
- value.pTypeSpec_Index =
- (DWORD)ResolveToken->AddBuffer((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- value.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- value.pMethodSpec_Index =
- (DWORD)ResolveToken->AddBuffer((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- value.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
- value.exceptionCode = success ? 0 : 1;
+ key = SpmiRecordsHelper::CreateAgnostic_CORINFO_RESOLVED_TOKENin(pResolvedToken);
+
+ TryResolveTokenValue value;
+
+ value.tokenOut = SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKENout(pResolvedToken, ResolveToken);
+ value.success = success ? 0 : 1;
TryResolveToken->Add(key, value);
DEBUG_REC(dmpTryResolveToken(key, value));
}
-void MethodContext::dmpTryResolveToken(const Agnostic_CORINFO_RESOLVED_TOKENin& key,
- const Agnostic_CORINFO_RESOLVED_TOKENout& value)
+void MethodContext::dmpTryResolveToken(const Agnostic_CORINFO_RESOLVED_TOKENin& key, const TryResolveTokenValue& value)
{
printf("TryResolveToken key tc-%016llX ts-%016llX tok-%08X tt-%u", key.tokenContext, key.tokenScope, key.token,
key.tokenType);
- printf(", value cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u mi-%u ms-%u failed-%u", value.hClass,
- value.hMethod, value.hField, value.pTypeSpec_Index, value.cbTypeSpec, value.pMethodSpec_Index,
- value.cbMethodSpec, value.exceptionCode);
+ printf(", value cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u mi-%u ms-%u failed-%u", value.tokenOut.hClass,
+ value.tokenOut.hMethod, value.tokenOut.hField, value.tokenOut.pTypeSpec_Index, value.tokenOut.cbTypeSpec,
+ value.tokenOut.pMethodSpec_Index, value.tokenOut.cbMethodSpec, value.success);
}
bool MethodContext::repTryResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken)
{
Agnostic_CORINFO_RESOLVED_TOKENin key;
ZeroMemory(&key, sizeof(Agnostic_CORINFO_RESOLVED_TOKENin)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- Agnostic_CORINFO_RESOLVED_TOKENout value;
- key.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.token = (DWORD)pResolvedToken->token;
- key.tokenType = (DWORD)pResolvedToken->tokenType;
+ key = SpmiRecordsHelper::CreateAgnostic_CORINFO_RESOLVED_TOKENin(pResolvedToken);
- // Best-effort: if the `tryResolveToken` map is missing or the key is not found therein,
- // fall back to the `resolveToken` map.
- if (TryResolveToken != nullptr && TryResolveToken->GetIndex(key) != -1)
- {
- value = TryResolveToken->Get(key);
- }
- else
- {
- AssertCodeMsg(ResolveToken->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find %x", pResolvedToken->token);
- value = ResolveToken->Get(key);
- }
+ TryResolveTokenValue value = TryResolveToken->Get(key);
- pResolvedToken->hClass = (CORINFO_CLASS_HANDLE)value.hClass;
- pResolvedToken->hMethod = (CORINFO_METHOD_HANDLE)value.hMethod;
- pResolvedToken->hField = (CORINFO_FIELD_HANDLE)value.hField;
- pResolvedToken->pTypeSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.pTypeSpec_Index);
- pResolvedToken->cbTypeSpec = (ULONG)value.cbTypeSpec;
- pResolvedToken->pMethodSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.pMethodSpec_Index);
- pResolvedToken->cbMethodSpec = (ULONG)value.cbMethodSpec;
+ pResolvedToken->hClass = (CORINFO_CLASS_HANDLE)value.tokenOut.hClass;
+ pResolvedToken->hMethod = (CORINFO_METHOD_HANDLE)value.tokenOut.hMethod;
+ pResolvedToken->hField = (CORINFO_FIELD_HANDLE)value.tokenOut.hField;
+ pResolvedToken->pTypeSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.tokenOut.pTypeSpec_Index);
+ pResolvedToken->cbTypeSpec = (ULONG)value.tokenOut.cbTypeSpec;
+ pResolvedToken->pMethodSpec = (PCCOR_SIGNATURE)ResolveToken->GetBuffer(value.tokenOut.pMethodSpec_Index);
+ pResolvedToken->cbMethodSpec = (ULONG)value.tokenOut.cbMethodSpec;
DEBUG_REP(dmpTryResolveToken(key, value));
- return (DWORD)value.exceptionCode == 0;
+ return (DWORD)value.success == 0;
}
void MethodContext::recGetCallInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken,
Agnostic_GetCallInfo key;
ZeroMemory(&key, sizeof(Agnostic_GetCallInfo)); // We use the input structs as a key and use memcmp to compare.. so
// we need to zero out padding too
- Agnostic_CORINFO_CALL_INFO value;
+ key.ResolvedToken = SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, GetCallInfo);
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)GetCallInfo->AddBuffer((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)GetCallInfo->AddBuffer((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
if (pConstrainedResolvedToken != nullptr)
{
- key.ConstrainedResolvedToken.tokenContext = (DWORDLONG)pConstrainedResolvedToken->tokenContext;
- key.ConstrainedResolvedToken.tokenScope = (DWORDLONG)pConstrainedResolvedToken->tokenScope;
- key.ConstrainedResolvedToken.token = (DWORD)pConstrainedResolvedToken->token;
- key.ConstrainedResolvedToken.tokenType = (DWORD)pConstrainedResolvedToken->tokenType;
- key.ConstrainedResolvedToken.hClass = (DWORDLONG)pConstrainedResolvedToken->hClass;
- key.ConstrainedResolvedToken.hMethod = (DWORDLONG)pConstrainedResolvedToken->hMethod;
- key.ConstrainedResolvedToken.hField = (DWORDLONG)pConstrainedResolvedToken->hField;
- key.ConstrainedResolvedToken.typeSpec_Index =
- (DWORD)GetCallInfo->AddBuffer((unsigned char*)pConstrainedResolvedToken->pTypeSpec,
- pConstrainedResolvedToken->cbTypeSpec);
- key.ConstrainedResolvedToken.cbTypeSpec = (DWORD)pConstrainedResolvedToken->cbTypeSpec;
- key.ConstrainedResolvedToken.methodSpec_Index =
- (DWORD)GetCallInfo->AddBuffer((unsigned char*)pConstrainedResolvedToken->pMethodSpec,
- pConstrainedResolvedToken->cbMethodSpec);
- key.ConstrainedResolvedToken.cbMethodSpec = (DWORD)pConstrainedResolvedToken->cbMethodSpec;
+ key.ConstrainedResolvedToken =
+ SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKEN(pConstrainedResolvedToken, GetCallInfo);
}
else
{
- key.ConstrainedResolvedToken.tokenContext = (DWORDLONG)0;
- key.ConstrainedResolvedToken.tokenScope = (DWORDLONG)0;
- key.ConstrainedResolvedToken.token = (DWORD)0;
- key.ConstrainedResolvedToken.tokenType = (DWORD)0;
- key.ConstrainedResolvedToken.hClass = (DWORDLONG)0;
- key.ConstrainedResolvedToken.hMethod = (DWORDLONG)0;
- key.ConstrainedResolvedToken.hField = (DWORDLONG)0;
- key.ConstrainedResolvedToken.typeSpec_Index = (DWORD)0;
- key.ConstrainedResolvedToken.cbTypeSpec = (DWORD)0;
- key.ConstrainedResolvedToken.methodSpec_Index = (DWORD)0;
- key.ConstrainedResolvedToken.cbMethodSpec = (DWORD)0;
+ key.ConstrainedResolvedToken.inValue.tokenContext = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.inValue.tokenScope = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.inValue.token = (DWORD)0;
+ key.ConstrainedResolvedToken.inValue.tokenType = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.hClass = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.outValue.hMethod = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.outValue.hField = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.outValue.pTypeSpec_Index = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.cbTypeSpec = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.pMethodSpec_Index = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.cbMethodSpec = (DWORD)0;
}
key.callerHandle = (DWORDLONG)callerHandle;
key.flags = (DWORD)flags;
+ Agnostic_CORINFO_CALL_INFO value;
if (exceptionCode == 0)
{
value.hMethod = (DWORDLONG)pResult->hMethod;
" rt{tc-%016llX ts-%016llX tok-%08X tt-%u cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u mi-%u ms-%u}"
" crt{tc-%016llX ts-%016llX tok-%08X tt-%u cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u mi-%u ms-%u}"
" ch-%016llX flg-%08X",
- key.ResolvedToken.tokenContext, key.ResolvedToken.tokenScope, key.ResolvedToken.token,
- key.ResolvedToken.tokenType, key.ResolvedToken.hClass, key.ResolvedToken.hMethod, key.ResolvedToken.hField,
- key.ResolvedToken.typeSpec_Index, key.ResolvedToken.cbTypeSpec, key.ResolvedToken.methodSpec_Index,
- key.ResolvedToken.cbMethodSpec, key.ConstrainedResolvedToken.tokenContext,
- key.ConstrainedResolvedToken.tokenScope, key.ConstrainedResolvedToken.token,
- key.ConstrainedResolvedToken.tokenType, key.ConstrainedResolvedToken.hClass,
- key.ConstrainedResolvedToken.hMethod, key.ConstrainedResolvedToken.hField,
- key.ConstrainedResolvedToken.typeSpec_Index, key.ConstrainedResolvedToken.cbTypeSpec,
- key.ConstrainedResolvedToken.methodSpec_Index, key.ConstrainedResolvedToken.cbMethodSpec, key.callerHandle,
- key.flags);
+ key.ResolvedToken.inValue.tokenContext, key.ResolvedToken.inValue.tokenScope,
+ key.ResolvedToken.inValue.token, key.ResolvedToken.inValue.tokenType, key.ResolvedToken.outValue.hClass,
+ key.ResolvedToken.outValue.hMethod, key.ResolvedToken.outValue.hField,
+ key.ResolvedToken.outValue.pTypeSpec_Index, key.ResolvedToken.outValue.cbTypeSpec,
+ key.ResolvedToken.outValue.pMethodSpec_Index, key.ResolvedToken.outValue.cbMethodSpec,
+ key.ConstrainedResolvedToken.inValue.tokenContext, key.ConstrainedResolvedToken.inValue.tokenScope,
+ key.ConstrainedResolvedToken.inValue.token, key.ConstrainedResolvedToken.inValue.tokenType,
+ key.ConstrainedResolvedToken.outValue.hClass, key.ConstrainedResolvedToken.outValue.hMethod,
+ key.ConstrainedResolvedToken.outValue.hField, key.ConstrainedResolvedToken.outValue.pTypeSpec_Index,
+ key.ConstrainedResolvedToken.outValue.cbTypeSpec, key.ConstrainedResolvedToken.outValue.pMethodSpec_Index,
+ key.ConstrainedResolvedToken.outValue.cbMethodSpec, key.callerHandle, key.flags);
printf(", value mth-%016llX, mf-%08X cf-%08X"
" sig{flg-%08X na-%u cc-%u ci-%u mc-%u mi-%u args-%016llX scp-%016llX tok-%08X}"
" vsig{flg-%08X na-%u cc-%u ci-%u mc-%u mi-%u args-%016llX scp-%016llX tok-%08X}"
Agnostic_GetCallInfo key;
ZeroMemory(&key, sizeof(Agnostic_GetCallInfo)); // We use the input structs as a key and use memcmp to compare.. so
// we need to zero out padding too
- Agnostic_CORINFO_CALL_INFO value;
-
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)GetCallInfo->Contains((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)GetCallInfo->Contains((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
+ key.ResolvedToken = SpmiRecordsHelper::RestoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, GetCallInfo);
if (pConstrainedResolvedToken != nullptr)
{
- key.ConstrainedResolvedToken.tokenContext = (DWORDLONG)pConstrainedResolvedToken->tokenContext;
- key.ConstrainedResolvedToken.tokenScope = (DWORDLONG)pConstrainedResolvedToken->tokenScope;
- key.ConstrainedResolvedToken.token = (DWORD)pConstrainedResolvedToken->token;
- key.ConstrainedResolvedToken.tokenType = (DWORD)pConstrainedResolvedToken->tokenType;
- key.ConstrainedResolvedToken.hClass = (DWORDLONG)pConstrainedResolvedToken->hClass;
- key.ConstrainedResolvedToken.hMethod = (DWORDLONG)pConstrainedResolvedToken->hMethod;
- key.ConstrainedResolvedToken.hField = (DWORDLONG)pConstrainedResolvedToken->hField;
- key.ConstrainedResolvedToken.typeSpec_Index =
- (DWORD)GetCallInfo->Contains((unsigned char*)pConstrainedResolvedToken->pTypeSpec,
- pConstrainedResolvedToken->cbTypeSpec);
- key.ConstrainedResolvedToken.cbTypeSpec = (DWORD)pConstrainedResolvedToken->cbTypeSpec;
- key.ConstrainedResolvedToken.methodSpec_Index =
- (DWORD)GetCallInfo->Contains((unsigned char*)pConstrainedResolvedToken->pMethodSpec,
- pConstrainedResolvedToken->cbMethodSpec);
- key.ConstrainedResolvedToken.cbMethodSpec = (DWORD)pConstrainedResolvedToken->cbMethodSpec;
+ key.ConstrainedResolvedToken =
+ SpmiRecordsHelper::RestoreAgnostic_CORINFO_RESOLVED_TOKEN(pConstrainedResolvedToken, GetCallInfo);
}
else
{
- key.ConstrainedResolvedToken.tokenContext = (DWORDLONG)0;
- key.ConstrainedResolvedToken.tokenScope = (DWORDLONG)0;
- key.ConstrainedResolvedToken.token = (DWORD)0;
- key.ConstrainedResolvedToken.tokenType = (DWORD)0;
- key.ConstrainedResolvedToken.hClass = (DWORDLONG)0;
- key.ConstrainedResolvedToken.hMethod = (DWORDLONG)0;
- key.ConstrainedResolvedToken.hField = (DWORDLONG)0;
- key.ConstrainedResolvedToken.typeSpec_Index = (DWORD)0;
- key.ConstrainedResolvedToken.cbTypeSpec = (DWORD)0;
- key.ConstrainedResolvedToken.methodSpec_Index = (DWORD)0;
- key.ConstrainedResolvedToken.cbMethodSpec = (DWORD)0;
+ key.ConstrainedResolvedToken.inValue.tokenContext = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.inValue.tokenScope = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.inValue.token = (DWORD)0;
+ key.ConstrainedResolvedToken.inValue.tokenType = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.hClass = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.outValue.hMethod = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.outValue.hField = (DWORDLONG)0;
+ key.ConstrainedResolvedToken.outValue.pTypeSpec_Index = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.cbTypeSpec = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.pMethodSpec_Index = (DWORD)0;
+ key.ConstrainedResolvedToken.outValue.cbMethodSpec = (DWORD)0;
}
key.callerHandle = (DWORDLONG)callerHandle;
key.flags = (DWORD)flags;
AssertCodeMsg(GetCallInfo->GetIndex(key) != -1, EXCEPTIONCODE_MC,
- "Didn't find %08x, %016llx. Probably a missing exception in GetCallInfo", key.ResolvedToken.token,
- key.ResolvedToken.hClass);
+ "Didn't find %08x, %016llx. Probably a missing exception in GetCallInfo",
+ key.ResolvedToken.inValue.token, key.ResolvedToken.outValue.hClass);
+
+ Agnostic_CORINFO_CALL_INFO value;
+
value = GetCallInfo->Get(key);
pResult->hMethod = (CORINFO_METHOD_HANDLE)value.hMethod;
CORINFO_RESOLVED_TOKEN resolvedToken;
DWORD exceptionCode;
- resolvedToken.tokenContext = (CORINFO_CONTEXT_HANDLE)key.ResolvedToken.tokenContext;
- resolvedToken.tokenScope = (CORINFO_MODULE_HANDLE)key.ResolvedToken.tokenScope;
- resolvedToken.token = (mdToken)key.ResolvedToken.token;
- resolvedToken.tokenType = (CorInfoTokenKind)key.ResolvedToken.tokenType;
+ resolvedToken.tokenContext = (CORINFO_CONTEXT_HANDLE)key.ResolvedToken.inValue.tokenContext;
+ resolvedToken.tokenScope = (CORINFO_MODULE_HANDLE)key.ResolvedToken.inValue.tokenScope;
+ resolvedToken.token = (mdToken)key.ResolvedToken.inValue.token;
+ resolvedToken.tokenType = (CorInfoTokenKind)key.ResolvedToken.inValue.tokenType;
repResolveToken(&resolvedToken, &exceptionCode);
CORINFO_RESOLVED_TOKEN constrainedResolvedToken;
CORINFO_RESOLVED_TOKEN* pConstrainedResolvedToken = nullptr;
- if (key.ConstrainedResolvedToken.tokenContext != 0 && key.ConstrainedResolvedToken.tokenScope != 0)
+ if (key.ConstrainedResolvedToken.inValue.tokenContext != 0 &&
+ key.ConstrainedResolvedToken.inValue.tokenScope != 0)
{
constrainedResolvedToken.tokenContext =
- (CORINFO_CONTEXT_HANDLE)key.ConstrainedResolvedToken.tokenContext;
+ (CORINFO_CONTEXT_HANDLE)key.ConstrainedResolvedToken.inValue.tokenContext;
constrainedResolvedToken.tokenScope =
- (CORINFO_MODULE_HANDLE)key.ConstrainedResolvedToken.tokenScope;
- constrainedResolvedToken.token = (mdToken)key.ConstrainedResolvedToken.token;
- constrainedResolvedToken.tokenType = (CorInfoTokenKind)key.ConstrainedResolvedToken.tokenType;
- pConstrainedResolvedToken = &constrainedResolvedToken;
+ (CORINFO_MODULE_HANDLE)key.ConstrainedResolvedToken.inValue.tokenScope;
+ constrainedResolvedToken.token = (mdToken)key.ConstrainedResolvedToken.inValue.token;
+ constrainedResolvedToken.tokenType =
+ (CorInfoTokenKind)key.ConstrainedResolvedToken.inValue.tokenType;
+ pConstrainedResolvedToken = &constrainedResolvedToken;
repResolveToken(pConstrainedResolvedToken, &exceptionCode);
}
ZeroMemory(&key, sizeof(Agnostic_GetNewHelper)); // We use the input structs as a key and use memcmp to compare.. so
// we need to zero out padding too
- key.ResolvedToken.tokenContext = (DWORDLONG)0;
- key.ResolvedToken.tokenScope = (DWORDLONG)0;
- key.ResolvedToken.token = (DWORD)0;
- key.ResolvedToken.tokenType = (DWORD)0;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)0;
- key.ResolvedToken.hField = (DWORDLONG)0;
- key.ResolvedToken.typeSpec_Index = (DWORD)0;
- key.ResolvedToken.cbTypeSpec = (DWORD)0;
- key.ResolvedToken.methodSpec_Index = (DWORD)0;
- key.ResolvedToken.cbMethodSpec = (DWORD)0;
- key.callerHandle = (DWORDLONG)callerHandle;
+ key.ResolvedToken.inValue.tokenContext = (DWORDLONG)0;
+ key.ResolvedToken.inValue.tokenScope = (DWORDLONG)0;
+ key.ResolvedToken.inValue.token = (DWORD)0;
+ key.ResolvedToken.inValue.tokenType = (DWORD)0;
+ key.ResolvedToken.outValue.hClass = (DWORDLONG)pResolvedToken->hClass;
+ key.ResolvedToken.outValue.hMethod = (DWORDLONG)0;
+ key.ResolvedToken.outValue.hField = (DWORDLONG)0;
+ key.ResolvedToken.outValue.pTypeSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbTypeSpec = (DWORD)0;
+ key.ResolvedToken.outValue.pMethodSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbMethodSpec = (DWORD)0;
+ key.callerHandle = (DWORDLONG)callerHandle;
GetNewHelper->Add(key, (DWORD)result);
DEBUG_REC(dmpGetNewHelper(key, (DWORD)result));
}
void MethodContext::dmpGetNewHelper(const Agnostic_GetNewHelper& key, DWORD value)
{
- printf("GetNewHelper key cls-%016llX chan-%016llX, value res-%u", key.ResolvedToken.hClass, key.callerHandle,
- value);
+ printf("GetNewHelper key cls-%016llX chan-%016llX, value res-%u", key.ResolvedToken.outValue.hClass,
+ key.callerHandle, value);
}
CorInfoHelpFunc MethodContext::repGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
CORINFO_METHOD_HANDLE callerHandle)
ZeroMemory(&key, sizeof(Agnostic_GetNewHelper)); // We use the input structs as a key and use memcmp to compare.. so
// we need to zero out padding too
- key.ResolvedToken.tokenContext = (DWORDLONG)0;
- key.ResolvedToken.tokenScope = (DWORDLONG)0;
- key.ResolvedToken.token = (DWORD)0;
- key.ResolvedToken.tokenType = (DWORD)0;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)0;
- key.ResolvedToken.hField = (DWORDLONG)0;
- key.ResolvedToken.typeSpec_Index = (DWORD)0;
- key.ResolvedToken.cbTypeSpec = (DWORD)0;
- key.ResolvedToken.methodSpec_Index = (DWORD)0;
- key.ResolvedToken.cbMethodSpec = (DWORD)0;
- key.callerHandle = (DWORDLONG)callerHandle;
+ key.ResolvedToken.inValue.tokenContext = (DWORDLONG)0;
+ key.ResolvedToken.inValue.tokenScope = (DWORDLONG)0;
+ key.ResolvedToken.inValue.token = (DWORD)0;
+ key.ResolvedToken.inValue.tokenType = (DWORD)0;
+ key.ResolvedToken.outValue.hClass = (DWORDLONG)pResolvedToken->hClass;
+ key.ResolvedToken.outValue.hMethod = (DWORDLONG)0;
+ key.ResolvedToken.outValue.hField = (DWORDLONG)0;
+ key.ResolvedToken.outValue.pTypeSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbTypeSpec = (DWORD)0;
+ key.ResolvedToken.outValue.pMethodSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbMethodSpec = (DWORD)0;
+ key.callerHandle = (DWORDLONG)callerHandle;
AssertCodeMsg(GetNewHelper != nullptr, EXCEPTIONCODE_MC, "Didn't find anything for %016llX",
- (DWORDLONG)key.ResolvedToken.hClass);
+ (DWORDLONG)key.ResolvedToken.outValue.hClass);
AssertCodeMsg(GetNewHelper->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find %016llX",
- (DWORDLONG)key.ResolvedToken.hClass);
+ (DWORDLONG)key.ResolvedToken.outValue.hClass);
CorInfoHelpFunc value = (CorInfoHelpFunc)GetNewHelper->Get(key);
DEBUG_REP(dmpGetNewHelper(key, value));
return value;
Agnostic_EmbedGenericHandle key;
ZeroMemory(&key, sizeof(Agnostic_EmbedGenericHandle)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- Agnostic_CORINFO_GENERICHANDLE_RESULT value;
-
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)EmbedGenericHandle->AddBuffer((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)EmbedGenericHandle->AddBuffer((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
- key.fEmbedParent = (DWORD)fEmbedParent;
+ key.ResolvedToken = SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, EmbedGenericHandle);
+ key.fEmbedParent = (DWORD)fEmbedParent;
+ Agnostic_CORINFO_GENERICHANDLE_RESULT value;
value.lookup.lookupKind.needsRuntimeLookup = (DWORD)pResult->lookup.lookupKind.needsRuntimeLookup;
value.lookup.lookupKind.runtimeLookupKind = (DWORD)pResult->lookup.lookupKind.runtimeLookupKind;
if (pResult->lookup.lookupKind.needsRuntimeLookup)
{
printf("EmbedGenericHandle key rt{tokCon-%016llX tokScp-%016llX tok-%08X tokTyp-%08X cls-%016llX ftn-%016llX "
"fld-%016llX tsi-%u cbts-%u msi-%u cbms-%u} emb-%u",
- key.ResolvedToken.tokenContext, key.ResolvedToken.tokenScope, key.ResolvedToken.token,
- key.ResolvedToken.tokenType, key.ResolvedToken.hClass, key.ResolvedToken.hMethod, key.ResolvedToken.hField,
- key.ResolvedToken.typeSpec_Index, key.ResolvedToken.cbTypeSpec, key.ResolvedToken.methodSpec_Index,
- key.ResolvedToken.cbMethodSpec, key.fEmbedParent);
+ key.ResolvedToken.inValue.tokenContext, key.ResolvedToken.inValue.tokenScope,
+ key.ResolvedToken.inValue.token, key.ResolvedToken.inValue.tokenType, key.ResolvedToken.outValue.hClass,
+ key.ResolvedToken.outValue.hMethod, key.ResolvedToken.outValue.hField,
+ key.ResolvedToken.outValue.pTypeSpec_Index, key.ResolvedToken.outValue.cbTypeSpec,
+ key.ResolvedToken.outValue.pMethodSpec_Index, key.ResolvedToken.outValue.cbMethodSpec, key.fEmbedParent);
printf(", value nrl-%u rlk-%u", value.lookup.lookupKind.needsRuntimeLookup,
value.lookup.lookupKind.runtimeLookupKind);
if (value.lookup.lookupKind.needsRuntimeLookup)
Agnostic_EmbedGenericHandle key;
ZeroMemory(&key, sizeof(Agnostic_EmbedGenericHandle)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- Agnostic_CORINFO_GENERICHANDLE_RESULT value;
AssertCodeMsg(EmbedGenericHandle != nullptr, EXCEPTIONCODE_MC, "Encountered an empty LWM while looking for ...");
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)EmbedGenericHandle->Contains((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)EmbedGenericHandle->Contains((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
- key.fEmbedParent = (DWORD)fEmbedParent;
+ key.ResolvedToken = SpmiRecordsHelper::RestoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, EmbedGenericHandle);
+ key.fEmbedParent = (DWORD)fEmbedParent;
AssertCodeMsg(EmbedGenericHandle->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find ...");
+
+ Agnostic_CORINFO_GENERICHANDLE_RESULT value;
value = EmbedGenericHandle->Get(key);
pResult->lookup.lookupKind.needsRuntimeLookup = value.lookup.lookupKind.needsRuntimeLookup != 0;
ZeroMemory(&key, sizeof(Agnostic_CORINFO_RESOLVED_TOKEN)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- key.tokenContext = (DWORDLONG)0;
- key.tokenScope = (DWORDLONG)0;
- key.token = (DWORD)0;
- key.tokenType = (DWORD)0;
- key.hClass = (DWORDLONG)0;
- key.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.hField = (DWORDLONG)pResolvedToken->hField;
- key.typeSpec_Index = (DWORD)0;
- key.cbTypeSpec = (DWORD)0;
- key.methodSpec_Index = (DWORD)0;
- key.cbMethodSpec = (DWORD)0;
+ key.inValue.tokenContext = (DWORDLONG)0;
+ key.inValue.tokenScope = (DWORDLONG)0;
+ key.inValue.token = (DWORD)0;
+ key.inValue.tokenType = (DWORD)0;
+ key.outValue.hClass = (DWORDLONG)0;
+ key.outValue.hMethod = (DWORDLONG)pResolvedToken->hMethod;
+ key.outValue.hField = (DWORDLONG)pResolvedToken->hField;
+ key.outValue.pTypeSpec_Index = (DWORD)0;
+ key.outValue.cbTypeSpec = (DWORD)0;
+ key.outValue.pMethodSpec_Index = (DWORD)0;
+ key.outValue.cbMethodSpec = (DWORD)0;
GetTokenTypeAsHandle->Add(key, (DWORDLONG)result);
}
void MethodContext::dmpGetTokenTypeAsHandle(const Agnostic_CORINFO_RESOLVED_TOKEN& key, DWORDLONG value)
{
- printf("GetTokenTypeAsHandle key ftn-%016llX fld-%016llX, value cls-%016llX", key.hMethod, key.hField, value);
+ printf("GetTokenTypeAsHandle key ftn-%016llX fld-%016llX, value cls-%016llX", key.outValue.hMethod,
+ key.outValue.hField, value);
}
CORINFO_CLASS_HANDLE MethodContext::repGetTokenTypeAsHandle(CORINFO_RESOLVED_TOKEN* pResolvedToken)
{
ZeroMemory(&key, sizeof(Agnostic_CORINFO_RESOLVED_TOKEN)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- key.tokenContext = (DWORDLONG)0;
- key.tokenScope = (DWORDLONG)0;
- key.token = (DWORD)0;
- key.tokenType = (DWORD)0;
- key.hClass = (DWORDLONG)0;
- key.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.hField = (DWORDLONG)pResolvedToken->hField;
- key.typeSpec_Index = (DWORD)0;
- key.cbTypeSpec = (DWORD)0;
- key.methodSpec_Index = (DWORD)0;
- key.cbMethodSpec = (DWORD)0;
+ key.inValue.tokenContext = (DWORDLONG)0;
+ key.inValue.tokenScope = (DWORDLONG)0;
+ key.inValue.token = (DWORD)0;
+ key.inValue.tokenType = (DWORD)0;
+ key.outValue.hClass = (DWORDLONG)0;
+ key.outValue.hMethod = (DWORDLONG)pResolvedToken->hMethod;
+ key.outValue.hField = (DWORDLONG)pResolvedToken->hField;
+ key.outValue.pTypeSpec_Index = (DWORD)0;
+ key.outValue.cbTypeSpec = (DWORD)0;
+ key.outValue.pMethodSpec_Index = (DWORD)0;
+ key.outValue.cbMethodSpec = (DWORD)0;
CORINFO_CLASS_HANDLE value = (CORINFO_CLASS_HANDLE)GetTokenTypeAsHandle->Get(key);
return value;
Agnostic_GetFieldInfo key;
ZeroMemory(&key, sizeof(Agnostic_GetFieldInfo)); // Since dd has nested structs, and we use memcmp to compare, we
// need to zero out the padding bytes too
- Agnostic_CORINFO_FIELD_INFO value;
-
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)GetFieldInfo->AddBuffer((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)GetFieldInfo->AddBuffer((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
- key.callerHandle = (DWORDLONG)callerHandle;
- key.flags = (DWORD)flags;
+ key.ResolvedToken = SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, GetFieldInfo);
+ key.callerHandle = (DWORDLONG)callerHandle;
+ key.flags = (DWORD)flags;
+ Agnostic_CORINFO_FIELD_INFO value;
value.fieldAccessor = (DWORD)pResult->fieldAccessor;
value.fieldFlags = (DWORD)pResult->fieldFlags;
value.helper = (DWORD)pResult->helper;
{
printf("GetFieldInfo key ch-%016llX flg-%08X rt{tc-%016llX ts-%016llX tok-%08X tt-%u cls-%016llX meth-%016llX "
"fld-%016llX tsi-%u cbts-%u msi-%u cbms-%u}",
- key.callerHandle, key.flags, key.ResolvedToken.tokenContext, key.ResolvedToken.tokenScope,
- key.ResolvedToken.token, key.ResolvedToken.tokenType, key.ResolvedToken.hClass, key.ResolvedToken.hMethod,
- key.ResolvedToken.hField, key.ResolvedToken.typeSpec_Index, key.ResolvedToken.cbTypeSpec,
- key.ResolvedToken.methodSpec_Index, key.ResolvedToken.cbMethodSpec);
+ key.callerHandle, key.flags, key.ResolvedToken.inValue.tokenContext, key.ResolvedToken.inValue.tokenScope,
+ key.ResolvedToken.inValue.token, key.ResolvedToken.inValue.tokenType, key.ResolvedToken.outValue.hClass,
+ key.ResolvedToken.outValue.hMethod, key.ResolvedToken.outValue.hField,
+ key.ResolvedToken.outValue.pTypeSpec_Index, key.ResolvedToken.outValue.cbTypeSpec,
+ key.ResolvedToken.outValue.pMethodSpec_Index, key.ResolvedToken.outValue.cbMethodSpec);
printf(", value fa-%u fflg-%08X hlp-%u off-%u fT-%u(%s) sT-%016llX aa-%u hnum-%u na-%u {", value.fieldAccessor,
value.fieldFlags, value.helper, value.offset, value.fieldType, toString((CorInfoType)value.fieldType),
CORINFO_ACCESS_FLAGS flags,
CORINFO_FIELD_INFO* pResult)
{
+ AssertCodeMsg(GetFieldInfo != nullptr, EXCEPTIONCODE_MC, "Didn't find %x", pResolvedToken->token);
+
Agnostic_GetFieldInfo key;
ZeroMemory(&key, sizeof(Agnostic_GetFieldInfo)); // Since dd has nested structs, and we use memcmp to compare, we
// need to zero out the padding bytes too
- Agnostic_CORINFO_FIELD_INFO value;
-
- AssertCodeMsg(GetFieldInfo != nullptr, EXCEPTIONCODE_MC, "Didn't find %x", pResolvedToken->token);
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)GetFieldInfo->Contains((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)GetFieldInfo->Contains((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
- key.callerHandle = (DWORDLONG)callerHandle;
- key.flags = (DWORD)flags;
+ key.ResolvedToken = SpmiRecordsHelper::RestoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, GetFieldInfo);
+ key.callerHandle = (DWORDLONG)callerHandle;
+ key.flags = (DWORD)flags;
DWORD origFlag = key.flags;
#endif
}
- value = GetFieldInfo->Get(key);
+ Agnostic_CORINFO_FIELD_INFO value = GetFieldInfo->Get(key);
pResult->fieldAccessor = (CORINFO_FIELD_ACCESSOR)value.fieldAccessor;
pResult->fieldFlags = (unsigned)value.fieldFlags;
Agnostic_CanAccessClassIn key;
ZeroMemory(&key, sizeof(Agnostic_CanAccessClassIn)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
+ key.ResolvedToken = SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, CanAccessClass);
+ key.callerHandle = (DWORDLONG)callerHandle;
Agnostic_CanAccessClassOut value;
-
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)CanAccessClass->AddBuffer((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)CanAccessClass->AddBuffer((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
- key.callerHandle = (DWORDLONG)callerHandle;
-
value.AccessHelper.helperNum = (DWORD)pAccessHelper->helperNum;
value.AccessHelper.numArgs = (DWORD)pAccessHelper->numArgs;
for (int i = 0; i < CORINFO_ACCESS_ALLOWED_MAX_ARGS; i++)
{
printf("CanAccessClass key tc-%016llX ts-%016llX tok-%08X tt-%u cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u "
"mi-%u ms-%u",
- key.ResolvedToken.tokenContext, key.ResolvedToken.tokenScope, key.ResolvedToken.token,
- key.ResolvedToken.tokenType, key.ResolvedToken.hClass, key.ResolvedToken.hMethod, key.ResolvedToken.hField,
- key.ResolvedToken.typeSpec_Index, key.ResolvedToken.cbTypeSpec, key.ResolvedToken.methodSpec_Index,
- key.ResolvedToken.cbMethodSpec);
+ key.ResolvedToken.inValue.tokenContext, key.ResolvedToken.inValue.tokenScope,
+ key.ResolvedToken.inValue.token, key.ResolvedToken.inValue.tokenType, key.ResolvedToken.outValue.hClass,
+ key.ResolvedToken.outValue.hMethod, key.ResolvedToken.outValue.hField,
+ key.ResolvedToken.outValue.pTypeSpec_Index, key.ResolvedToken.outValue.cbTypeSpec,
+ key.ResolvedToken.outValue.pMethodSpec_Index, key.ResolvedToken.outValue.cbMethodSpec);
printf(", value hnum-%u na-%u {", value.AccessHelper.helperNum, value.AccessHelper.numArgs);
for (int i = 0; i < CORINFO_ACCESS_ALLOWED_MAX_ARGS; i++)
{
CORINFO_METHOD_HANDLE callerHandle,
CORINFO_HELPER_DESC* pAccessHelper)
{
+ AssertCodeMsg(CanAccessClass != nullptr, EXCEPTIONCODE_MC, "Didn't find anything for %016llX",
+ (DWORDLONG)pResolvedToken->hClass);
+
Agnostic_CanAccessClassIn key;
ZeroMemory(&key, sizeof(Agnostic_CanAccessClassIn)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- Agnostic_CanAccessClassOut value;
-
- AssertCodeMsg(CanAccessClass != nullptr, EXCEPTIONCODE_MC, "Didn't find anything for %016llX",
- (DWORDLONG)pResolvedToken->hClass);
- key.ResolvedToken.tokenContext = (DWORDLONG)pResolvedToken->tokenContext;
- key.ResolvedToken.tokenScope = (DWORDLONG)pResolvedToken->tokenScope;
- key.ResolvedToken.token = (DWORD)pResolvedToken->token;
- key.ResolvedToken.tokenType = (DWORD)pResolvedToken->tokenType;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)pResolvedToken->hMethod;
- key.ResolvedToken.hField = (DWORDLONG)pResolvedToken->hField;
- key.ResolvedToken.typeSpec_Index =
- (DWORD)CanAccessClass->Contains((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec);
- key.ResolvedToken.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec;
- key.ResolvedToken.methodSpec_Index =
- (DWORD)CanAccessClass->Contains((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec);
- key.ResolvedToken.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec;
- key.callerHandle = (DWORDLONG)callerHandle;
+ key.ResolvedToken = SpmiRecordsHelper::RestoreAgnostic_CORINFO_RESOLVED_TOKEN(pResolvedToken, CanAccessClass);
+ key.callerHandle = (DWORDLONG)callerHandle;
AssertCodeMsg(CanAccessClass->GetIndex(key) != -1, EXCEPTIONCODE_MC, "Didn't find %016llX",
(DWORDLONG)pResolvedToken->hClass);
- value = CanAccessClass->Get(key);
+ Agnostic_CanAccessClassOut value = CanAccessClass->Get(key);
pAccessHelper->helperNum = (CorInfoHelpFunc)value.AccessHelper.helperNum;
pAccessHelper->numArgs = (unsigned)value.AccessHelper.numArgs;
ZeroMemory(&key, sizeof(Agnostic_GetCastingHelper)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- key.ResolvedToken.tokenContext = (DWORDLONG)0;
- key.ResolvedToken.tokenScope = (DWORDLONG)0;
- key.ResolvedToken.token = (DWORD)0;
- key.ResolvedToken.tokenType = (DWORD)0;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)0;
- key.ResolvedToken.hField = (DWORDLONG)0;
- key.ResolvedToken.typeSpec_Index = (DWORD)0;
- key.ResolvedToken.cbTypeSpec = (DWORD)0;
- key.ResolvedToken.methodSpec_Index = (DWORD)0;
- key.ResolvedToken.cbMethodSpec = (DWORD)0;
- key.fThrowing = (DWORD)fThrowing;
+ key.ResolvedToken.inValue.tokenContext = (DWORDLONG)0;
+ key.ResolvedToken.inValue.tokenScope = (DWORDLONG)0;
+ key.ResolvedToken.inValue.token = (DWORD)0;
+ key.ResolvedToken.inValue.tokenType = (DWORD)0;
+ key.ResolvedToken.outValue.hClass = (DWORDLONG)pResolvedToken->hClass;
+ key.ResolvedToken.outValue.hMethod = (DWORDLONG)0;
+ key.ResolvedToken.outValue.hField = (DWORDLONG)0;
+ key.ResolvedToken.outValue.pTypeSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbTypeSpec = (DWORD)0;
+ key.ResolvedToken.outValue.pMethodSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbMethodSpec = (DWORD)0;
+ key.fThrowing = (DWORD)fThrowing;
GetCastingHelper->Add(key, (DWORD)result);
}
void MethodContext::dmpGetCastingHelper(const Agnostic_GetCastingHelper& key, DWORD value)
{
- printf("GetCastingHelper key cls-%016llX, thw-%u, value res-%u", key.ResolvedToken.hClass, key.fThrowing, value);
+ printf("GetCastingHelper key cls-%016llX, thw-%u, value res-%u", key.ResolvedToken.outValue.hClass, key.fThrowing,
+ value);
}
CorInfoHelpFunc MethodContext::repGetCastingHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, bool fThrowing)
{
ZeroMemory(&key, sizeof(Agnostic_GetCastingHelper)); // We use the input structs as a key and use memcmp to
// compare.. so we need to zero out padding too
- key.ResolvedToken.tokenContext = (DWORDLONG)0;
- key.ResolvedToken.tokenScope = (DWORDLONG)0;
- key.ResolvedToken.token = (DWORD)0;
- key.ResolvedToken.tokenType = (DWORD)0;
- key.ResolvedToken.hClass = (DWORDLONG)pResolvedToken->hClass;
- key.ResolvedToken.hMethod = (DWORDLONG)0;
- key.ResolvedToken.hField = (DWORDLONG)0;
- key.ResolvedToken.typeSpec_Index = (DWORD)0;
- key.ResolvedToken.cbTypeSpec = (DWORD)0;
- key.ResolvedToken.methodSpec_Index = (DWORD)0;
- key.ResolvedToken.cbMethodSpec = (DWORD)0;
- key.fThrowing = (DWORD)fThrowing;
+ key.ResolvedToken.inValue.tokenContext = (DWORDLONG)0;
+ key.ResolvedToken.inValue.tokenScope = (DWORDLONG)0;
+ key.ResolvedToken.inValue.token = (DWORD)0;
+ key.ResolvedToken.inValue.tokenType = (DWORD)0;
+ key.ResolvedToken.outValue.hClass = (DWORDLONG)pResolvedToken->hClass;
+ key.ResolvedToken.outValue.hMethod = (DWORDLONG)0;
+ key.ResolvedToken.outValue.hField = (DWORDLONG)0;
+ key.ResolvedToken.outValue.pTypeSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbTypeSpec = (DWORD)0;
+ key.ResolvedToken.outValue.pMethodSpec_Index = (DWORD)0;
+ key.ResolvedToken.outValue.cbMethodSpec = (DWORD)0;
+ key.fThrowing = (DWORD)fThrowing;
CorInfoHelpFunc value = (CorInfoHelpFunc)GetCastingHelper->Get(key);
return value;