New tests.
[mono.git] / mcs / ilasm / parser / ILParser.jay
index 24dbe615e8416e26a7c4318072b83b85af8e7c75..b94d64121b1a36638fffc5c6fdd68b3f5c57b352 100644 (file)
@@ -11,6 +11,12 @@ using System;
 using System.IO;\r
 using System.Collections;\r
 using System.Globalization;\r
+using System.Reflection;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+\r
+using MIPermission = Mono.ILASM.Permission;\r
+using MIPermissionSet = Mono.ILASM.PermissionSet;\r
 \r
 namespace Mono.ILASM {\r
 \r
@@ -26,7 +32,91 @@ namespace Mono.ILASM {
                 private PEAPI.PInvokeAttr pinvoke_attr;\r
                 private ILTokenizer tokenizer;\r
                static int yacc_verbose_flag;\r
+\r
+                class NameValuePair {\r
+                        public string Name;\r
+                        public object Value;\r
+\r
+                        public NameValuePair (string name, object value)\r
+                        {\r
+                                this.Name = name;\r
+                                this.Value = value;\r
+                        }\r
+                }\r
+\r
+                class PermPair {\r
+                        public PEAPI.SecurityAction sec_action;\r
+                        public object perm;\r
+\r
+                        public PermPair (PEAPI.SecurityAction sec_action, object perm)\r
+                        {\r
+                                this.sec_action = sec_action;\r
+                                this.perm = perm;\r
+                        }\r
+                }\r
+\r
+                public bool CheckSecurityActionValidity (System.Security.Permissions.SecurityAction action, bool for_assembly)\r
+                {\r
+                        if ((action == System.Security.Permissions.SecurityAction.RequestMinimum || \r
+                                action == System.Security.Permissions.SecurityAction.RequestOptional || \r
+                                action == System.Security.Permissions.SecurityAction.RequestRefuse) && !for_assembly) {\r
+                                Report.Warning (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));\r
+                                return false;\r
+                        }\r
+\r
+                        return true;\r
+                }\r
+\r
+               public void AddSecDecl (object perm, bool for_assembly)\r
+               {\r
+                       PermPair pp = perm as PermPair;\r
+\r
+                       if (pp == null) {\r
+                               MIPermissionSet ps_20 = (MIPermissionSet) perm;\r
+                               codegen.AddPermission (ps_20.SecurityAction, ps_20);\r
+                               return;\r
+                       }\r
+\r
+                       if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) pp.sec_action, for_assembly))\r
+                               Report.Error (String.Format ("Invalid security action : {0}", pp.sec_action));\r
+\r
+                       codegen.AddPermission (pp.sec_action, pp.perm);\r
+               }\r
+\r
+                public object ClassRefToObject (object class_ref, object val)\r
+                {\r
+                        ExternTypeRef etr = class_ref as ExternTypeRef;\r
+                        if (etr == null)\r
+                                /* FIXME: report error? can be PrimitiveTypeRef or TypeRef */\r
+                                return null;\r
                                 \r
+                        System.Type t = etr.GetReflectedType ();\r
+                        return (t.IsEnum ? Enum.Parse (t, String.Format ("{0}", val)) : val);\r
+                }\r
+\r
+               /* Converts a type_spec to a corresponding PermPair */\r
+                PermPair TypeSpecToPermPair (object action, object type_spec, ArrayList pairs)\r
+                {\r
+                        ExternTypeRef etr = type_spec as ExternTypeRef;\r
+                        if (etr == null)\r
+                                /* FIXME: could be PrimitiveTypeRef or TypeRef \r
+                                          Report what error? */\r
+                                return null;\r
+\r
+                        System.Type t = etr.GetReflectedType ();\r
+                        object obj = Activator.CreateInstance (t, \r
+                                                new object [] {(System.Security.Permissions.SecurityAction) (short) action});\r
+\r
+                        if (pairs != null)\r
+                                foreach (NameValuePair pair in pairs) {\r
+                                        PropertyInfo pi = t.GetProperty (pair.Name);\r
+                                        pi.SetValue (obj, pair.Value, null);\r
+                                }\r
+\r
+                        IPermission iper = (IPermission) t.GetMethod ("CreatePermission").Invoke (obj, null);\r
+                        return new PermPair ((PEAPI.SecurityAction) action, iper);\r
+                }\r
+\r
                public ILParser (CodeGen codegen, ILTokenizer tokenizer)\r
                 {\r
                        this.codegen = codegen;\r
@@ -37,19 +127,10 @@ namespace Mono.ILASM {
                        get { return codegen; }\r
                }\r
 \r
-                private ITypeRef GetTypeRef (ITypeRef b)\r
+                private BaseTypeRef GetTypeRef (BaseTypeRef b)\r
                 {\r
-                        ExternTypeRefInst etri = b as ExternTypeRefInst;\r
-                        ExternTypeRef etr;\r
-\r
-                        if (etri != null)\r
-                                return etri.Clone ();\r
-\r
-                        etr = b as ExternTypeRef;\r
-                        if (etr != null)\r
-                                return etr.Clone ();\r
-\r
-                        return b;\r
+                        //FIXME: Caching required.. \r
+                        return b.Clone ();\r
                 }\r
 \r
 %}\r
