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_gather.c,1.36,1.37


From: Gopal.V <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnet/cscc/csharp cs_gather.c,1.36,1.37
Date: Fri, 21 Feb 2003 07:18:51 -0500

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

Modified Files:
        cs_gather.c 
Log Message:
support for async delegates in the compiler


Index: cs_gather.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/cscc/csharp/cs_gather.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -C2 -r1.36 -r1.37
*** cs_gather.c 15 Feb 2003 02:14:53 -0000      1.36
--- cs_gather.c 21 Feb 2003 12:18:49 -0000      1.37
***************
*** 1644,1647 ****
--- 1644,1686 ----
  
  /*
+  * Create a formal parameter with a system type
+  */
+ static ILNode_FormalParameter* CreateFormalParameter(char *systemtype,
+                                                                               
                         char *name)
+ {
+       ILNode *param=ILNode_FormalParameter_create(
+                                               NULL,ILParamMod_empty, 
+                                               
ILNode_SystemType_create(systemtype),
+                                               
ILQualIdentSimple(ILInternString(name, -1).string));
+       return (ILNode_FormalParameter*)param;
+ }
+ 
+ /* 
+  * Append parameters in `from' to `to' , the onlyPtrs flag if enabled
+  * appends only out or ref parameters
+  */
+ static void AppendParameters(ILNode *from,ILNode_List *to,int onlyPtrs)
+ {
+       ILNode_ListIter iter;
+       ILNode_FormalParameter *node;
+       if(!yyisa(from,ILNode_List)) return;
+       ILNode_ListIter_Init(&iter,from);
+       while((node = (ILNode_FormalParameter*)ILNode_ListIter_Next(&iter))!=0)
+       {
+               if((!onlyPtrs) || (node->pmod==ILParamMod_ref || 
+                                                       node->pmod == 
ILParamMod_out))
+               {
+                       ILNode_FormalParameter *param= (ILNode_FormalParameter*)
+                                                                               
        ILNode_FormalParameter_create(NULL,
+                                                                               
                        node->pmod,node->type,
+                                                                               
                        node->name);
+                       yysetfilename((ILNode*)param,yygetfilename(node));
+                       yysetlinenum((ILNode*)param, yygetlinenum(node));
+                       ILNode_List_Add(to,param);
+               }
+       }
+ }
+ 
+ /*
   * Create a delegate member definition.
   */
***************
*** 1652,1655 ****
--- 1691,1695 ----
        ILType *signature;
        ILNode_MethodDeclaration *decl;
+       ILNode_List *params;
  
        /* Create the delegate constructor */
***************
*** 1701,1704 ****
--- 1741,1748 ----
                 ILQualIdentSimple(ILInternString("Invoke", -1).string),
                 member->params, 0);
+       
+       yysetfilename((ILNode*)decl,yygetfilename(member));
+       yysetlinenum((ILNode*)decl, yygetlinenum(member));
+ 
        CreateMethod(info, classInfo, decl);
        method = member->invokeMethod = decl->methodInfo;
***************
*** 1710,1713 ****
--- 1754,1822 ----
  
        /* TODO: asynchronous interface for delegates */
+       /* Clone the params list */
+       params=(ILNode_List*)ILNode_List_create();
+       AppendParameters(member->params,params,0);
+ 
+       ILNode_List_Add(params,
+                                               
CreateFormalParameter("AsyncCallback","callback"));
+       ILNode_List_Add(params,
+                                               
CreateFormalParameter("Object","object"));
+ 
+       /* Create the "BeginInvoke" method */
+       decl = (ILNode_MethodDeclaration*) ILNode_MethodDeclaration_create
+                       (0,
+                       IL_META_METHODDEF_PUBLIC |
+                       IL_META_METHODDEF_VIRTUAL |
+                       IL_META_METHODDEF_NEW_SLOT |
+                       IL_META_METHODDEF_HIDE_BY_SIG |
+                       IL_META_METHODDEF_COMPILER_CONTROLLED,
+                       ILNode_SystemType_create("IAsyncResult"),
+                       ILQualIdentSimple(ILInternString("BeginInvoke", 
-1).string),
+                       (ILNode*)params,
+                       0);
+ 
+       yysetfilename((ILNode*)decl,yygetfilename(member));
+       yysetlinenum((ILNode*)decl, yygetlinenum(member));
+ 
+       CreateMethod(info, classInfo, decl);
+       method = member->beginInvokeMethod = decl->methodInfo;
+       if(method)
+       {
+               ILMethodSetImplAttrs(method, ~((ILUInt32)0),
+                                                        
IL_META_METHODIMPL_RUNTIME);
+       }
+ 
+       /* Clone the params list */
+       params=(ILNode_List*)ILNode_List_create();
+       
+       /* Append only the managed parameters */
+       AppendParameters(member->params,params,1);
+ 
+       ILNode_List_Add(params,
+                                               
CreateFormalParameter("IAsyncResult","result"));
+ 
+       /* Create the "EndInvoke" method */
+       decl = (ILNode_MethodDeclaration*) ILNode_MethodDeclaration_create
+                       (0,
+                       IL_META_METHODDEF_PUBLIC |
+                       IL_META_METHODDEF_VIRTUAL |
+                       IL_META_METHODDEF_NEW_SLOT |
+                       IL_META_METHODDEF_HIDE_BY_SIG |
+                       IL_META_METHODDEF_COMPILER_CONTROLLED,
+                       member->returnType,
+                       ILQualIdentSimple(ILInternString("EndInvoke", 
-1).string),
+                       (ILNode*)params,
+                       0);
+       
+       yysetfilename((ILNode*)decl,yygetfilename(member));
+       yysetlinenum((ILNode*)decl, yygetlinenum(member));
+ 
+       CreateMethod(info, classInfo, decl);
+       method = member->endInvokeMethod = decl->methodInfo;
+       if(method)
+       {
+               ILMethodSetImplAttrs(method, ~((ILUInt32)0),
+                                                        
IL_META_METHODIMPL_RUNTIME);
+       }
  }
  





reply via email to

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