summaryrefslogtreecommitdiff
path: root/src/vm/comutilnative.cpp
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2016-01-19 00:04:33 -0800
committerstephentoub <stoub@microsoft.com>2016-01-19 08:16:16 -0500
commit04294485c8cfd1b8d2fe974ace49c5dd33008626 (patch)
tree9a654de18c38163953e09f8fa4e5a480117fdc0c /src/vm/comutilnative.cpp
parent2b53215be49e81bd8e0aee85b539bc07a6c43e2e (diff)
downloadcoreclr-04294485c8cfd1b8d2fe974ace49c5dd33008626.tar.gz
coreclr-04294485c8cfd1b8d2fe974ace49c5dd33008626.tar.bz2
coreclr-04294485c8cfd1b8d2fe974ace49c5dd33008626.zip
Add generic detection of Stream.{Begin|End}{Read|Write} overrides
Diffstat (limited to 'src/vm/comutilnative.cpp')
-rw-r--r--src/vm/comutilnative.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp
index 9664bf9325..1b21f12cda 100644
--- a/src/vm/comutilnative.cpp
+++ b/src/vm/comutilnative.cpp
@@ -3159,3 +3159,57 @@ INT32 QCALLTYPE CoreFxGlobalization::HashSortKey(PCBYTE pSortKey, INT32 cbSortKe
return retVal;
}
#endif //FEATURE_COREFX_GLOBALIZATION
+
+static MethodTable * g_pStreamMT;
+static WORD g_slotBeginRead, g_slotEndRead;
+static WORD g_slotBeginWrite, g_slotEndWrite;
+
+FCIMPL1(FC_BOOL_RET, StreamNative::HasOverridenBeginEndRead, Object *stream)
+{
+ FCALL_CONTRACT;
+
+ if (stream == NULL)
+ FC_RETURN_BOOL(TRUE);
+
+ if (g_pStreamMT == NULL || g_slotBeginRead == 0 || g_slotEndRead == 0)
+ {
+ HELPER_METHOD_FRAME_BEGIN_RET_1(stream);
+ g_pStreamMT = MscorlibBinder::GetClass(CLASS__STREAM);
+ g_slotBeginRead = MscorlibBinder::GetMethod(METHOD__STREAM__BEGIN_READ)->GetSlot();
+ g_slotEndRead = MscorlibBinder::GetMethod(METHOD__STREAM__END_READ)->GetSlot();
+ HELPER_METHOD_FRAME_END();
+ }
+
+ MethodTable * pMT = stream->GetMethodTable();
+
+ FC_RETURN_BOOL(
+ pMT->GetRestoredSlot(g_slotBeginRead) != g_pStreamMT->GetRestoredSlot(g_slotBeginRead) ||
+ pMT->GetRestoredSlot(g_slotEndRead) != g_pStreamMT->GetRestoredSlot(g_slotEndRead)
+ );
+}
+FCIMPLEND
+
+FCIMPL1(FC_BOOL_RET, StreamNative::HasOverridenBeginEndWrite, Object *stream)
+{
+ FCALL_CONTRACT;
+
+ if (stream == NULL)
+ FC_RETURN_BOOL(TRUE);
+
+ if (g_pStreamMT == NULL || g_slotBeginWrite == 0 || g_slotEndWrite == 0)
+ {
+ HELPER_METHOD_FRAME_BEGIN_RET_1(stream);
+ g_pStreamMT = MscorlibBinder::GetClass(CLASS__STREAM);
+ g_slotBeginWrite = MscorlibBinder::GetMethod(METHOD__STREAM__BEGIN_WRITE)->GetSlot();
+ g_slotEndWrite = MscorlibBinder::GetMethod(METHOD__STREAM__END_WRITE)->GetSlot();
+ HELPER_METHOD_FRAME_END();
+ }
+
+ MethodTable * pMT = stream->GetMethodTable();
+
+ FC_RETURN_BOOL(
+ pMT->GetRestoredSlot(g_slotBeginWrite) != g_pStreamMT->GetRestoredSlot(g_slotBeginWrite) ||
+ pMT->GetRestoredSlot(g_slotEndWrite) != g_pStreamMT->GetRestoredSlot(g_slotEndWrite)
+ );
+}
+FCIMPLEND