@@ -147,7 +228,6 @@ namespace Mono.ILASM {
 %token D_CLASS\r
 %token D_COMTYPE\r
 %token D_CONFIG\r
-%token D_CONSTRAINT\r
 %token D_IMAGEBASE\r
 %token D_CORFLAGS\r
 %token D_CTOR\r
@@ -224,7 +304,7 @@ namespace Mono.ILASM {
 %token K_IN\r
 %token K_OUT\r
 %token K_OPT\r
-%token K_LCID\r
+// %token K_LCID\r
 %token K_RETVAL\r
 %token K_STATIC\r
 %token K_PUBLIC\r
@@ -232,6 +312,7 @@ namespace Mono.ILASM {
 %token K_FAMILY\r
 %token K_INITONLY\r
 %token K_RTSPECIALNAME\r
+%token K_STRICT\r
 %token K_SPECIALNAME\r
 %token K_ASSEMBLY\r
 %token K_FAMANDASSEM\r
@@ -249,6 +330,7 @@ namespace Mono.ILASM {
 %token K_ANSI\r
 %token K_UNICODE\r
 %token K_AUTOCHAR\r
+%token K_BESTFIT\r
 %token K_IMPORT\r
 %token K_SERIALIZABLE\r
 %token K_NESTED\r
@@ -292,6 +374,11 @@ namespace Mono.ILASM {
 %token K_FLOAT64\r
 %token K_ERROR\r
 %token K_UNSIGNED\r
+%token K_UINT\r
+%token K_UINT8\r
+%token K_UINT16\r
+%token K_UINT32\r
+%token K_UINT64\r
 %token K_DECIMAL\r
 %token K_DATE\r
 %token K_BSTR\r
@@ -332,6 +419,7 @@ namespace Mono.ILASM {
 %token K_MODREQ\r
 %token K_MODOPT\r
 %token K_TYPEDREF\r
+%token K_TYPE\r
 %token K_WCHAR\r
 %token K_CHAR\r
 %token K_FROMUNMANAGED\r
@@ -347,6 +435,7 @@ namespace Mono.ILASM {
 %token K_HANDLER\r
 %token K_TLS\r
 %token K_FIELD\r
+%token K_PROPERTY\r
 %token K_REQUEST\r
 %token K_DEMAND\r
 %token K_ASSERT\r
@@ -368,9 +457,10 @@ namespace Mono.ILASM {
 %token K_FULLORIGIN\r
 // %token K_NAN\r
 // %token K_INF\r
-%token K_PUBLICKEY\r
+// %token K_PUBLICKEY\r
 %token K_ENABLEJITTRACKING\r
 %token K_DISABLEJITOPTIMIZER\r
+%token K_RETARGETABLE\r
 %token K_PRESERVESIG\r
 %token K_BEFOREFIELDINIT\r
 %token K_ALIGNMENT\r
@@ -384,6 +474,9 @@ namespace Mono.ILASM {
 %token K_TRUE\r
 %token K_FALSE\r
 %token K_IS\r
+%token K_ON\r
+%token K_OFF\r
+%token K_CHARMAPERROR\r
 \r
 /* end generated */\r
 \r
@@ -416,6 +509,10 @@ decl                       : class_all
                        | module_head\r
                        | sec_decl\r
                        | customattr_decl\r
+                         {\r
+                               if (codegen.CurrentCustomAttrTarget != null)\r
+                                       codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+                         }\r
                        | D_SUBSYSTEM int32\r
                           {\r
                                 codegen.SetSubSystem ((int) $2);\r
@@ -429,6 +526,10 @@ decl                       : class_all
                           {\r
                                 codegen.SetImageBase ((long) $2);\r
                           }\r
+                       | D_STACKRESERVE int64\r
+                          {\r
+                               codegen.SetStackReserve ((long) $2);\r
+                          }\r
                        | extsource_spec\r
                        | language_decl\r
                        ;\r
@@ -444,11 +545,6 @@ language_decl              : D_LANGUAGE SQSTRING
                        | D_LANGUAGE SQSTRING COMMA SQSTRING COMMA SQSTRING\r
                        ;\r
 \r
-constraint_decl         : D_CONSTRAINT BANG int32 K_IS type\r
-                          {\r
-                                codegen.CurrentTypeDef.AddGenericConstraint ((int) $3, (ITypeRef) $5);\r
-                          }\r
-                        ;\r
                         \r
 vtfixup_decl           : D_VTFIXUP OPEN_BRACKET int32 CLOSE_BRACKET \r
                          vtfixup_attr K_AT id\r
@@ -479,22 +575,16 @@ class_all         : class_head OPEN_BRACE class_decls CLOSE_BRACE
                           }\r
                        ;\r
 \r
-class_head             : D_CLASS class_attr id formal_typars_clause extends_clause\r
+class_head             : D_CLASS class_attr comp_name formal_typars_clause extends_clause\r
                           impl_clause\r
                           {\r
                                 codegen.BeginTypeDef ((TypeAttr) $2, (string) $3, \r
-                                               $5 as IClassRef, $6 as ArrayList, null);\r
+                                               $5 as BaseClassRef, $6 as ArrayList, null, (GenericParameters) $4);\r
                                \r
                                if (is_value_class)\r
                                        codegen.CurrentTypeDef.MakeValueClass ();\r
                                if (is_enum_class)\r
                                        codegen.CurrentTypeDef.MakeEnumClass ();\r
-\r
-                                if ($4 != null) {\r
-                                        ArrayList typars_list = (ArrayList) $4;\r
-                                        foreach (string id in typars_list)\r
-                                                codegen.CurrentTypeDef.AddGenericParam (id);\r
-                                }                                \r
                           }\r
                        ;\r
 \r
@@ -536,67 +626,197 @@ class_attr               : /* EMPTY */
                        ;\r
 \r
 extends_clause         : /* EMPTY */\r
-                       | K_EXTENDS class_ref\r
+                       | K_EXTENDS generic_class_ref\r
                           {\r
                                 $$ = $2;\r
                           }\r
                        ;\r
 \r
 impl_clause            : /* EMPTY */\r
-                       | K_IMPLEMENTS class_refs\r
+                       | impl_class_refs\r
+                       ;\r
+\r
+impl_class_refs                : K_IMPLEMENTS generic_class_ref\r
                           {\r
-                                $$ = $2;\r
+                                ArrayList al = new ArrayList ();\r
+                                al.Add ($2);\r
+                                $$ = al;\r
                           }\r
-                       ;\r
+                       | impl_class_refs COMMA generic_class_ref\r
+                          {\r
+                                ArrayList al = (ArrayList) $1;\r
+\r
+                                al.Insert (0, $3);\r
+                                $$ = al;\r
+                          }\r
+                       ;\r
 \r
 formal_typars_clause           : /* EMPTY */\r
                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
                           {\r
+#if NET_2_0 || BOOTSTRAP_NET_2_0\r
                                 $$ = $2;\r
+#else\r
+                               Report.Error ("Use ilasm2 for generics support.");\r
+#endif\r
                           }\r
                         ;\r
 \r
 typars_clause           : /* EMPTY */\r
                         | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
                           {\r
+#if NET_2_0 || BOOTSTRAP_NET_2_0\r
                                 $$ = $2;\r
+#else\r
+                               Report.Error ("Use ilasm2 for generics support.");\r
+#endif\r
                           }\r
                         ;\r
 \r
 typars                  : type\r
                           {\r
-                                ArrayList typars_list = new ArrayList ();\r
-                                typars_list.Add ($1);\r
-                                $$ = typars_list;\r
+                                GenericArguments ga = new GenericArguments ();\r
+                                ga.Add ((BaseTypeRef) $1);\r
+                                $$ = ga;\r
                           }\r
                         | typars COMMA type\r
                           {\r
-                                ArrayList typars_list = (ArrayList) $1;\r
-                                typars_list.Add ($3);\r
-                                $$ = typars_list;\r
+                                ((GenericArguments) $1).Add ((BaseTypeRef) $3);\r
+                                $$ = $1;\r
                           }\r
                         ;\r
 \r
-formal_typars           : formal_typar\r
+constraints_clause     : /* EMTPY */\r
+                       | OPEN_PARENS constraints CLOSE_PARENS\r
                           {\r
-                                ArrayList formal_list = new ArrayList ();\r
-                                formal_list.Add ($1);\r
-                                $$ = formal_list;\r
+                                $$ = $2;\r
                           }\r
-                        | formal_typars COMMA formal_typar\r
+                       ;\r
+\r
+\r
+constraints            : generic_class_ref\r
+                         {\r
+                                ArrayList al = new ArrayList ();\r
+                                al.Add ($1);\r
+                                $$ = al;\r
+                           }\r
+                       | constraints COMMA generic_class_ref\r
                           {\r
-                                ArrayList formal_list = (ArrayList) $1;\r
-                                formal_list.Add ($3);\r
-                                $$ = formal_list;\r
+                                ArrayList al = (ArrayList) $1;\r
+                                al.Add ($3);\r
+                                $$ = al;\r
                           }\r
-                        ;\r
+                       ;\r
 \r
+generic_class_ref      : class_ref\r
+                         {\r
+                                $$ = $1;\r
+                         }\r
+                       | K_CLASS class_ref typars_clause\r
+                         {\r
+                                if ($3 != null)\r
+                                        $$ = ((BaseClassRef) $2).GetGenericTypeInst ((GenericArguments) $3);\r
+                                else\r
+                                        $$ = $2;\r
+                         }\r
+                       | BANG int32\r
+                          {\r
+                                GenParam gpar = new GenParam ((int) $2, "", GenParamType.Var);\r
+                                $$ = new GenericParamRef (gpar, $2.ToString ());\r
+                          }\r
+                        | BANG BANG int32\r
+                          {\r
+                                GenParam gpar = new GenParam ((int) $3, "", GenParamType.MVar);\r
+                                $$ = new GenericParamRef (gpar, $3.ToString ());\r
+                          }\r
+                       | BANG id\r
+                          {\r
+                               int num = -1;\r
+                               string name = (string) $2;\r
+                               if (codegen.CurrentTypeDef != null)\r
+                                       num = codegen.CurrentTypeDef.GetGenericParamNum (name);\r
+                               GenParam gpar = new GenParam (num, name, GenParamType.Var);\r
+                                $$ = new GenericParamRef (gpar, name);\r
+                          }\r
+                        | BANG BANG id\r
+                          {\r
+                               int num = -1;\r
+                               string name = (string) $3;\r
+                               if (codegen.CurrentMethodDef != null)\r
+                                       num = codegen.CurrentMethodDef.GetGenericParamNum (name);\r
+                               GenParam gpar = new GenParam (num, name, GenParamType.MVar);\r
+                                $$ = new GenericParamRef (gpar, name);\r
+                          }\r
+                       ; \r
+\r
+formal_typars           : formal_typar_attr constraints_clause formal_typar\r
+                          {\r
+                                GenericParameter gp = new GenericParameter ((string) $3, (PEAPI.GenericParamAttributes) $1, (ArrayList) $2);\r
+\r
+                                GenericParameters colln = new GenericParameters ();\r
+                                colln.Add (gp);\r
+                                $$ = colln;\r
+                          }\r
+                        | formal_typars COMMA formal_typar_attr constraints_clause formal_typar\r
+                          {\r
+                                GenericParameters colln = (GenericParameters) $1;\r
+                                colln.Add (new GenericParameter ((string) $5, (PEAPI.GenericParamAttributes) $3, (ArrayList) $4));\r
+                                $$ = colln;\r
+                          }\r
+                         ;\r
\r
+formal_typar_attr      : /* EMPTY */\r
+                          {\r
+                                $$ = new PEAPI.GenericParamAttributes ();\r
+                          }\r
+                       | formal_typar_attr PLUS\r
+                          {\r
+                               $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.Covariant; \r
+                          }\r
+                       | formal_typar_attr DASH\r
+                          {\r
+                               $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.Contravariant; \r
+                          }\r
+                       | formal_typar_attr D_CTOR\r
+                          {\r
+                               $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.DefaultConstructorConstrait; \r
+                          }\r
+                       | formal_typar_attr K_VALUETYPE\r
+                          {\r
+                               $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.NotNullableValueTypeConstraint; \r
+                          }\r
+                       | formal_typar_attr K_CLASS\r
+                          {\r
+                               $$ = (PEAPI.GenericParamAttributes) $1 | PEAPI.GenericParamAttributes.ReferenceTypeConstraint; \r
+                          }\r
+                        ;\r
 \r
 formal_typar            : id\r
                           {\r
                                 $$ = $1;\r
                           }\r
                         ;\r
+\r
+param_type_decl         : D_PARAM K_TYPE id\r
+                         {\r
+                                 if (codegen.CurrentMethodDef != null)\r
+                                         codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam ((string) $3);\r
+                                 else\r
+                                         codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam ((string) $3);\r
+                                 if (codegen.CurrentCustomAttrTarget == null)\r
+                                         Report.Error (String.Format ("Type parameter '{0}' undefined.", (string) $3));\r
+                         }\r
+                       | D_PARAM K_TYPE OPEN_BRACKET int32 CLOSE_BRACKET\r
+                         {\r
+                                 int index = ((int) $4);\r
+                                 if (codegen.CurrentMethodDef != null)\r
+                                         codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetGenericParam (index - 1);\r
+                                 else\r
+                                         codegen.CurrentCustomAttrTarget = codegen.CurrentTypeDef.GetGenericParam (index - 1);\r
+                                 if (codegen.CurrentCustomAttrTarget == null)\r
+                                         Report.Error (String.Format ("Type parameter '{0}' index out of range.", index));\r
+                         }\r
+                       ;\r
                         \r
 class_refs             : class_ref\r
                           {\r
@@ -621,7 +841,7 @@ slashed_name                : comp_name
 class_ref              : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
                           {\r
                                 if (codegen.IsThisAssembly ((string) $2)) {\r
-                                        $$ = new TypeRef ((string) $4, false, null);\r
+                                        $$ = codegen.GetTypeRef ((string) $4);\r
                                 } else {\r
                                         $$ = codegen.ExternTable.GetTypeRef ((string) $2, (string) $4, false);\r
                                 }\r
@@ -629,7 +849,7 @@ class_ref           : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name
                        | OPEN_BRACKET D_MODULE slashed_name CLOSE_BRACKET slashed_name\r
                           {\r
                                 if (codegen.IsThisModule ((string) $3)) {\r
-                                        $$ = new TypeRef ((string) $5, false, null);\r
+                                        $$ = codegen.GetTypeRef ((string) $5);\r
                                 } else {\r
                                         $$ = codegen.ExternTable.GetModuleTypeRef ((string) $3, (string) $5, false);\r
                                 }\r
@@ -638,10 +858,10 @@ class_ref         : OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name
                           {\r
                                 PrimitiveTypeRef prim = PrimitiveTypeRef.GetPrimitiveType ((string) $1);\r
 \r
-                                if (prim != null)\r
+                                if (prim != null && !codegen.IsThisAssembly ("mscorlib"))\r
                                         $$ = prim;\r
                                 else\r
-                                        $$ = new TypeRef ((string) $1, false, null);\r
+                                        $$ = codegen.GetTypeRef ((string) $1);\r
                           }\r
                       \r
                        ;\r
@@ -657,11 +877,16 @@ class_decl                : method_all
                        | field_decl\r
                        | data_decl\r
                        | sec_decl\r
+                         {\r
+                               AddSecDecl ($1, false);\r
+                         }\r
                        | extsource_spec\r
                        | customattr_decl\r
                           {\r
-                                codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+                                if (codegen.CurrentCustomAttrTarget != null)\r
+                                        codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
                           }\r
+                       | param_type_decl\r
                        | D_SIZE int32\r
                           {\r
                                 codegen.CurrentTypeDef.SetSize ((int) $2);\r
@@ -677,134 +902,118 @@ class_decl              : method_all
                                 // My copy of the spec didn't have a type_list but\r
                                 // it seems pretty crucial\r
                                 //\r
-                                ITypeRef owner = (ITypeRef) $2;\r
+                                BaseTypeRef owner = (BaseTypeRef) $2;\r
                                 ArrayList arg_list = (ArrayList) $11;\r
-                                ITypeRef[] param_list;\r
-                                IMethodRef decl;\r
+                                BaseTypeRef[] param_list;\r
+                                BaseMethodRef decl;\r
 \r
                                 if (arg_list != null)\r
-                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                        param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
                                 else\r
-                                        param_list = new ITypeRef[0];\r
+                                        param_list = new BaseTypeRef[0];\r
 \r
-                                decl = owner.GetMethodRef ((ITypeRef) $7,\r
-                                        (CallConv) $6, (string) $4, param_list);\r
+                                decl = owner.GetMethodRef ((BaseTypeRef) $7,\r
+                                        (CallConv) $6, (string) $4, param_list, 0);\r
 \r
                                // NOTICE: `owner' here might be wrong\r
-                                string sig = MethodDef.CreateSignature (owner, (string) $10,\r
-                                                                        param_list);\r
+                                string sig = MethodDef.CreateSignature (owner, (CallConv) $6, (string) $10,\r
+                                                                        param_list, 0, false);\r
                                 codegen.CurrentTypeDef.AddOverride (sig, decl);                                        \r
                           }\r
                          OPEN_PARENS sig_args CLOSE_PARENS\r
                        | language_decl\r
-                        | constraint_decl\r
                        ;\r
 \r
-type                   : K_CLASS class_ref\r
+type                   : generic_class_ref\r
                           {\r
-                                $$ = $2;\r
+                               $$ = $1;\r
                           }\r
                        | K_OBJECT\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
                           }\r
-                       | K_STRING\r
-                          {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
-                          }\r
                        | K_VALUE K_CLASS class_ref\r
                           {\r
-                               IClassRef class_ref = (IClassRef) $3;\r
+                               BaseClassRef class_ref = (BaseClassRef) $3;\r
                                class_ref.MakeValueClass ();\r
                                 $$ = class_ref;\r
                           }\r
-                       | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name\r
+                       | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name typars_clause\r
                           {\r
                                 ExternTypeRef ext_ref = codegen.ExternTable.GetTypeRef ((string) $3, (string) $5, true);\r
-                                ExternTypeRefInst inst = new ExternTypeRefInst (ext_ref, true);\r
-                                $$ = inst;\r
+                                if ($6 != null)\r
+                                        $$ = ext_ref.GetGenericTypeInst ((GenericArguments) $6);\r
+                                else\r
+                                        $$ = ext_ref;\r
                           }\r
-                        | K_VALUETYPE slashed_name\r
+                        | K_VALUETYPE slashed_name typars_clause\r
                           {\r
-                                TypeRef t_ref = new TypeRef ((string) $2, true, null);\r
+                                TypeRef t_ref = codegen.GetTypeRef ((string) $2);\r
                                 t_ref.MakeValueClass ();\r
-                                $$ = t_ref;\r
+                                if ($3 != null)\r
+                                        $$ = t_ref.GetGenericTypeInst ((GenericArguments) $3);\r
+                                else\r
+                                        $$ = t_ref;\r
                           }\r
                        | type OPEN_BRACKET CLOSE_BRACKET\r
                           {\r
-                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
                                 base_type.MakeArray ();\r
                                 $$ = base_type;\r
                           }\r
                        | type OPEN_BRACKET bounds CLOSE_BRACKET\r
                           {\r
-                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
                                 ArrayList bound_list = (ArrayList) $3;\r
                                 base_type.MakeBoundArray (bound_list);\r
                                 $$ = base_type;\r
                           }\r
                        | type AMPERSAND\r
                           {\r
-                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
                                 base_type.MakeManagedPointer ();\r
                                 $$ = base_type;\r
                           }\r
                        | type STAR\r
                           {\r
-                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
                                 base_type.MakeUnmanagedPointer ();\r
                                 $$ = base_type;\r
                           }\r
                        | type K_PINNED\r
                           {\r
-                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
+                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
                                 base_type.MakePinned ();\r
                                 $$ = base_type;\r
                           }\r
                        | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
                           {\r
-                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
-                                IClassRef class_ref = (IClassRef) $4;\r
+                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+                                BaseClassRef class_ref = (BaseClassRef) $4;\r
                                 base_type.MakeCustomModified (codegen,\r
-                                        CustomModifier.modopt, class_ref);\r
+                                        CustomModifier.modreq, class_ref);\r
                                 $$ = base_type;\r
                           }\r
                        | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
                           {\r
-                                ITypeRef base_type = GetTypeRef ((ITypeRef) $1);\r
-                                IClassRef class_ref = (IClassRef) $4;\r
+                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+                                BaseClassRef class_ref = (BaseClassRef) $4;\r
                                 base_type.MakeCustomModified (codegen,\r
                                         CustomModifier.modopt, class_ref);\r
                                 $$ = base_type;\r
                           }\r
                        | K_METHOD call_conv type STAR OPEN_PARENS sig_args CLOSE_PARENS\r
                           {\r
-                                $$ = new MethodPointerTypeRef ((CallConv) $2, (ITypeRef) $3, (ArrayList) $6);\r
-                          }\r
-                       | K_TYPEDREF\r
-                          {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
-                                        "System.TypedReference");\r
-                          }\r
-                       | K_CHAR\r
-                          {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
-                          }\r
-                       | K_WCHAR\r
-                         {\r
-                               $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
-                         }\r
-                       | K_VOID\r
-                          {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
+                                $$ = new MethodPointerTypeRef ((CallConv) $2, (BaseTypeRef) $3, (ArrayList) $6);\r
                           }\r
-                       | K_BOOL\r
-                          {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Bool");\r
-                          }\r
-                       | K_INT8\r
+                       | primitive_type\r
+                       ;\r
+\r
+                       ;\r
+\r
+primitive_type         : K_INT8\r
                           {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.Int8");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
                           }\r
                        | K_INT16\r
                           {\r
@@ -820,58 +1029,81 @@ type                     : K_CLASS class_ref
                           }\r
                        | K_FLOAT32\r
                           {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Float32");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Float32, "System.Single");\r
                           }\r
                        | K_FLOAT64\r
                           {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Float64");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Float64, "System.Double");\r
                           }\r
                        | K_UNSIGNED K_INT8\r
                           {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.UInt8");\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");\r
+                          }\r
+                       | K_UINT8\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt8, "System.Byte");\r
                           }\r
                        | K_UNSIGNED K_INT16\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
                           }\r
+                       | K_UINT16\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
+                          }\r
                        | K_UNSIGNED K_INT32\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
                           }\r
+                       | K_UINT32\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
+                          }\r
                        | K_UNSIGNED K_INT64\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
                           }\r
