New tests.
[mono.git] / mcs / ilasm / parser / ILParser.jay
index 95cba438734594ff923a3ac3504b0dfaac201abc..b94d64121b1a36638fffc5c6fdd68b3f5c57b352 100644 (file)
@@ -15,6 +15,9 @@ using System.Reflection;
 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
        public class ILParser {\r
@@ -57,13 +60,29 @@ namespace Mono.ILASM {
                         if ((action == System.Security.Permissions.SecurityAction.RequestMinimum || \r
                                 action == System.Security.Permissions.SecurityAction.RequestOptional || \r
                                 action == System.Security.Permissions.SecurityAction.RequestRefuse) && !for_assembly) {\r
-                                Console.Error.WriteLine (String.Format ("System.Security.Permissions.SecurityAction '{0}' is not valid for this declaration", action));\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
@@ -110,9 +129,8 @@ namespace Mono.ILASM {
 \r
                 private BaseTypeRef GetTypeRef (BaseTypeRef b)\r
                 {\r
-                        if (b is BaseClassRef)\r
-                                return ((BaseClassRef) b).Clone ();\r
-                        return b;\r
+                        //FIXME: Caching required.. \r
+                        return b.Clone ();\r
                 }\r
 \r
 %}\r
@@ -294,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
@@ -416,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
@@ -440,6 +460,7 @@ namespace Mono.ILASM {
 // %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
@@ -748,6 +769,14 @@ formal_typar_attr  : /* EMPTY */
                           {\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
@@ -849,16 +878,13 @@ class_decl                : method_all
                        | data_decl\r
                        | sec_decl\r
                          {\r
-                               PermPair pp = (PermPair) $1;\r
-                               if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) (short) pp.sec_action, false))\r
-                                       Report.Error (String.Format ("Invalid security action : {0}", pp.sec_action));\r
-\r
-                               codegen.AddPermission (pp.sec_action, pp.perm);\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
@@ -890,8 +916,8 @@ class_decl          : method_all
                                         (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, 0);\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
@@ -906,10 +932,6 @@ type                       : generic_class_ref
                           {\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
                                BaseClassRef class_ref = (BaseClassRef) $3;\r
@@ -969,7 +991,7 @@ type                        : generic_class_ref
                                 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
@@ -984,28 +1006,12 @@ type                     : generic_class_ref
                           {\r
                                 $$ = new MethodPointerTypeRef ((CallConv) $2, (BaseTypeRef) $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
-                          }\r
-                       | K_BOOL\r
-                          {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Boolean");\r
-                          }\r
-                       | K_INT8\r
+                       | primitive_type\r
+                       ;\r
+\r
+                       ;\r
+\r
+primitive_type         : K_INT8\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
                           }\r
@@ -1045,7 +1051,6 @@ type                      : generic_class_ref
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt16, "System.UInt16");     \r
                           }\r
-\r
                        | K_UNSIGNED K_INT32\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.UInt32, "System.UInt32");\r
@@ -1067,7 +1072,6 @@ type                      : generic_class_ref
                                 // 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
@@ -1076,6 +1080,31 @@ type                     : generic_class_ref
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.NativeUInt, "System.UIntPtr");\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
+                          }\r
+                       | K_BOOL\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Boolean, "System.Boolean");\r
+                          }\r
+                       | K_STRING\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.String, "System.String");\r
+                          }\r
                        ;\r
 \r
 bounds                 : bound\r
@@ -1222,6 +1251,9 @@ native_type               : /* EMPTY */
                                 $$ = NativeType.Float64;\r
                           }\r
                        | K_ERROR\r
+                          {\r
+                                $$ = NativeType.Error;\r
+                          }\r
                        | K_UNSIGNED K_INT8\r
                           {\r
                                 $$ = NativeType.UInt8;\r
@@ -1350,6 +1382,9 @@ native_type               : /* EMPTY */
                                 $$ = NativeType.AsAny;\r
                           }\r
                        | K_LPSTRUCT\r
+                          {\r
+                                $$ = NativeType.LPStruct;\r
+                          }\r
                        ;\r
 \r
 variant_type           : /* EMPTY */\r
@@ -1560,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
@@ -1620,6 +1655,9 @@ field_init                : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
                           {\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
@@ -1882,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
@@ -2038,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
@@ -2108,8 +2152,16 @@ method_decl              : D_EMITBYTE int32
                        | 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
@@ -2120,17 +2172,14 @@ method_decl             : D_EMITBYTE int32
                        | instr\r
                        | sec_decl\r
                          {\r
-                               PermPair pp = (PermPair) $1;\r
-                               if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) (short) pp.sec_action, false))\r
-                                       Report.Error (String.Format ("Invalid security action : {0}", pp.sec_action));\r
-\r
-                               codegen.AddPermission (pp.sec_action, pp.perm);\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
@@ -2196,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
@@ -2251,12 +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
                                if ($2.GetType () == typeof (PrimitiveTypeRef))\r
                                        Report.Error ("Exception not be of a primitive type.");\r
                                        \r
-                                BaseClassRef type = (BaseClassRef) $2;\r
+                                BaseTypeRef type = (BaseTypeRef) $2;\r
                                 CatchBlock cb = new CatchBlock (type);\r
                                 cb.SetHandlerBlock ((HandlerBlock) $3);\r
                                 $$ = cb;\r
@@ -2313,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
@@ -2333,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
@@ -2344,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
@@ -2355,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
@@ -2391,13 +2449,23 @@ instr                   : INSTR_NONE
                           }\r
                        | INSTR_R bytes_list\r
                           {\r
+                               byte[] fpdata;\r
                                 switch ((MiscInstr) $1) {\r
                                         case MiscInstr.ldc_r4:\r
-                                                float s = BitConverter.ToSingle ((byte []) $2, 0);\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
-                                                double d = BitConverter.ToDouble ((byte []) $2, 0);\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
@@ -2547,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
@@ -2559,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
@@ -2645,7 +2713,8 @@ event_decl                : D_ADDON 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
@@ -2706,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
@@ -2728,7 +2798,7 @@ 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
                                 BaseTypeRef owner = (BaseTypeRef) $3;\r
                                 ArrayList arg_list = (ArrayList) $7;\r
@@ -2742,7 +2812,7 @@ custom_type               : call_conv type type_spec DOUBLE_COLON D_CTOR OPEN_PARENS type_lis
                                 $$ = 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
                                 BaseTypeRef[] param_list;\r
@@ -2778,6 +2848,84 @@ sec_decl         : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PA
                                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
@@ -2936,19 +3084,29 @@ file_entry              : /* EMPTY */
 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
@@ -2957,32 +3115,28 @@ 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
-                               PermPair pp = (PermPair) $1;\r
-                               if (!CheckSecurityActionValidity ((System.Security.Permissions.SecurityAction) (short) pp.sec_action, true))\r
-                                       Report.Error (String.Format ("Invalid security action : {0}", pp.sec_action));\r
-\r
-                               codegen.AddAssemblyPermission (pp.sec_action, pp.perm);\r
+                               AddSecDecl ($1, true);\r
                          }\r
                        ;\r
 \r
@@ -2996,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
@@ -3040,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
@@ -3119,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
@@ -3130,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