summaryrefslogtreecommitdiff
path: root/tests/src/Interop/SimpleStruct/SimpleStructNative.cpp
diff options
context:
space:
mode:
authorJiyoung Yun <jy910.yun@samsung.com>2016-11-23 19:09:09 +0900
committerJiyoung Yun <jy910.yun@samsung.com>2016-11-23 19:09:09 +0900
commit4b4aad7217d3292650e77eec2cf4c198ea9c3b4b (patch)
tree98110734c91668dfdbb126fcc0e15ddbd93738ca /tests/src/Interop/SimpleStruct/SimpleStructNative.cpp
parentfa45f57ed55137c75ac870356a1b8f76c84b229c (diff)
downloadcoreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.gz
coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.bz2
coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.zip
Imported Upstream version 1.1.0upstream/1.1.0
Diffstat (limited to 'tests/src/Interop/SimpleStruct/SimpleStructNative.cpp')
-rw-r--r--tests/src/Interop/SimpleStruct/SimpleStructNative.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/tests/src/Interop/SimpleStruct/SimpleStructNative.cpp b/tests/src/Interop/SimpleStruct/SimpleStructNative.cpp
new file mode 100644
index 0000000000..5fe82146b8
--- /dev/null
+++ b/tests/src/Interop/SimpleStruct/SimpleStructNative.cpp
@@ -0,0 +1,107 @@
+#include "platformdefines.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <xplatform.h>
+
+typedef void *voidPtr;
+
+typedef struct { int a;
+bool b;
+char* str;} Sstr;
+
+typedef struct { int a;
+bool b;
+double c;} Sstr_simple;
+
+typedef struct {
+ int a;
+ int extra; //padding needs to be added here as we have added 8 byte offset.
+ union
+ {
+ int i;
+ BOOL b;
+ double d;
+ }udata;
+}ExplStruct;
+
+extern "C"
+DLL_EXPORT BOOL _cdecl CdeclSimpleStructByRef(Sstr *p)
+{
+ p->a = 100;
+ p->b=1;
+ strncpy(p->str,"after",6);
+ return TRUE;
+}
+
+extern "C"
+DLL_EXPORT BOOL _cdecl CdeclSimpleExplStructByRef(ExplStruct *p)
+{
+ if((p->a != 0) || (p->udata.i != 10))
+ {
+ printf("\np->a=%d, p->udata.i=%d\n",p->a,p->udata.i);
+ return FALSE;
+ }
+ p->a = 1;
+ p->udata.b = TRUE;
+ return TRUE;
+}
+
+extern "C"
+DLL_EXPORT Sstr_simple* _cdecl CdeclSimpleStruct(Sstr_simple p,BOOL *result)
+{
+ Sstr_simple *pSimpleStruct;
+ if((p.a !=100) || (p.b != FALSE) || (p.c != 3.142))
+ {
+ *(result)= FALSE;
+ return NULL;
+ }
+ pSimpleStruct = (Sstr_simple*) TP_CoTaskMemAlloc(sizeof(Sstr_simple) * 1);
+ pSimpleStruct->a = 101;
+ pSimpleStruct->b = TRUE;
+ pSimpleStruct->c = 10.11;
+ *(result)= TRUE;
+ return pSimpleStruct;
+}
+
+extern "C"
+DLL_EXPORT ExplStruct* _cdecl CdeclSimpleExplStruct(ExplStruct p,BOOL *result)
+{
+ ExplStruct *pExplStruct;
+ if((p.a !=1) || (p.udata.b != FALSE))
+ {
+ *(result)= FALSE;
+ return NULL;
+ }
+ pExplStruct = (ExplStruct*) TP_CoTaskMemAlloc(sizeof(ExplStruct) * 1);
+ pExplStruct->a = 2;
+ pExplStruct->udata.d = 3.142;
+ *(result)= TRUE;
+ return pExplStruct;
+}
+
+extern "C"
+DLL_EXPORT voidPtr _cdecl GetFptr(int i)
+{
+ switch(i)
+ {
+
+ case 14:
+ return (voidPtr) &CdeclSimpleStructByRef;
+ break;
+
+ case 16:
+ return (voidPtr) &CdeclSimpleStruct;
+ break;
+
+ case 18:
+ return (voidPtr) &CdeclSimpleExplStructByRef;
+ break;
+
+ case 20:
+ return (voidPtr) &CdeclSimpleExplStruct;
+ break;
+
+ }
+ return (voidPtr) &CdeclSimpleStruct;
+}