+                       | K_UINT64\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.UInt64, "System.UInt64");\r
+                          }\r
                        | K_NATIVE K_INT\r
                           {\r
                                 // TODO: Is this the proper full name\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeInt, "System.IntPtr");\r
                           }\r
-                        \r
                        | K_NATIVE K_UNSIGNED K_INT\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
                           }\r
-                        | BANG int32\r
+                       | K_NATIVE K_UINT\r
                           {\r
-                                GenericTypeSpec spec = new GenericTypeSpec ((int) $2);\r
-                                $$ = new GenericTypeRef (spec, $2.ToString ());\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\r
                           }\r
-                        | BANG BANG int32\r
+                       | K_TYPEDREF\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.TypedRef,\r
+                                        "System.TypedReference");\r
+                          }\r
+                       | K_CHAR\r
                           {\r
-                                MVar mvar = new MVar ((int) $3);\r
-                                $$ = new GenericTypeRef (mvar, $3.ToString ());\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
                           }\r
-                        | K_CLASS slashed_name OPEN_ANGLE_BRACKET BANG int32 CLOSE_ANGLE_BRACKET\r
+                       | K_WCHAR\r
+                         {\r
+                               $$ = new PrimitiveTypeRef (PrimitiveType.Char, "System.Char");\r
+                         }\r
+                       | K_VOID\r
                           {\r
-                                $$ = new TypeRef ((string) $2, false, null);\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Void, "System.Void");\r
                           }\r
-                        | K_CLASS slashed_name OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
+                       | K_BOOL\r
                           {\r
-                                ArrayList typar_list = (ArrayList) $4;\r
-                                ITypeRef[] typar_array = (ITypeRef[]) typar_list.ToArray (typeof (ITypeRef));\r
-                                \r
-                                $$ = new GenericTypeInst ((string)$2, typar_array);\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Boolean");\r
+                          }\r
+                       | K_STRING\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
                           }\r
                        ;\r
 \r
@@ -900,14 +1132,23 @@ bound                    : /* EMPTY */
                           }\r
                        | int32\r
                           {\r
-                                // ******** Not sure what this is?\r
-                                // For now I will say it is size because there\r
-                                // is allready a way to set lower\r
-                                $$ = new DictionaryEntry (TypeRef.Ellipsis, $1);\r
+                                /* Only size specified */ \r
+                                int size = (int) $1;\r
+                                if (size < 0)\r
+                                        /* size cannot be < 0, so emit as (0, ...)\r
+                                           ilasm.net emits it like this */\r
+                                        $$ = new DictionaryEntry (0, TypeRef.Ellipsis);\r
+                                else\r
+                                        $$ = new DictionaryEntry (TypeRef.Ellipsis, size);\r
                           }\r
                        | int32 ELLIPSIS int32\r
                           {\r
-                                // lower bound and size\r
+                                // lower and upper bound\r
+                                int lower = (int) $1;\r
+                                int upper = (int) $3;\r
+                                if (lower > upper) \r
+                                        Report.Error ("Lower bound " + lower + " must be <= upper bound " + upper);\r
+\r
                                 $$ = new DictionaryEntry ($1, $3);\r
                           }\r
                        | int32 ELLIPSIS\r
@@ -960,11 +1201,17 @@ call_kind                : /* EMPTY */
 \r
 native_type            : /* EMPTY */\r
                        | K_CUSTOM OPEN_PARENS comp_qstring COMMA comp_qstring CLOSE_PARENS\r
+                         {\r
+                               $$ = new CustomMarshaller ((string) $3, (string) $5);\r
+                         }\r
                        | K_FIXED K_SYSSTRING OPEN_BRACKET int32 CLOSE_BRACKET\r
                           {\r
-                                $$ = NativeType.FixedSysString;\r
+                                $$ = new FixedSysString ((uint) (int)$4);\r
                           }\r
                        | K_FIXED K_ARRAY OPEN_BRACKET int32 CLOSE_BRACKET\r
+                         {\r
+                                $$ = new FixedArray ((int) $4);        \r
+                          }\r
                        | K_VARIANT\r
                        | K_CURRENCY\r
                           {\r
@@ -1004,27 +1251,60 @@ native_type             : /* EMPTY */
                                 $$ = NativeType.Float64;\r
                           }\r
                        | K_ERROR\r
+                          {\r
+                                $$ = NativeType.Error;\r
+                          }\r
                        | K_UNSIGNED K_INT8\r
                           {\r
                                 $$ = NativeType.UInt8;\r
                           }\r
