dotgnu-pnet-commits
[Top][All Lists]
Advanced

[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)
        {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]