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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] pnet ChangeLog codegen/cg_cast.tc codegen/cg_co...


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ChangeLog codegen/cg_cast.tc codegen/cg_co...
Date: Tue, 23 Dec 2008 13:31:15 +0000

CVSROOT:        /cvsroot/dotgnu-pnet
Module name:    pnet
Changes by:     Klaus Treichel <ktreichel>      08/12/23 13:31:15

Modified files:
        .              : ChangeLog 
        codegen        : cg_cast.tc cg_coerce.c cg_decls.tc 
        cscc/csharp    : cs_stmt.tc 
        include        : il_types.h 

Log message:
        Create pinned locals for the expressions in a fixed statement in cscc.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pnet/ChangeLog?cvsroot=dotgnu-pnet&r1=1.3593&r2=1.3594
http://cvs.savannah.gnu.org/viewcvs/pnet/codegen/cg_cast.tc?cvsroot=dotgnu-pnet&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/pnet/codegen/cg_coerce.c?cvsroot=dotgnu-pnet&r1=1.31&r2=1.32
http://cvs.savannah.gnu.org/viewcvs/pnet/codegen/cg_decls.tc?cvsroot=dotgnu-pnet&r1=1.60&r2=1.61
http://cvs.savannah.gnu.org/viewcvs/pnet/cscc/csharp/cs_stmt.tc?cvsroot=dotgnu-pnet&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/pnet/include/il_types.h?cvsroot=dotgnu-pnet&r1=1.30&r2=1.31

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ChangeLog,v
retrieving revision 1.3593
retrieving revision 1.3594
diff -u -b -r1.3593 -r1.3594
--- ChangeLog   21 Dec 2008 18:50:07 -0000      1.3593
+++ ChangeLog   23 Dec 2008 13:31:14 -0000      1.3594
@@ -1,3 +1,20 @@
+2008-12-23  Klaus Treichel  <address@hidden>
+
+       * codegen/cg_cast.tc: Allow cast from managed pointer to unmanaged
+       pointer and vice versa.
+
+       * codegen/cg_coerce.c (GetUnsafeConvertRules): Allow cast from managed
+       pointer to umpanaged pointer in a fixed statement for the address of
+       operator.
+
+       * codegen/cg_decls.tc (DumpILLocals): Dump locals including prefixes.
+
+       * cscc/csharp/cs_stmt.tc: Create a pinned local for the expressions in
+       fixed expression and fixed address.
+
+       * include/il_types.h: Add macro ILType_IsRef to check for managed
+       pointers.
+
 2008-12-21  Klaus Treichel  <address@hidden>
 
        * cscc/csharp/cs_stmt.tc (ILNode_SemAnalysis(ILNode_FixExpr)): Remove 
the

Index: codegen/cg_cast.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/codegen/cg_cast.tc,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- codegen/cg_cast.tc  9 Dec 2008 21:18:20 -0000       1.15
+++ codegen/cg_cast.tc  23 Dec 2008 13:31:14 -0000      1.16
@@ -1652,6 +1652,11 @@
 {
        ILGenSimple(info, IL_OP_CONV_U);
 }
+ILGenCast(ILMachineType_ManagedPtr, ILMachineType_UnmanagedPtr),
+ILGenCast(ILMachineType_UnmanagedPtr, ILMachineType_ManagedPtr)
+{
+       /* Nothing to do here */
+}
 ILGenCast(ILMachineType, ILMachineType_ObjectRef),
 ILGenCast(ILMachineType, ILMachineType_UnmanagedPtr),
 ILGenCast(ILMachineType, ILMachineType_ManagedPtr),

Index: codegen/cg_coerce.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/codegen/cg_coerce.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- codegen/cg_coerce.c 14 Dec 2008 15:20:00 -0000      1.31
+++ codegen/cg_coerce.c 23 Dec 2008 13:31:14 -0000      1.32
@@ -440,6 +440,21 @@
                                }
                        }
                }
+
+               /* Managed Pointer to pointer conversion */
+               if(ILType_IsPointer(toType) && ILType_IsRef(fromType))
+               {
+                       if(ILType_Ref(toType) == ILType_Void)
+                       {
+                               /* We can allways cast to void * */
+                               return 1;
+                       }
+
+                       if(ILTypeIdentical(ILType_Ref(fromType), 
ILType_Ref(toType)))
+                       {
+                               return 1;
+                       }
+               }               
        }
 
        /* Could not find an appropriate conversion */

Index: codegen/cg_decls.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/codegen/cg_decls.tc,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -b -r1.60 -r1.61
--- codegen/cg_decls.tc 26 Nov 2008 20:15:17 -0000      1.60
+++ codegen/cg_decls.tc 23 Dec 2008 13:31:14 -0000      1.61
@@ -614,7 +614,7 @@
                                fputs(", ", outstream);
                        }
                        ILDumpType(outstream, info->image,
-                                          ILTypeGetLocal(localVarSig, index),
+                                          
ILTypeGetLocalWithPrefixes(localVarSig, index),
                                           IL_DUMP_QUOTE_NAMES);
                }
                fputs(")\n", outstream);

Index: cscc/csharp/cs_stmt.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/cscc/csharp/cs_stmt.tc,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- cscc/csharp/cs_stmt.tc      21 Dec 2008 18:50:15 -0000      1.44
+++ cscc/csharp/cs_stmt.tc      23 Dec 2008 13:31:15 -0000      1.45
@@ -152,6 +152,93 @@
        }
 }
 