+                       | K_UINT8\r
+                          {\r
+                                $$ = NativeType.UInt8;\r
+                          }\r
                        | K_UNSIGNED K_INT16\r
                           {\r
                                 $$ = NativeType.UInt16;\r
                           }\r
+                       | K_UINT16\r
+                          {\r
+                                $$ = NativeType.UInt16;\r
+                          }\r
                        | K_UNSIGNED K_INT32\r
                           {\r
                                 $$ = NativeType.UInt32;\r
                           }\r
+                       | K_UINT32\r
+                          {\r
+                                $$ = NativeType.UInt32;\r
+                          }\r
                        | K_UNSIGNED K_INT64\r
                           {\r
                                 $$ = NativeType.UInt64;\r
                           }\r
+                       | K_UINT64\r
+                          {\r
+                                $$ = NativeType.UInt64;\r
+                          }\r
                        | native_type STAR\r
                        | native_type OPEN_BRACKET CLOSE_BRACKET\r
+                         {\r
+                                $$ = new NativeArray ((NativeType) $1);\r
+                         }\r
                        | native_type OPEN_BRACKET int32 CLOSE_BRACKET\r
+                          {\r
+                               $$ = new NativeArray ((NativeType) $1, (int) $3, 0, 0);\r
+                         }\r
                        | native_type OPEN_BRACKET int32 PLUS int32 CLOSE_BRACKET\r
+                          {\r
+                                //FIXME: Allowed only for methods, !fields\r
+                                $$ = new NativeArray ((NativeType) $1, (int) $3, (int) $5);\r
+                         }\r
                        | native_type OPEN_BRACKET PLUS int32 CLOSE_BRACKET\r
+                         {\r
+                                //FIXME: Allowed only for methods, !fields\r
+                                $$ = new NativeArray ((NativeType) $1, -1, (int) $4);\r
+                         }\r
                        | K_DECIMAL\r
                        | K_DATE\r
                        | K_BSTR\r
@@ -1061,6 +1341,12 @@ native_type              : /* EMPTY */
                                 $$ = NativeType.Interface;\r
                           }\r
                        | K_SAFEARRAY variant_type\r
+                          {\r
+                                if ($2 == null)\r
+                                        $$ = new SafeArray ();\r
+                                else        \r
+                                        $$ = new SafeArray ((SafeArrayType) $2);\r
+                          }\r
                        | K_SAFEARRAY variant_type COMMA comp_qstring\r
                        | K_INT\r
                           {\r
@@ -1088,44 +1374,107 @@ native_type            : /* EMPTY */
                                 $$ = NativeType.VariantBool;\r
                           }\r
                        | K_METHOD\r
+                          {\r
+                                $$ = NativeType.FuncPtr;\r
+                          }    \r
                        | K_AS K_ANY\r
                           {\r
                                 $$ = NativeType.AsAny;\r
                           }\r
                        | K_LPSTRUCT\r
+                          {\r
+                                $$ = NativeType.LPStruct;\r
+                          }\r
                        ;\r
 \r
 variant_type           : /* EMPTY */\r
                        | K_NULL\r
                        | K_VARIANT\r
+                         {\r
+                                $$ = SafeArrayType.variant;\r
+                         }\r
                        | K_CURRENCY\r
+                         {\r
+                                $$ = SafeArrayType.currency;\r
+                         }\r
                        | K_VOID\r
                        | K_BOOL\r
+                         {\r
+                                $$ = SafeArrayType.boolean;\r
+                         }\r
                        | K_INT8\r
+                         {\r
+                                $$ = SafeArrayType.int8;\r
+                         }\r
                        | K_INT16\r
+                         {\r
+                                $$ = SafeArrayType.int16;\r
+                         }\r
                        | K_INT32\r
+                         {\r
+                                $$ = SafeArrayType.int32;\r
+                         }\r
                        | K_INT64\r
                        | K_FLOAT32\r
+                         {\r
+                                $$ = SafeArrayType.float32;\r
+                         }\r
                        | K_FLOAT64\r
+                         {\r
+                                $$ = SafeArrayType.float64;\r
+                         }\r
                        | K_UNSIGNED K_INT8\r
+                         {\r
+                                $$ = SafeArrayType.uint8;\r
+                         }\r
                        | K_UNSIGNED K_INT16\r
+                         {\r
+                                $$ = SafeArrayType.uint16;\r
+                         }\r
                        | K_UNSIGNED K_INT32\r
+                         {\r
+                                $$ = SafeArrayType.uint32;\r
+                         }\r
                        | K_UNSIGNED K_INT64\r
                        | STAR\r
                        | variant_type OPEN_BRACKET CLOSE_BRACKET\r
                        | variant_type K_VECTOR\r
                        | variant_type AMPERSAND\r
                        | K_DECIMAL\r
+                         {\r
+                                $$ = SafeArrayType.Decimal;\r
+                         }\r
                        | K_DATE\r
+                         {\r
+                                $$ = SafeArrayType.date;\r
+                         }\r
                        | K_BSTR\r
+                         {\r
+                                $$ = SafeArrayType.bstr;\r
+                         }\r
                        | K_LPSTR\r
                        | K_LPWSTR\r
                        | K_IUNKNOWN\r
+                         {\r
+                                $$ = SafeArrayType.unknown;\r
+                         }\r
                        | K_IDISPATCH\r
+                         {\r
+                                $$ = SafeArrayType.unknown;\r
+                         }\r
                        | K_SAFEARRAY\r
                        | K_INT\r
+                         {\r
+                                $$ = SafeArrayType.Int;\r
+                         }\r
                        | K_UNSIGNED K_INT\r
+                         {\r
+                                $$ = SafeArrayType.UInt;\r
+                         }\r
                        | K_ERROR\r
+                         {\r
+                                $$ = SafeArrayType.error;\r
+                         }\r
                        | K_HRESULT\r
                        | K_CARRAY\r
                        | K_USERDEFINED\r
@@ -1144,12 +1493,12 @@ variant_type            : /* EMPTY */
 field_decl             : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
                           {\r
                                 FieldDef field_def = new FieldDef((FieldAttr) $3, \r
-                                       (string) $5, (ITypeRef) $4);\r
+                                       (string) $5, (BaseTypeRef) $4);\r
                                 codegen.AddFieldDef (field_def);\r
                                 codegen.CurrentCustomAttrTarget = field_def;\r
                                 \r
                                 if ($2 != null) {\r
-                                        field_def.SetOffset ((uint) $2);\r
+                                        field_def.SetOffset ((uint) (int)$2);\r
                                 }\r
 \r
                                 if ($6 != null) {\r
@@ -1219,7 +1568,8 @@ field_attr                : /* EMPTY */
                           }\r
                        | field_attr K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
                           {\r
-                                \r
+                               codegen.AddFieldMarshalInfo ((NativeType) $4);\r
+                               $$ = (FieldAttr) $1 | FieldAttr.HasFieldMarshal;\r
                           }\r
                        | field_attr K_LITERAL\r
                           {\r
@@ -1245,7 +1595,7 @@ init_opt          : /* EMPTY */
                           }\r
                        ;\r
 \r
-field_init             : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
+field_init_primitive   : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS\r
                           {\r
                                 $$ = new FloatConst (Convert.ToSingle ($3));\r
                           }\r
@@ -1265,14 +1615,26 @@ field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
                           {\r
                                 $$ = new IntConst (Convert.ToInt64 ($3));\r
                           }\r
+                       | K_UINT64 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new UIntConst (Convert.ToUInt64 ((ulong)(long) $3));\r
+                          }\r
                        | K_INT32 OPEN_PARENS int64 CLOSE_PARENS\r
                           {\r
                                 $$ = new IntConst ((int)((long)$3));\r
                           }\r
+                       | K_UINT32 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new UIntConst ((uint)((long)$3));\r
+                          }\r
                        | K_INT16 OPEN_PARENS int64 CLOSE_PARENS\r
                           {\r
                                 $$ = new IntConst ((short)((long) $3));\r
                           }\r
+                       | K_UINT16 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new UIntConst ((ushort)((long) $3));\r
+                          }\r
                        | K_CHAR OPEN_PARENS int64 CLOSE_PARENS\r
                           {\r
                                 $$ = new CharConst (Convert.ToChar ($3));\r
@@ -1283,12 +1645,19 @@ field_init              : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
                          }\r
                        | K_INT8 OPEN_PARENS int64 CLOSE_PARENS\r
                           {\r
-                                $$ = new IntConst ((byte)((long) ($3)));\r
+                                $$ = new IntConst ((sbyte)((long) ($3)));\r
+                          }\r
+                       | K_UINT8 OPEN_PARENS int64 CLOSE_PARENS\r
+                          {\r
+                                $$ = new UIntConst ((byte)((long) ($3)));\r
                           }\r
                        | K_BOOL OPEN_PARENS truefalse CLOSE_PARENS\r
                           {\r
                                 $$ = new BoolConst ((bool) $3);\r
                           }\r
