[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Dotgnu-pnet-commits] CVS: pnet/engine cvmc_obj.c,1.17,1.18
From: |
Rhys Weatherley <address@hidden> |
Subject: |
[Dotgnu-pnet-commits] CVS: pnet/engine cvmc_obj.c,1.17,1.18 |
Date: |
Tue, 06 May 2003 05:53:23 -0400 |
Update of /cvsroot/dotgnu-pnet/pnet/engine
In directory subversions:/tmp/cvs-serv17226/engine
Modified Files:
cvmc_obj.c
Log Message:
Implement PInvoke lookups for fields so that global variables
within shared objects can be accessed.
Index: cvmc_obj.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/engine/cvmc_obj.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -r1.17 -r1.18
*** cvmc_obj.c 18 Apr 2003 09:15:52 -0000 1.17
--- cvmc_obj.c 6 May 2003 09:53:21 -0000 1.18
***************
*** 324,327 ****
--- 324,375 ----
int isCtor);
+ #ifdef IL_CONFIG_PINVOKE
+
+ /*
+ * Load the address of a PInvoke-imported field onto the stack.
+ */
+ static void LoadPInvokeFieldAddress(ILCoder *coder, ILField *field,
+
ILPInvoke *pinvoke)
+ {
+ char *name;
+ void *handle;
+ void *symbol;
+ const char *symbolName;
+
+ /* Resolve the module */
+ name = ILPInvokeResolveModule(pinvoke);
+ if(!name)
+ {
+ CVM_OUT_NONE(COP_LDNULL);
+ CVM_OUT_NONE(COP_CKNULL);
+ CVM_ADJUST(1);
+ return;
+ }
+
+ /* Load the module into memory */
+ handle = ILDynLibraryOpen(name);
+ ILFree(name);
+ if(!handle)
+ {
+ CVM_OUT_NONE(COP_LDNULL);
+ CVM_OUT_NONE(COP_CKNULL);
+ CVM_ADJUST(1);
+ return;
+ }
+
+ /* Resolve the symbol and push its address */
+ symbolName = ILPInvoke_Alias(pinvoke);
+ if(!symbolName)
+ {
+ symbolName = ILField_Name(field);
+ }
+ symbol = ILDynLibraryGetSymbol(handle, symbolName);
+ CVM_OUT_PTR(COP_LDTOKEN, symbol);
+ CVM_OUT_NONE(COP_CKNULL);
+ CVM_ADJUST(1);
+ }
+
+ #endif /* IL_CONFIG_PINVOKE */
+
static void CVMCoder_LoadStaticField(ILCoder *coder, ILField *field,
ILType
*fieldType)
***************
*** 329,332 ****
--- 377,391 ----
ILClass *classInfo;
+ #ifdef IL_CONFIG_PINVOKE
+ ILPInvoke *pinvoke;
+ if((field->member.attributes & IL_META_FIELDDEF_PINVOKE_IMPL) != 0 &&
+ (pinvoke = ILPInvokeFindField(field)) != 0)
+ {
+ /* Field that is imported via PInvoke */
+ LoadPInvokeFieldAddress(coder, field, pinvoke);
+ CVMLoadField(coder, ILEngineType_M, 0, field, fieldType, 0, 0);
+ }
+ else
+ #endif
if((field->member.attributes & IL_META_FIELDDEF_HAS_FIELD_RVA) == 0)
{
***************
*** 403,406 ****
--- 462,476 ----
ILClass *classInfo;
+ #ifdef IL_CONFIG_PINVOKE
+ ILPInvoke *pinvoke;
+ if((field->member.attributes & IL_META_FIELDDEF_PINVOKE_IMPL) != 0 &&
+ (pinvoke = ILPInvokeFindField(field)) != 0)
+ {
+ /* Field that is imported via PInvoke */
+ LoadPInvokeFieldAddress(coder, field, pinvoke);
+ return;
+ }
+ #endif
+
/* Call the static constructor if necessary */
classInfo = ILField_Owner(field);
***************
*** 741,744 ****
--- 811,817 ----
ILUInt32 valueSize = GetStackTypeSize(fieldType);
ILClass *classInfo;
+ #ifdef IL_CONFIG_PINVOKE
+ ILPInvoke *pinvoke;
+ #endif
/* Call the static constructor if necessary */
***************
*** 747,750 ****
--- 820,833 ----
/* Regular or RVA field? */
+ #ifdef IL_CONFIG_PINVOKE
+ if((field->member.attributes & IL_META_FIELDDEF_PINVOKE_IMPL) != 0 &&
+ (pinvoke = ILPInvokeFindField(field)) != 0)
+ {
+ /* Field that is imported via PInvoke */
+ LoadPInvokeFieldAddress(coder, field, pinvoke);
+ CVMStoreFieldReverse(coder, field, fieldType, 0, 0);
+ }
+ else
+ #endif
if((field->member.attributes & IL_META_FIELDDEF_HAS_FIELD_RVA) == 0)
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnet/engine cvmc_obj.c,1.17,1.18,
Rhys Weatherley <address@hidden> <=