+static ILNode *HandleFixedExpr(ILGenInfo *info, ILNode *nameNode,
+                                                          ILNode *exprNode, 
ILNode **exprParent,
+                                                          int isFixAddress)
+{
+       CSSemValue value;
+       ILNode *expr;
+
+       /* Perform semantic analysis on the expression */
+       value = ILNode_SemAnalysis(exprNode, info, exprParent);
+
+       /* Assign the value to a pinned local. */
+       if(CSSemIsValue(value))
+       {
+               ILNode *pinnedVar;
+               unsigned long tempVar;
+               ILNode_MethodDeclaration *method;
+               ILType *pinnedType;
+               ILType *type = CSSemGetType(value);
+
+               /* Locate the method that this local is declared within */
+               method = (ILNode_MethodDeclaration *)(info->currentMethod);
+
+               expr = *exprParent;
+
+               if(isFixAddress && ILType_IsPointer(type))
+               {
+                       type = ILTypeCreateRef(info->context, 
IL_TYPE_COMPLEX_BYREF,
+                                                                  
ILType_Ref(type));
+
+                       if(!type)
+                       {
+                               CCOutOfMemory();
+                       }
+                       CSSemSetValueKind(value, CSSemGetKind(value), type);
+               }
+
+               /* Create the local variable signature for this method */
+               if(!(method->localVarSig))
+               {
+                       method->localVarSig = 
ILTypeCreateLocalList(info->context);
+                       if(!(method->localVarSig))
+                       {
+                               CCOutOfMemory();
+                       }
+               }
+                       
+               pinnedType = ILTypeCreateRef(info->context, 
IL_TYPE_COMPLEX_PINNED,
+                                                                        type);
+               if(!pinnedType)
+               {
+                       ILGenOutOfMemory(info);
+               }
+
+               if(!ILTypeAddLocal(info->context, method->localVarSig, 
pinnedType))
+               {
+                       CCOutOfMemory();
+               }
+
+               tempVar = ILTypeNumLocals(method->localVarSig) - 1;
+               pinnedVar = ILNode_LocalVar_create(tempVar, 
ILTypeToMachineType(type));
+
+               /* Assign the value to the pinned variable */
+               expr = ILNode_Assign_create(pinnedVar, expr);
+               yysetfilename(expr, yygetfilename(exprNode));
+               yysetlinenum(expr, yygetlinenum(exprNode));
+
+               /* Wrap the expression to prevent double evaluation */
+               expr = ILNode_SemGuard_create(expr, value);
+               yysetfilename(expr, yygetfilename(expr));
+               yysetlinenum(expr, yygetlinenum(expr));
+       }
+       else
+       {
+               /* Wrap the expression to prevent double evaluation */
+               expr = ILNode_SemGuard_create(*exprParent, value);
+               yysetfilename(expr, yygetfilename(exprNode));
+               yysetlinenum(expr, yygetlinenum(exprNode));
+       }
+
+       /* Assign the value to the variable */
+       expr = ILNode_Assign_create(nameNode, expr);
+       yysetfilename(expr, yygetfilename(nameNode));
+       yysetlinenum(expr, yygetlinenum(nameNode));
+
+       return expr;
+}
+
 %}
 
 /*
@@ -1762,10 +1849,11 @@
  */
 ILNode_SemAnalysis(ILNode_FixAddress)
 {
-       *parent=ILNode_Assign_create(node->name,node->address);
-       yysetfilename(*parent, yygetfilename(node));
-       yysetlinenum(*parent, yygetlinenum(node));
-       ILNode_SemAnalysis(*parent,info,parent);
+       *parent = HandleFixedExpr(info, node->name, node->address,
+                                                         &(node->address), 1);
+
+       /* Perform semantic analysis on the assignment */
+       ILNode_SemAnalysis(*parent, info, parent);
        return CSSemValueDefault;
 }
 
@@ -1774,10 +1862,7 @@
  */
 ILNode_SemAnalysis(ILNode_FixExpr)
 {
-       /* Assign the value to the variable */
-       *parent = ILNode_Assign_create(node->name, node->expr);
-       yysetfilename(*parent, yygetfilename(node));
-       yysetlinenum(*parent, yygetlinenum(node));
+       *parent = HandleFixedExpr(info, node->name, node->expr, &(node->expr), 
0);
 
        /* Perform semantic analysis on the assignment */
        ILNode_SemAnalysis(*parent, info, parent);

Index: include/il_types.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/include/il_types.h,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- include/il_types.h  18 Nov 2008 20:06:08 -0000      1.30
+++ include/il_types.h  23 Dec 2008 13:31:15 -0000      1.31
@@ -235,6 +235,13 @@
                                  ((type)->kind__ & 0xFF) == 
IL_TYPE_COMPLEX_SENTINEL))
 
 /*
+ * Determine if a type is a managed pointer.
+ */
+#define        ILType_IsRef(type)      \
+                               ((type) != 0 && ILType_IsComplex((type)) && \
+                                ILType_Kind((type)) == IL_TYPE_COMPLEX_BYREF)
+
+/*
  * Determine if a type is a pointer.
  */
 #define        ILType_IsPointer(type)  \




reply via email to

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