+                       ;\r
+\r
+field_init             : field_init_primitive\r
                        | K_BYTEARRAY bytes_list\r
                           {\r
                                 $$ = new ByteArrConst ((byte[]) $2);\r
@@ -1338,6 +1707,9 @@ tls                       : /* EMPTY */   { $$ = false; }
                        ;\r
 \r
 data_body              : OPEN_BRACE dataitem_list CLOSE_BRACE\r
+                          {\r
+                                $$ = $2;\r
+                          }\r
                        | dataitem\r
                        ;\r
 \r
@@ -1498,26 +1870,37 @@ method_all              : method_head OPEN_BRACE method_decls CLOSE_BRACE
 method_head            : D_METHOD meth_attr call_conv param_attr type method_name\r
                           formal_typars_clause OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
                           {\r
-                                MethodDef methdef = new MethodDef (\r
-                                       codegen, (MethAttr) $2, (CallConv) $3,\r
-                                        (ImplAttr) $11, (string) $6, (ITypeRef) $5,\r
-                                        (ArrayList) $9, tokenizer.Reader.Location);\r
+                                CallConv cc = (CallConv) $3;\r
+                                if ($7 != null)\r
+                                        cc |= CallConv.Generic;\r
 \r
+                                MethodDef methdef = new MethodDef (\r
+                                        codegen, (MethAttr) $2, cc,\r
+                                        (ImplAttr) $11, (string) $6, (BaseTypeRef) $5,\r
+                                        (ArrayList) $9, tokenizer.Reader.Location, (GenericParameters) $7, codegen.CurrentTypeDef);\r
                                 if (pinvoke_info) {\r
                                         ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
                                         methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
                                         pinvoke_info = false;\r
                                 }\r
-\r
-                                if ($7 != null) {\r
-                                        ArrayList typars_list = (ArrayList) $7;\r
-                                        foreach (string id in typars_list)\r
-                                                methdef.AddGenericParam (id);\r
-                                }\r
                           }\r
                        | D_METHOD meth_attr call_conv param_attr type \r
                          K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS method_name\r
                          OPEN_PARENS sig_args CLOSE_PARENS impl_attr\r
+                         {\r
+                                MethodDef methdef = new MethodDef (\r
+                                       codegen, (MethAttr) $2, (CallConv) $3,\r
+                                        (ImplAttr) $14, (string) $10, (BaseTypeRef) $5,\r
+                                        (ArrayList) $12, tokenizer.Reader.Location, null, codegen.CurrentTypeDef);\r
+\r
+                                if (pinvoke_info) {\r
+                                        ExternModule mod = codegen.ExternTable.AddModule (pinvoke_mod);\r
+                                        methdef.AddPInvokeInfo (pinvoke_attr, mod, pinvoke_meth);\r
+                                        pinvoke_info = false;\r
+                                }\r
+                               \r
+                                methdef.AddRetTypeMarshalInfo ((NativeType) $8);\r
+                         }\r
                        ;\r
 \r
 meth_attr              : /* EMPTY */                   { $$ = new MethAttr (); }\r
@@ -1537,6 +1920,7 @@ meth_attr         : /* EMPTY */                   { $$ = new MethAttr (); }
                        | meth_attr K_REQSECOBJ         { $$ = (MethAttr) $1 | MethAttr.RequireSecObject; }\r
                        | meth_attr K_SPECIALNAME       { $$ = (MethAttr) $1 | MethAttr.SpecialName; }\r
                        | meth_attr K_RTSPECIALNAME     { $$ = (MethAttr) $1 | MethAttr.RTSpecialName; }\r
+                       | meth_attr K_STRICT            { $$ = (MethAttr) $1 | MethAttr.Strict; }\r
                         | meth_attr K_COMPILERCONTROLLED { /* Do nothing */ }\r
                        | meth_attr K_UNMANAGEDEXP      \r
                        | meth_attr K_PINVOKEIMPL OPEN_PARENS comp_qstring K_AS\r
@@ -1574,6 +1958,10 @@ pinv_attr                : /* EMPTY */ { $$ = new PInvokeAttr (); }
                        | pinv_attr K_STDCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.stdcall; }\r
                        | pinv_attr K_THISCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.thiscall; }\r
                        | pinv_attr K_FASTCALL { $$ = (PInvokeAttr) $1 | PInvokeAttr.fastcall; }\r
+                       | pinv_attr K_BESTFIT COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_on; }\r
+                       | pinv_attr K_BESTFIT COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.bestfit_off; }\r
+                       | pinv_attr K_CHARMAPERROR COLON K_ON { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_on; }\r
+                       | pinv_attr K_CHARMAPERROR COLON K_OFF { $$ = (PInvokeAttr) $1 | PInvokeAttr.charmaperror_off; }\r
                        ;\r
 \r
 method_name            : D_CTOR\r
@@ -1622,11 +2010,11 @@ sig_arg_list            : sig_arg
 \r
 sig_arg                        : param_attr type\r
                           {\r
-                                $$ = new ParamDef ((ParamAttr) $1, null, (ITypeRef) $2);\r
+                                $$ = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);\r
                           }\r
                        | param_attr type id\r
                           {\r
-                                $$ = new ParamDef ((ParamAttr) $1, (string) $3, (ITypeRef) $2);\r
+                                $$ = new ParamDef ((ParamAttr) $1, (string) $3, (BaseTypeRef) $2);\r
                           }\r
                         | ELLIPSIS\r
                           {\r
@@ -1634,7 +2022,19 @@ sig_arg                  : param_attr type
                                 // $$ = ParamDef.Ellipsis;\r
                           }\r
                        | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS\r
+                         {\r
+                                ParamDef param_def = new ParamDef ((ParamAttr) $1, null, (BaseTypeRef) $2);\r
+                                param_def.AddMarshalInfo ((PEAPI.NativeType) $5);\r
+\r
+                                $$ = param_def;\r
+                         }\r
                        | param_attr type K_MARSHAL OPEN_PARENS native_type CLOSE_PARENS id\r
+                         {\r
+                                ParamDef param_def = new ParamDef ((ParamAttr) $1, (string) $7, (BaseTypeRef) $2);\r
+                                param_def.AddMarshalInfo ((PEAPI.NativeType) $5);\r
+\r
+                                $$ = param_def;\r
+                         }\r
                        ;\r
 \r
 type_list               : /* EMPTY */\r
@@ -1677,6 +2077,11 @@ method_decls             : /* EMPTY */
                        ;\r
 \r
 method_decl            : D_EMITBYTE int32\r
+                                               {\r
+                                                       codegen.CurrentMethodDef.AddInstr (new\r
+                                        EmitByteInstr ((int) $2, tokenizer.Location));\r
+                          \r
+                                               }\r
                        | D_MAXSTACK int32\r
                           {\r
                                 codegen.CurrentMethodDef.SetMaxStack ((int) $2);\r
@@ -1699,6 +2104,7 @@ method_decl               : D_EMITBYTE int32
                        | D_ENTRYPOINT\r
                           {\r
                                 codegen.CurrentMethodDef.EntryPoint ();\r
+                                codegen.HasEntryPoint = true;\r
                           }\r
                        | D_ZEROINIT\r
                           {\r
@@ -1710,15 +2116,54 @@ method_decl             : D_EMITBYTE int32
                        | D_OVERRIDE type_spec DOUBLE_COLON method_name\r
                           {\r
                                 codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef,\r
-                                        (ITypeRef) $2, (string) $4);\r
+                                        (BaseTypeRef) $2, (string) $4);\r
                                 \r
                           }\r
+                       | D_OVERRIDE K_METHOD method_ref\r
+                          {\r
+                               codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,\r
+                                       (BaseMethodRef) $3);\r
+                          }\r
+                       | D_OVERRIDE K_METHOD call_conv type type_spec DOUBLE_COLON method_name\r
+                         OPEN_ANGLE_BRACKET OPEN_BRACKET int32 CLOSE_BRACKET CLOSE_ANGLE_BRACKET\r
+                         OPEN_PARENS type_list CLOSE_PARENS \r
+                          {\r
+                                BaseTypeRef owner = (BaseTypeRef) $5;\r
+                                ArrayList arg_list = (ArrayList) $14;\r
+                                BaseTypeRef[] param_list;\r
+                                BaseMethodRef methref;\r
+\r
+                                if (arg_list != null)\r
+                                        param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
+                                else\r
+                                        param_list = new BaseTypeRef[0];\r
+\r
+                                if (owner.UseTypeSpec) {\r
+                                        methref = new TypeSpecMethodRef (owner, (CallConv) $3, (BaseTypeRef) $4,\r
+                                                (string) $7, param_list, (int) $10);\r
+                                } else {\r
+                                        methref = owner.GetMethodRef ((BaseTypeRef) $4,\r
+                                                (CallConv) $3, (string) $7, param_list, (int) $10);\r
+                                }\r
+\r
+                               codegen.CurrentTypeDef.AddOverride (codegen.CurrentMethodDef.Signature,\r
+                                       methref);\r
+                         }\r
                        | scope_block\r
                        | D_PARAM OPEN_BRACKET int32 CLOSE_BRACKET init_opt\r
                           {\r
-                                codegen.CurrentMethodDef.AddParamDefaultValue ((int)$3 - 1, (Constant)$5);\r
-                                codegen.CurrentCustomAttrTarget = codegen.CurrentMethodDef.GetParam ((int)$3 - 1);\r
+                                int index = (int) $3;\r
+                                ParamDef param = codegen.CurrentMethodDef.GetParam (index);\r
+                                codegen.CurrentCustomAttrTarget = param;\r
+\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
+                                        param.AddDefaultValue ((Constant) $5);\r
                           }\r
+                       | param_type_decl\r
                        | id COLON\r
                           {\r
                                 codegen.CurrentMethodDef.AddLabel ((string) $1);\r
@@ -1726,11 +2171,15 @@ method_decl             : D_EMITBYTE int32
                        | seh_block\r
                        | instr\r
                        | sec_decl\r
+                         {\r
+                               AddSecDecl ($1, false);\r
+                         }\r
                        | extsource_spec\r
                        | language_decl\r
                        | customattr_decl\r
                           {\r
-                                codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+                                if (codegen.CurrentCustomAttrTarget != null)\r
+                                        codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
                           }\r
                        | data_decl\r
                        ;\r
@@ -1751,19 +2200,19 @@ local_list              : /* EMPTY */
 \r
 local                   : type\r
                           {\r
-                                $$ = new Local (-1, (ITypeRef) $1);\r
+                                $$ = new Local (-1, (BaseTypeRef) $1);\r
                           }\r
                         | type id\r
                           {\r
-                                $$ = new Local (-1, (string) $2, (ITypeRef) $1);\r
+                                $$ = new Local (-1, (string) $2, (BaseTypeRef) $1);\r
                           }\r
                         | slot_num type\r
                           {\r
-                                $$ = new Local ((int) $1, (ITypeRef) $2);\r
+                                $$ = new Local ((int) $1, (BaseTypeRef) $2);\r
                           }\r
                         | slot_num type id\r
                           {\r
-                                $$ = new Local ((int) $1, (string) $3, (ITypeRef) $2);\r
+                                $$ = new Local ((int) $1, (string) $3, (BaseTypeRef) $2);\r
                           }\r
                         ;\r
 \r
@@ -1773,8 +2222,7 @@ slot_num                : OPEN_BRACKET int32 CLOSE_BRACKET
                           }\r
                         ;\r
 \r
-type_spec              : class_ref\r
-                       | OPEN_BRACKET slashed_name CLOSE_BRACKET\r
+type_spec              : OPEN_BRACKET slashed_name CLOSE_BRACKET\r
                           {\r
                                 // This is a reference to a global method in another\r
                                 // assembly. This is not supported in the MS version of ilasm\r
@@ -1797,12 +2245,14 @@ scope_block             : scope_block_begin method_decls CLOSE_BRACE
                           {\r
                                 $$ = new HandlerBlock ((LabelInfo) $1,\r
                                         codegen.CurrentMethodDef.AddLabel ());\r
+                                codegen.CurrentMethodDef.EndLocalsScope ();\r
                           }\r
                        ;\r
 \r
 scope_block_begin       : OPEN_BRACE\r
                           {\r
                                 $$ = codegen.CurrentMethodDef.AddLabel ();\r
+                                codegen.CurrentMethodDef.BeginLocalsScope ();\r
                           }\r
                         ;\r
                         \r
@@ -1852,9 +2302,12 @@ seh_clauses              : seh_clause
                           }\r
                        ;\r
 \r
