Merge pull request #498 from Unroll-Me/master
[mono.git] / mcs / ilasm / parser / ILParser.jay
index b94d64121b1a36638fffc5c6fdd68b3f5c57b352..19a567e0ca5c2ea659d14cc67d8fbace0e18e35a 100644 (file)
@@ -10,6 +10,7 @@ using PEAPI;
 using System;\r
 using System.IO;\r
 using System.Collections;\r
+using System.Collections.Generic;\r
 using System.Globalization;\r
 using System.Reflection;\r
 using System.Security;\r
@@ -32,6 +33,7 @@ namespace Mono.ILASM {
                 private PEAPI.PInvokeAttr pinvoke_attr;\r
                 private ILTokenizer tokenizer;\r
                static int yacc_verbose_flag;\r
+               KeyValuePair<string, TypeAttr> current_extern;\r
 \r
                 class NameValuePair {\r
                         public string Name;\r
@@ -305,7 +307,7 @@ namespace Mono.ILASM {
 %token K_OUT\r
 %token K_OPT\r
 // %token K_LCID\r
-%token K_RETVAL\r
+//%token K_RETVAL\r
 %token K_STATIC\r
 %token K_PUBLIC\r
 %token K_PRIVATE\r
@@ -476,6 +478,7 @@ namespace Mono.ILASM {
 %token K_IS\r
 %token K_ON\r
 %token K_OFF\r
+%token K_FORWARDER\r
 %token K_CHARMAPERROR\r
 \r
 /* end generated */\r
@@ -2158,9 +2161,7 @@ method_decl               : D_EMITBYTE int32
 \r
                                 if (param == null) {\r
                                         Report.Warning (tokenizer.Location, String.Format ("invalid param index ({0}) with .param", index));\r
-                                        break;\r
-                                }\r
-                                if ($5 != null)\r
+                                } else if ($5 != null)\r
                                         param.AddDefaultValue ((Constant) $5);\r
                           }\r
                        | param_type_decl\r
@@ -3203,17 +3204,21 @@ exptype_all             : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE
                        ;\r
 \r
 exptype_head           : D_CLASS K_EXTERN expt_attr comp_name\r
+                                       {\r
+                                               current_extern = new KeyValuePair<string, TypeAttr> ((string) $4, (TypeAttr) $3);\r
+                                       }\r
                        ;\r
 \r
 expt_attr              : /* EMPTY */\r
-                       | expt_attr K_PRIVATE\r
-                       | expt_attr K_PUBLIC \r
-                       | expt_attr K_NESTED K_PUBLIC\r
-                       | expt_attr K_NESTED K_PRIVATE\r
-                       | expt_attr K_NESTED K_FAMILY\r
-                       | expt_attr K_NESTED K_ASSEMBLY\r
-                       | expt_attr K_NESTED K_FAMANDASSEM\r
-                       | expt_attr K_NESTED K_FAMORASSEM\r
+                       | expt_attr K_PRIVATE                   { $$ = (TypeAttr)$1 | TypeAttr.Private; }\r
+                       | expt_attr K_PUBLIC                    { $$ = (TypeAttr)$1 | TypeAttr.Public; }\r
+                       | expt_attr K_NESTED K_PUBLIC           { $$ = (TypeAttr)$1 | TypeAttr.NestedPublic; }\r
+                       | expt_attr K_NESTED K_PRIVATE          { $$ = (TypeAttr)$1 | TypeAttr.NestedPrivate; }\r
+                       | expt_attr K_NESTED K_FAMILY           { $$ = (TypeAttr)$1 | TypeAttr.NestedFamily; }\r
+                       | expt_attr K_NESTED K_ASSEMBLY         { $$ = (TypeAttr)$1 | TypeAttr.NestedAssembly;}\r
+                       | expt_attr K_NESTED K_FAMANDASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
+                       | expt_attr K_NESTED K_FAMORASSEM       { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
+                       | K_FORWARDER                           { $$ = TypeAttr.Forwarder; }\r
                        ;\r
 \r
 exptype_decls          : /* EMPTY */\r
@@ -3222,8 +3227,11 @@ exptype_decls            : /* EMPTY */
 \r
 exptype_decl           : D_FILE comp_name\r
                        | D_CLASS K_EXTERN comp_name\r
-                       | D_CLASS int32\r
                        | customattr_decl\r
+                       | D_ASSEMBLY K_EXTERN comp_name\r
+                         {\r
+                               codegen.ExternTable.AddClass (current_extern.Key, current_extern.Value, (string) $3);\r
+                         }\r
                        ;\r
 \r
 manifestres_all                : manifestres_head OPEN_BRACE manifestres_decls CLOSE_BRACE\r