[ilasm] Add another undocumented custom attributes initializer syntax
authorMarek Safar <marek.safar@gmail.com>
Mon, 22 Jun 2015 15:56:16 +0000 (17:56 +0200)
committerMarek Safar <marek.safar@gmail.com>
Mon, 22 Jun 2015 15:57:26 +0000 (17:57 +0200)
mcs/class/PEAPI/Metadata.cs
mcs/ilasm/parser/ILParser.jay

index c40f4a9ee95e522cee040c1d57893fdc44fd9058..5e33ca09a9b75f1989604391cf7763ba7afafc65 100644 (file)
@@ -453,17 +453,17 @@ namespace PEAPI {
                        if (bac != null)
                                return bac.val;
 
+                       var ms = new MemoryStream ();
+                       // Version info
+                       ms.WriteByte (1);
+                       ms.WriteByte (0);
+
                        var sc = c as StringConst;
                        if (sc != null) {
                                string value = sc.val;
                                if (value == null)
                                        throw new NotImplementedException ();
 
-                               var ms = new MemoryStream ();
-                               // Version info
-                               ms.WriteByte (1);
-                               ms.WriteByte (0);
-
                                var buf = Encoding.UTF8.GetBytes (value);
                                MetaData.CompressNum ((uint) buf.Length, ms);
                                var byteVal = ms.ToArray ();
@@ -472,6 +472,15 @@ namespace PEAPI {
                                return byteVal;
                        }
 
+                       var ac = c as ArrayConstant;
+                       if (ac != null) {
+                               var bw = new BinaryWriter (ms);
+                               bw.Write (ac.ExplicitSize.Value);
+                               ac.Write (bw);
+                               bw.Write ((short)0);
+                               return ms.ToArray ();
+                       }
+
                        throw new NotImplementedException (c.GetType ().ToString ());
                }
 
@@ -2942,7 +2951,7 @@ namespace PEAPI {
        /// <summary>
        /// Boolean constant
        /// </summary>
-       public class BoolConst : Constant {
+       public class BoolConst : DataConstant {
                bool val;
 
                /// <summary>
@@ -3296,6 +3305,8 @@ namespace PEAPI {
                        }
                }
 
+               public int? ExplicitSize { get; set; }
+
                internal sealed override void Write(BinaryWriter bw) 
                {
                        for (int i=0; i < dataVals.Length; i++) {
index 6fd3e8431bdf4408285284bf224081b79f6b8cd9..711b04938415b47589418e0888e431b2624ecf2a 100644 (file)
@@ -1679,7 +1679,31 @@ member_init : field_init_full
                          {\r
                                $$ = new StringConst ((string) $3);\r
                          }\r
-                       ;\r
+                       | K_BOOL OPEN_BRACKET int32 CLOSE_BRACKET OPEN_PARENS opt_truefalse_list CLOSE_PARENS\r
+                         {\r
+                               var l = (List<BoolConst>) $6;\r
+                               $$ = new ArrayConstant (l?.ToArray ()) {\r
+                                       ExplicitSize = (int) $3\r
+                               };\r
+                         }\r
+                       ;\r
+\r
+opt_truefalse_list\r
+                               : truefalse_list\r
+                               ;\r
+\r
+truefalse_list\r
+                               : truefalse\r
+                                 {\r
+                                       $$ = new List<BoolConst> () { new BoolConst ((bool) $1) };\r
+                                 }\r
+                               | truefalse_list truefalse\r
+                                 {\r
+                                       var l = (List<BoolConst>) $1;\r
+                                       l.Add (new BoolConst ((bool) $2));\r
+                                       $$ = l;\r
+                                 }\r
+                               ;\r
 \r
 data_decl              : data_head data_body\r
                           {\r