-seh_clause             : K_CATCH class_ref handler_block\r
+seh_clause             : K_CATCH type handler_block\r
                           {\r
-                                IClassRef type = (IClassRef) $2;\r
+                               if ($2.GetType () == typeof (PrimitiveTypeRef))\r
+                                       Report.Error ("Exception not be of a primitive type.");\r
+                                       \r
+                                BaseTypeRef type = (BaseTypeRef) $2;\r
                                 CatchBlock cb = new CatchBlock (type);\r
                                 cb.SetHandlerBlock ((HandlerBlock) $3);\r
                                 $$ = cb;\r
@@ -1911,8 +2364,8 @@ handler_block             : scope_block
                           }\r
                        | K_HANDLER int32 K_TO int32\r
                          {\r
-                               LabelInfo from = codegen.CurrentMethodDef.AddLabelRef ((string) $2);\r
-                               LabelInfo to = codegen.CurrentMethodDef.AddLabelRef ((string) $4);\r
+                               LabelInfo from = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
+                               LabelInfo to = codegen.CurrentMethodDef.AddLabel ((int) $4);\r
 \r
                                $$ = new HandlerBlock (from, to);\r
                          }\r
@@ -1931,6 +2384,8 @@ instr                     : INSTR_NONE
                         | INSTR_LOCAL id\r
                           {\r
                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+                                if (slot < 0)\r
+                                        Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
                                 codegen.CurrentMethodDef.AddInstr (\r
                                         new IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
                           }\r
@@ -1942,6 +2397,9 @@ instr                     : INSTR_NONE
                         | INSTR_PARAM id\r
                           {\r
                                 int pos = codegen.CurrentMethodDef.GetNamedParamPos ((string) $2);\r
+                                if (pos < 0)\r
+                                        Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
+\r
                                 codegen.CurrentMethodDef.AddInstr (\r
                                         new IntInstr ((IntOp) $1, pos, tokenizer.Location));\r
                           }\r
@@ -1953,6 +2411,8 @@ instr                     : INSTR_NONE
                        | INSTR_I id\r
                           {\r
                                 int slot = codegen.CurrentMethodDef.GetNamedLocalSlot ((string) $2);\r
+                                if (slot < 0)\r
+                                        Report.Error (String.Format ("Undeclared identifier '{0}'", (string) $2));\r
                                 codegen.CurrentMethodDef.AddInstr (new\r
                                         IntInstr ((IntOp) $1, slot, tokenizer.Location));\r
                           }\r
@@ -1988,6 +2448,28 @@ instr                    : INSTR_NONE
                                 }\r
                           }\r
                        | INSTR_R bytes_list\r
+                          {\r
+                               byte[] fpdata;\r
+                                switch ((MiscInstr) $1) {\r
+                                        case MiscInstr.ldc_r4:\r
+                                               fpdata = (byte []) $2;\r
+                                               if (!BitConverter.IsLittleEndian) {\r
+                                                       System.Array.Reverse (fpdata, 0, 4);\r
+                                               }\r
+                                                float s = BitConverter.ToSingle (fpdata, 0);\r
+                                                codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, s, tokenizer.Location));\r
+                                                break;\r
+                                        case MiscInstr.ldc_r8:\r
+                                               fpdata = (byte []) $2;\r
+                                               if (!BitConverter.IsLittleEndian) {\r
+                                                       // FIXME: handle the stupid ARM FPA format\r
+                                                       System.Array.Reverse (fpdata, 0, 8);\r
+                                               }\r
+                                                double d = BitConverter.ToDouble (fpdata, 0);\r
+                                                codegen.CurrentMethodDef.AddInstr (new LdcInstr ((MiscInstr) $1, d, tokenizer.Location));\r
+                                                break;\r
+                                }\r
+                          }\r
                        | INSTR_BRTARGET int32\r
                           {\r
                                LabelInfo target = codegen.CurrentMethodDef.AddLabel ((int) $2);\r
@@ -2003,27 +2485,30 @@ instr                   : INSTR_NONE
                        | INSTR_METHOD method_ref\r
                           {\r
                                 codegen.CurrentMethodDef.AddInstr (new MethodInstr ((MethodOp) $1,\r
-                                        (IMethodRef) $2, tokenizer.Location));\r
+                                        (BaseMethodRef) $2, tokenizer.Location));\r
                           }\r
                        | INSTR_FIELD type type_spec DOUBLE_COLON id\r
                           {\r
                                 \r
-                                ITypeRef owner = (ITypeRef) $3;\r
+                                BaseTypeRef owner = (BaseTypeRef) $3;\r
+                                GenericParamRef gpr = $2 as GenericParamRef;\r
+                                if (gpr != null && codegen.CurrentMethodDef != null)\r
+                                        codegen.CurrentMethodDef.ResolveGenParam ((PEAPI.GenParam) gpr.PeapiType);\r
                                 IFieldRef fieldref = owner.GetFieldRef (\r
-                                        (ITypeRef) $2, (string) $5);\r
+                                        (BaseTypeRef) $2, (string) $5);\r
 \r
                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));\r
                           }\r
                        | INSTR_FIELD type id\r
                           {\r
-                                GlobalFieldRef fieldref = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+                                GlobalFieldRef fieldref = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);\r
 \r
                                 codegen.CurrentMethodDef.AddInstr (new FieldInstr ((FieldOp) $1, fieldref, tokenizer.Location));\r
                           }\r
                        | INSTR_TYPE type_spec\r
                           {\r
                                 codegen.CurrentMethodDef.AddInstr (new TypeInstr ((TypeOp) $1,\r
-                                        (ITypeRef) $2, tokenizer.Location));\r
+                                        (BaseTypeRef) $2, tokenizer.Location));\r
                           }\r
                        | INSTR_STRING comp_qstring\r
                           {\r
@@ -2045,23 +2530,23 @@ instr                   : INSTR_NONE
                        | INSTR_SIG call_conv type OPEN_PARENS type_list CLOSE_PARENS\r
                           {\r
                                 ArrayList arg_list = (ArrayList) $5;\r
-                                ITypeRef[] arg_array = null;\r
+                                BaseTypeRef[] arg_array = null;\r
 \r
                                 if (arg_list != null)\r
-                                        arg_array = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                        arg_array = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
 \r
                                 codegen.CurrentMethodDef.AddInstr (new CalliInstr ((CallConv) $2,\r
-                                        (ITypeRef) $3, arg_array, tokenizer.Location));\r
+                                        (BaseTypeRef) $3, arg_array, tokenizer.Location));\r
                           }     \r
                        | INSTR_TOK owner_type\r
                           {\r
                                 if ((MiscInstr) $1 == MiscInstr.ldtoken) {\r
-                                        if ($2 is IMethodRef)\r
-                                                codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IMethodRef) $2, tokenizer.Location));\r
+                                        if ($2 is BaseMethodRef)\r
+                                                codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseMethodRef) $2, tokenizer.Location));\r
                                         else if ($2 is IFieldRef)\r
                                                 codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((IFieldRef) $2, tokenizer.Location));\r
                                         else\r
-                                                codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((ITypeRef) $2, tokenizer.Location));\r
+                                                codegen.CurrentMethodDef.AddInstr (new LdtokenInstr ((BaseTypeRef) $2, tokenizer.Location));\r
                                                 \r
                                 }\r
                           }\r
@@ -2071,70 +2556,56 @@ instr                   : INSTR_NONE
                           }\r
                        ;\r
 \r
-method_ref             : call_conv type type_spec DOUBLE_COLON method_name\r
-                          OPEN_PARENS type_list CLOSE_PARENS \r
-                          {\r
-                                ITypeRef owner = (ITypeRef) $3;\r
-                                ArrayList arg_list = (ArrayList) $7;\r
-                                ITypeRef[] param_list;\r
-                                IMethodRef methref;\r
-\r
-                                if (arg_list != null)\r
-                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
-                                else\r
-                                        param_list = new ITypeRef[0];\r
-\r
-                                if (owner.UseTypeSpec) {\r
-                                        methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
-                                                (CallConv) $1, (string) $5, param_list);\r
-                                } else {\r
-                                        methref = owner.GetMethodRef ((ITypeRef) $2,\r
-                                                (CallConv) $1, (string) $5, param_list);\r
-                                }\r
-\r
-                                $$ = methref;\r
-                          }\r
-                       | call_conv type method_name \r
+method_ref             : call_conv type method_name typars_clause\r
                          OPEN_PARENS type_list CLOSE_PARENS\r
                           {\r
-                                ArrayList arg_list = (ArrayList) $5;\r
-                                ITypeRef[] param_list;\r
+                                ArrayList arg_list = (ArrayList) $6;\r
+                                GenericArguments ga = (GenericArguments) $4;\r
+                                BaseTypeRef[] param_list;\r
   \r
                                 if (arg_list != null)\r
-                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                        param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
                                 else\r
-                                        param_list = new ITypeRef[0];\r
+                                        param_list = new BaseTypeRef[0];\r
+\r
+                               BaseMethodRef methref = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,\r
+                                        (string) $3, param_list, (ga != null ? ga.Count : 0));\r
 \r
-                                $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
-                                        (string) $3, param_list);\r
+                                if (ga != null)\r
+                                        methref = methref.GetGenericMethodRef (ga);\r
+\r
+                                $$ = methref;\r
                           }\r
                         | call_conv type type_spec DOUBLE_COLON method_name\r
                           typars_clause OPEN_PARENS type_list CLOSE_PARENS \r
                           {\r
-                                ITypeRef owner = (ITypeRef) $3;\r
+                                BaseTypeRef owner = (BaseTypeRef) $3;\r
                                 ArrayList arg_list = (ArrayList) $8;\r
-                                ITypeRef[] param_list;\r
-                                IMethodRef methref;\r
+                                GenericArguments ga = (GenericArguments) $6;\r
+                                BaseTypeRef[] param_list;\r
+                                BaseMethodRef methref;\r
 \r
                                 if (arg_list != null)\r
-                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                        param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
                                 else\r
-                                        param_list = new ITypeRef[0];\r
+                                        param_list = new BaseTypeRef[0];\r
+\r
+                                if (codegen.IsThisAssembly ("mscorlib")) {\r
+                                        PrimitiveTypeRef prim = owner as PrimitiveTypeRef;\r
+                                        if (prim != null && prim.SigMod == "")\r
+                                                owner = codegen.GetTypeRef (prim.Name);\r
+                                }\r
 \r
                                 if (owner.UseTypeSpec) {\r
-                                        methref = new TypeSpecMethodRef (owner, (ITypeRef) $2,\r
-                                                (CallConv) $1, (string) $5, param_list);\r
+                                        methref = new TypeSpecMethodRef (owner, (CallConv) $1, (BaseTypeRef) $2,\r
+                                                (string) $5, param_list, (ga != null ? ga.Count : 0));\r
                                 } else {\r
-                                        methref = owner.GetMethodRef ((ITypeRef) $2,\r
-                                                (CallConv) $1, (string) $5, param_list);\r
+                                        methref = owner.GetMethodRef ((BaseTypeRef) $2,\r
+                                                (CallConv) $1, (string) $5, param_list, (ga != null ? ga.Count : 0));\r
                                 }\r
 \r
-                                if ($6 != null) {\r
-                                        ArrayList tp = (ArrayList) $6;\r
-                                        ITypeRef[] ta = (ITypeRef[]) tp.ToArray (typeof (ITypeRef));\r
-                                        \r
-                                        methref = new GenericMethodRef (methref, new GenericMethodSig (ta));\r
-                                }\r
+                                if (ga != null)\r
+                                        methref = methref.GetGenericMethodRef (ga);\r
                                 \r
                                 $$ = methref;\r
                           }\r
