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

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

[Dotgnu-pnet-commits] CVS: pnet/cscc/csharp cs_lvalue.tc,1.47,1.48


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/cscc/csharp cs_lvalue.tc,1.47,1.48
Date: Fri, 30 May 2003 01:16:02 -0400

Update of /cvsroot/dotgnu-pnet/pnet/cscc/csharp
In directory subversions:/tmp/cvs-serv24016/cscc/csharp

Modified Files:
        cs_lvalue.tc 
Log Message:


Implement code generation and semantic analysis for ILNode_DerefField.


Index: cs_lvalue.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/cscc/csharp/cs_lvalue.tc,v
retrieving revision 1.47
retrieving revision 1.48
diff -C2 -r1.47 -r1.48
*** cs_lvalue.tc        30 May 2003 00:43:15 -0000      1.47
--- cs_lvalue.tc        30 May 2003 05:16:00 -0000      1.48
***************
*** 1529,1536 ****
  ILNode_SemAnalysis(ILNode_DerefField)
  {
-       /* TODO */
        CSSemValue value;
        CCUnsafeMessage(info, (ILNode *)node, "unsafe field dereference");
!       CSSemSetRValue(value, ILType_Int32);
        return value;
  }
--- 1529,1587 ----
  ILNode_SemAnalysis(ILNode_DerefField)
  {
        CSSemValue value;
+       ILType *type;
+       char *name;
+       ILClass *classInfo;
+       ILField *field;
+ 
+       /* Emit an "unsafe" message if necessary */
        CCUnsafeMessage(info, (ILNode *)node, "unsafe field dereference");
! 
!       /* Perform semantic analysis on the left hand sub-expression */
!       value = ILNode_SemAnalysis(node->expr1, info, &(node->expr1));
!       if(!CSSemIsValue(value) || !ILType_IsPointer(CSSemGetType(value)))
!       {
!               CCErrorOnLine(yygetfilename(node->expr1), 
yygetlinenum(node->expr1),
!                                         "pointer value expected");
!               CSSemSetLValue(value, ILType_Int32);
!               return value;
!       }
! 
!       /* Make sure that this is a pointer to a struct value type */
!       type = ILTypeStripPrefixes(ILType_Ref(CSSemGetType(value)));
!       if(!ILType_IsValueType(type) || ILTypeIsEnum(type))
!       {
!               CCErrorOnLine(yygetfilename(node->expr1), 
yygetlinenum(node->expr1),
!                                         "`%s' is not a struct type", 
CSTypeToName(type));
!               CSSemSetLValue(value, ILType_Int32);
!               return value;
!       }
! 
!       /* Resolve the field reference */
!       name = ILQualIdentName(node->expr2, 0);
!       classInfo = ILType_ToValueType(type);
!       field = 0;
!       while((field = (ILField *)ILClassNextMemberByKind
!                               (classInfo, (ILMember *)field, 
IL_META_MEMBERKIND_FIELD)) != 0)
!       {
!               if(!ILField_IsStatic(field) && !strcmp(ILField_Name(field), 
name))
!               {
!                       break;
!               }
!       }
!       if(!field)
!       {
!               CCErrorOnLine(yygetfilename(node->expr1), 
yygetlinenum(node->expr1),
!                                         "`%s' is not a member of `%s'",
!                                         name, CSTypeToName(type));
!               CSSemSetLValue(value, ILType_Int32);
!               return value;
!       }
! 
!       /* Set up the node for code generation and return */
!       type = ILField_Type(field);
!       node->field = field;
!       node->machineType = ILTypeToMachineType(type);
!       CSSemSetLValue(value, type);
        return value;
  }





reply via email to

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