@@ -2144,7 +2615,7 @@ labels                    : /* EMPTY */
                        | id\r
                           {\r
                                 ArrayList label_list = new ArrayList ();\r
-                                label_list.Add ($1);\r
+                                label_list.Add (codegen.CurrentMethodDef.AddLabelRef ((string) $1));\r
                                 $$ = label_list;\r
                           }\r
                        | int32\r
@@ -2156,7 +2627,7 @@ labels                    : /* EMPTY */
                        | labels COMMA id\r
                           {\r
                                 ArrayList label_list = (ArrayList) $1;\r
-                                label_list.Add ($3);\r
+                                label_list.Add (codegen.CurrentMethodDef.AddLabelRef ((string) $3));\r
                           }\r
                        | labels COMMA int32\r
                           {\r
@@ -2175,14 +2646,14 @@ member_ref              : K_METHOD method_ref
                           }\r
                        | K_FIELD type type_spec DOUBLE_COLON id\r
                           {\r
-                                ITypeRef owner = (ITypeRef) $3;\r
+                                BaseTypeRef owner = (BaseTypeRef) $3;\r
 \r
                                 $$ = owner.GetFieldRef (\r
-                                        (ITypeRef) $2, (string) $5);\r
+                                        (BaseTypeRef) $2, (string) $5);\r
                           }\r
                        | K_FIELD type id\r
                           {\r
-                                $$ = new GlobalFieldRef ((ITypeRef) $2, (string) $3);\r
+                                $$ = codegen.GetGlobalFieldRef ((BaseTypeRef) $2, (string) $3);\r
                           }\r
                        ;\r
 \r
@@ -2195,7 +2666,7 @@ event_all         : event_head OPEN_BRACE event_decls CLOSE_BRACE
 event_head             : D_EVENT event_attr type_spec comp_name\r
                           {\r
                                 EventDef event_def = new EventDef ((FeatureAttr) $2,\r
-                                        (ITypeRef) $3, (string) $4);\r
+                                        (BaseTypeRef) $3, (string) $4);\r
                                 codegen.CurrentTypeDef.BeginEventDef (event_def);\r
                                 codegen.CurrentCustomAttrTarget = event_def;\r
                           }\r
@@ -2241,6 +2712,10 @@ event_decl               : D_ADDON method_ref
                                         (MethodRef) $2);\r
                           }\r
                        | customattr_decl\r
+                          {\r
+                                if (codegen.CurrentCustomAttrTarget != null)\r
+                                        codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+                          }\r
                        | extsource_spec\r
                        | language_decl\r
                        ;\r
@@ -2253,7 +2728,7 @@ prop_all          : prop_head OPEN_BRACE prop_decls CLOSE_BRACE
 \r
 prop_head              : D_PROPERTY prop_attr type comp_name OPEN_PARENS type_list CLOSE_PARENS init_opt\r
                           {\r
-                                PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (ITypeRef) $3,\r
+                                PropertyDef prop_def = new PropertyDef ((FeatureAttr) $2, (BaseTypeRef) $3,\r
                                         (string) $4, (ArrayList) $6);\r
                                 codegen.CurrentTypeDef.BeginPropertyDef (prop_def);\r
                                 codegen.CurrentCustomAttrTarget = prop_def;\r
@@ -2278,6 +2753,7 @@ prop_attr                 : /* EMPTY */
                           }\r
                         | prop_attr K_INSTANCE\r
                           {\r
+                                $$ = (FeatureAttr) $1 | FeatureAttr.Instance;\r
                           }\r
                        ;\r
 \r
@@ -2299,7 +2775,8 @@ prop_decl         : D_SET method_ref
                           }\r
                        | customattr_decl\r
                          {\r
-                               codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+                                if (codegen.CurrentCustomAttrTarget != null)\r
+                                        codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
                          }\r
                        | extsource_spec\r
                        | language_decl\r
@@ -2307,12 +2784,12 @@ prop_decl               : D_SET method_ref
 \r
 customattr_decl                : D_CUSTOM custom_type\r
                           {\r
-                                $$ = new CustomAttr ((IMethodRef) $2, null);\r
+                                $$ = new CustomAttr ((BaseMethodRef) $2, null);\r
                           }\r
                        | D_CUSTOM custom_type ASSIGN comp_qstring\r
                        | D_CUSTOM custom_type ASSIGN bytes_list\r
                           {\r
-                                $$ = new CustomAttr ((IMethodRef) $2,\r
+                                $$ = new CustomAttr ((BaseMethodRef) $2,\r
                                         (byte[]) $4);\r
                           }\r
                        | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
@@ -2321,72 +2798,242 @@ customattr_decl                : D_CUSTOM custom_type
                          bytes_list\r
                        ;\r
                        \r
-custom_type            : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+custom_type            : call_conv type type_spec DOUBLE_COLON method_name OPEN_PARENS type_list CLOSE_PARENS\r
                           {\r
-                                ITypeRef owner = (ITypeRef) $3;\r
+                                BaseTypeRef owner = (BaseTypeRef) $3;\r
                                 ArrayList arg_list = (ArrayList) $7;\r
-                                ITypeRef[] param_list;\r
+                                BaseTypeRef[] param_list;\r
   \r
                                 if (arg_list != null)\r
-                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                        param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
                                 else\r
-                                        param_list = new ITypeRef[0];\r
+                                        param_list = new BaseTypeRef[0];\r
 \r
-                                $$ = owner.GetMethodRef ((ITypeRef) $2,\r
-                                        (CallConv) $1, (string) $5, param_list);\r
+                                $$ = owner.GetMethodRef ((BaseTypeRef) $2,\r
+                                        (CallConv) $1, (string) $5, param_list, 0);\r
                           }\r
-                       | call_conv type D_CTOR OPEN_PARENS type_list CLOSE_PARENS\r
+                       | call_conv type method_name OPEN_PARENS type_list CLOSE_PARENS\r
                           {\r
                                 ArrayList arg_list = (ArrayList) $5;\r
-                                ITypeRef[] param_list;\r
+                                BaseTypeRef[] param_list;\r
   \r
                                 if (arg_list != null)\r
-                                        param_list = (ITypeRef[]) arg_list.ToArray (typeof (ITypeRef));\r
+                                        param_list = (BaseTypeRef[]) arg_list.ToArray (typeof (BaseTypeRef));\r
                                 else\r
-                                        param_list = new ITypeRef[0];\r
+                                        param_list = new BaseTypeRef[0];\r
 \r
-                                $$ = new GlobalMethodRef ((ITypeRef) $2, (CallConv) $1,\r
-                                        (string) $3, param_list);\r
+                                $$ = codegen.GetGlobalMethodRef ((BaseTypeRef) $2, (CallConv) $1,\r
+                                        (string) $3, param_list, 0);\r
                           }\r
                        ;\r
 \r
 sec_decl               : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PARENS\r
+                         {\r
+                                $$ = TypeSpecToPermPair ($2, $3, (ArrayList) $5);\r
+                         }\r
                        | D_PERMISSION sec_action type_spec\r
+                         {\r
+                                $$ = TypeSpecToPermPair ($2, $3, null);\r
+                         }\r
                        | D_PERMISSIONSET sec_action ASSIGN bytes_list\r
+                         {\r
+                               System.Text.UnicodeEncoding ue = new System.Text.UnicodeEncoding ();\r
+                               PermissionSetAttribute psa = new PermissionSetAttribute ((System.Security.Permissions.SecurityAction) (short) $2);\r
+                               psa.XML = ue.GetString ((byte []) $4);\r
+                               $$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());\r
+                         }\r
+                       | D_PERMISSIONSET sec_action comp_qstring\r
+                         {\r
+                               PermissionSetAttribute psa = new PermissionSetAttribute ((System.Security.Permissions.SecurityAction) (short) $2);\r
+                               psa.XML = (string) $3;\r
+                               $$ = new PermPair ((PEAPI.SecurityAction) $2, psa.CreatePermissionSet ());\r
+                         }\r
+                       | D_PERMISSIONSET sec_action ASSIGN OPEN_BRACE permissions CLOSE_BRACE\r
+                         {\r
+#if NET_2_0\r
+                               $$ = new MIPermissionSet ((PEAPI.SecurityAction) $2, (ArrayList) $5);\r
+#else\r
+                               Report.Error ("Use ilasm2 for 2.0 style declarative security attributes.");\r
+#endif\r
+                         }\r
+                       ;\r
+\r
+permissions            : permission\r
+                         {\r
+                               ArrayList list = new ArrayList ();\r
+                               list.Add ($1);\r
+                               $$ = list;\r
+                         }\r
+                       | permissions COMMA permission\r
+                         {\r
+                               ArrayList list = (ArrayList) $1;\r
+                               list.Add ($3);\r
+                               $$ = list;\r
+                         }\r
+                       ;\r
+                       \r
+permission             : class_ref ASSIGN OPEN_BRACE permission_members CLOSE_BRACE\r
+                         {\r
+                               $$ = new MIPermission ((BaseTypeRef) $1, (ArrayList) $4);\r
+                         }\r
+                       ;\r
+\r
+permission_members     : permission_member\r
+                         {\r
+                                 ArrayList list = new ArrayList ();\r
+                                 list.Add ($1);\r
+                                 $$ = list;\r
+                         }\r
+                       | permission_members permission_member\r
+                         {\r
+                                 ArrayList list = (ArrayList) $1;\r
+                                 list.Add ($2);\r
+                                 $$ = list;\r
+                         }\r
+                       ;\r
+\r
+permission_member      : prop_or_field primitive_type perm_mbr_nameval_pair\r
+                         {\r
+                               NameValuePair pair = (NameValuePair) $3;\r
+                               $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $2, pair.Name, pair.Value);\r
+                         }\r
+                       | prop_or_field K_ENUM class_ref perm_mbr_nameval_pair\r
+                         {\r
+                               NameValuePair pair = (NameValuePair) $4;\r
+                               $$ = new PermissionMember ((MemberTypes) $1, (BaseTypeRef) $3, pair.Name, pair.Value);\r
+                         }\r
+                       ;\r
+\r
+perm_mbr_nameval_pair  : SQSTRING ASSIGN field_init_primitive\r
+                         {\r
+                               $$ = new NameValuePair ((string) $1, (PEAPI.Constant) $3);\r
+                         }\r
+                       | SQSTRING ASSIGN K_BYTEARRAY bytes_list\r
+                          {\r
+                                $$ = new NameValuePair ((string) $1, new ByteArrConst ((byte[]) $4));\r
+                          }\r
+                       | SQSTRING ASSIGN K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
+                         {\r
+                               $$ = new NameValuePair ((string) $1, new StringConst ((string) $5));\r
+                         }\r
+                       ;\r
+\r
+prop_or_field          : K_PROPERTY\r
+                         {\r
+                               $$ = MemberTypes.Property;\r
+                         }\r
+                       | K_FIELD\r
+                         {\r
+                               $$ = MemberTypes.Field;\r
+                         }\r
                        ;\r
 \r
 nameval_pairs          : nameval_pair \r
+                         {\r
+                               ArrayList pairs = new ArrayList ();\r
+                               pairs.Add ($1);\r
+                               $$ = pairs;\r
+                         }\r
                        | nameval_pairs COMMA nameval_pair\r
+                         {\r
+                               ArrayList pairs = (ArrayList) $1;\r
+                               pairs.Add ($3);\r
+                               $$ = pairs;\r
+                         }\r
                        ;\r
 \r
 nameval_pair           : comp_qstring ASSIGN cavalue\r
+                         {\r
+                               $$ = new NameValuePair ((string) $1, $3);\r
+                         }\r
                        ;\r
 \r
 cavalue                : truefalse\r
                        | int32\r
                        | int32 OPEN_PARENS int32 CLOSE_PARENS\r
+                         {\r
+                               $$ = $3;\r
+                         }\r
                        | comp_qstring \r
                        | class_ref OPEN_PARENS K_INT8 COLON int32 CLOSE_PARENS\r
+                         {\r
+                               $$ = ClassRefToObject ($1, (byte) (int) $5);\r
+                         }\r
                        | class_ref OPEN_PARENS K_INT16 COLON int32 CLOSE_PARENS\r
+                         {\r
+                               $$ = ClassRefToObject ($1, (short) (int) $5);\r
+                         }\r
                        | class_ref OPEN_PARENS K_INT32 COLON int32 CLOSE_PARENS\r
+                         {\r
+                               $$ = ClassRefToObject ($1, (int) $5);\r
+                         }\r
                        | class_ref OPEN_PARENS int32 CLOSE_PARENS\r
+                         {\r
+                               $$ = ClassRefToObject ($1, (int) $3);\r
+                         }\r
                        ;\r
 \r
 sec_action             : K_REQUEST\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.Request;\r
+                         }\r
                        | K_DEMAND\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.Demand;\r
+                         }\r
                        | K_ASSERT\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.Assert;\r
+                         }\r
                        | K_DENY\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.Deny;\r
+                         }\r
                        | K_PERMITONLY\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.PermitOnly;\r
+                         }\r
                        | K_LINKCHECK\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.LinkDemand;\r
+                         }\r
                        | K_INHERITCHECK\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.InheritDemand;\r
+                         }\r
                        | K_REQMIN\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.RequestMinimum;\r
+                         }\r
                        | K_REQOPT\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.RequestOptional;\r
+                         }\r
                        | K_REQREFUSE\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.RequestRefuse;\r
+                         }\r
                        | K_PREJITGRANT\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.PreJitGrant;\r
+                         }\r
                        | K_PREJITDENY\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.PreJitDeny;\r
+                         }\r
                        | K_NONCASDEMAND\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.NonCasDemand;\r
+                         }\r
                        | K_NONCASLINKDEMAND\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.NonCasLinkDemand;\r
+                         }\r
                        | K_NONCASINHERITANCE\r
+                         {\r
+                               $$ = PEAPI.SecurityAction.NonCasInheritance;\r
+                         }\r
+                       /* FIXME: Should we have LinkDemandChoice, InheritDemandChoice and DemandChoice ? */  \r
                        ;\r
 \r
 module_head            : D_MODULE\r
@@ -2435,18 +3082,31 @@ file_entry              : /* EMPTY */
                        ;\r
 \r
 assembly_all           : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE\r
+                         {\r
+                               codegen.CurrentCustomAttrTarget = null;\r
+                               codegen.CurrentDeclSecurityTarget = null;\r
+                         }\r
                        ;\r
 \r
 assembly_head          : D_ASSEMBLY asm_attr slashed_name\r
                           {\r
-                                codegen.SetAssemblyName ((string) $3);\r
+                                codegen.SetThisAssembly ((string) $3, (PEAPI.AssemAttr) $2);\r
+                                codegen.CurrentCustomAttrTarget = codegen.ThisAssembly;\r
+                               codegen.CurrentDeclSecurityTarget = codegen.ThisAssembly;\r
                           }\r
                        ;\r
 \r
 asm_attr               : /* EMPTY */\r
-                       | asm_attr K_NOAPPDOMAIN\r
+                         {\r
+                                 $$ = new PEAPI.AssemAttr ();\r
+                         }\r
+                       /*| asm_attr K_NOAPPDOMAIN\r
                        | asm_attr K_NOPROCESS\r
-                       | asm_attr K_NOMACHINE\r
+                       | asm_attr K_NOMACHINE*/\r
+                       | asm_attr K_RETARGETABLE\r
+                         {\r
+                                 $$ = ((PEAPI.AssemAttr) $1) | PEAPI.AssemAttr.Retargetable;\r
+                         }\r
                        ;\r
 \r
 assembly_decls         : /* EMPTY */\r
@@ -2455,26 +3115,29 @@ assembly_decls          : /* EMPTY */
 \r
 assembly_decl          : D_PUBLICKEY ASSIGN bytes_list\r
                          {\r
-                               codegen.SetAssemblyPublicKey ((byte []) $3);\r
+                               codegen.ThisAssembly.SetPublicKey ((byte []) $3);\r
                          }\r
                        | D_VER int32 COLON int32 COLON int32 COLON int32\r
                          {\r
-                               codegen.SetAssemblyVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
+                               codegen.ThisAssembly.SetVersion ((int) $2, (int) $4, (int) $6, (int) $8);\r
                          }\r
                        | D_LOCALE comp_qstring\r
                          {\r
-                               codegen.SetAssemblyLocale ((string) $2);\r
+                               codegen.ThisAssembly.SetLocale ((string) $2);\r
                          }\r
                        | D_LOCALE ASSIGN bytes_list\r
                        | D_HASH K_ALGORITHM int32\r
                          {\r
-                               codegen.SetAssemblyHashAlgorithm ((int) $3);\r
+                               codegen.ThisAssembly.SetHashAlgorithm ((int) $3);\r
                          }\r
                        | customattr_decl\r
                          {\r
-                               codegen.AddAssemblyCustomAttribute ((CustomAttr) $1);\r
+                               codegen.ThisAssembly.AddCustomAttribute ((CustomAttr) $1);\r
                          }\r
                        | sec_decl\r
+                         {\r
+                               AddSecDecl ($1, true);\r
+                         }\r
                        ;\r
 \r
 asm_or_ref_decl                : D_PUBLICKEY ASSIGN bytes_list\r
@@ -2487,19 +3150,19 @@ asm_or_ref_decl         : D_PUBLICKEY ASSIGN bytes_list
 assemblyref_all                : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
                        ;\r
 \r
-assemblyref_head       : D_ASSEMBLY K_EXTERN slashed_name\r
+assemblyref_head       : D_ASSEMBLY K_EXTERN asm_attr slashed_name\r
                           {\r
                                 System.Reflection.AssemblyName asmb_name = \r
                                        new System.Reflection.AssemblyName ();\r
-                               asmb_name.Name = (string) $3;\r
-                               codegen.BeginAssemblyRef ((string) $3, asmb_name);\r
+                               asmb_name.Name = (string) $4;\r
+                               codegen.BeginAssemblyRef ((string) $4, asmb_name, (PEAPI.AssemAttr) $3);\r
                           }\r
-                       | D_ASSEMBLY K_EXTERN slashed_name K_AS slashed_name\r
+                       | D_ASSEMBLY K_EXTERN asm_attr slashed_name K_AS slashed_name\r
                           {\r
                                 System.Reflection.AssemblyName asmb_name = \r
                                        new System.Reflection.AssemblyName ();\r
-                               asmb_name.Name = (string) $3;\r
-                               codegen.BeginAssemblyRef ((string) $5, asmb_name);\r
+                               asmb_name.Name = (string) $4;\r
+                               codegen.BeginAssemblyRef ((string) $6, asmb_name, (PEAPI.AssemAttr) $3);\r
                           }\r
                        ;\r
 \r
@@ -2531,7 +3194,8 @@ assemblyref_decl  : D_VER int32 COLON int32 COLON int32 COLON int32
                           }\r
                         | customattr_decl\r
                           {\r
-                                codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
+                                if (codegen.CurrentCustomAttrTarget != null)\r
+                                        codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
                           }\r
                        ;\r
 \r
@@ -2610,7 +3274,7 @@ float64                   : FLOAT64
                           {\r
                                 int i = (int) $3;\r
                                 byte[] intb = BitConverter.GetBytes (i);\r
-                                $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                                $$ = (double) BitConverter.ToSingle (intb, 0);\r
                           }\r
                         | K_FLOAT32 OPEN_PARENS INT64 CLOSE_PARENS\r
                           {\r
@@ -2621,12 +3285,12 @@ float64                 : FLOAT64
                        | K_FLOAT64 OPEN_PARENS INT64 CLOSE_PARENS\r
                           {\r
                                 byte[] intb = BitConverter.GetBytes ((long) $3);\r
-                               $$ = BitConverter.ToDouble (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                               $$ = BitConverter.ToDouble (intb, 0);\r
                           }\r
                         | K_FLOAT64 OPEN_PARENS INT32 CLOSE_PARENS\r
                           {\r
                                 byte[] intb = BitConverter.GetBytes ((int) $3);\r
-                                $$ = (double) BitConverter.ToSingle (intb, BitConverter.IsLittleEndian ? 0 : 4);\r
+                                $$ = (double) BitConverter.ToSingle (intb, 0);\r
                           }\r
                        ;\r
 \r
@@ -2680,7 +3344,7 @@ id                        : ID
                        ;\r
 \r
 comp_name              : id\r
-                       | comp_name DOT id\r
+                       | comp_name DOT comp_name\r
                           {\r
                                 $$ = (string) $1 + '.' + (string) $3;\r
                           }\r