Make util.c:flags() stricter -- don't silently ignore unknown flags
authorRaja R Harinath <harinath@hurrynot.org>
Tue, 30 Mar 2010 08:59:22 +0000 (08:59 -0000)
committerRaja R Harinath <harinath@hurrynot.org>
Tue, 30 Mar 2010 08:59:22 +0000 (08:59 -0000)
* get.c (field_flags_map): Add empty entries for
HAS_FIELD_MARSHAL, HAS_DEFAULT and HAS_FIELD_RVA.
* main.c (method_flags_map): Add empty entry for HAS_SECURITY.
* util.c (flags): Remove known flags from 'code' in loop.  Any
leftover flags are printed as "unknown-flag-xx".

svn path=/trunk/mono/; revision=154432

mono/dis/ChangeLog
mono/dis/get.c
mono/dis/main.c
mono/dis/util.c

index 24764c2901dfab880648f40347e783121077010a..5194a8e66669254df00fc6535b932bbf35dbed61 100644 (file)
@@ -1,5 +1,12 @@
 2010-03-30  Raja R Harinath  <harinath@hurrynot.org>
 
+       Make util.c:flags() stricter
+       * get.c (field_flags_map): Add empty entries for
+       HAS_FIELD_MARSHAL, HAS_DEFAULT and HAS_FIELD_RVA.
+       * main.c (method_flags_map): Add empty entry for HAS_SECURITY.
+       * util.c (flags): Remove known flags from 'code' in loop.  Any
+       leftover flags are printed as "unknown-flag-xx".
+
        Prepare for util.c:flags() to be stricter
        * main.c (pinvoke_flags): Remove cset and cconv flags before
        passing onto flags().
index ab5b63d1c0b3e289741e4cfddcc4a0e8c5aac928..5522dfa05164ccf9db5f277356a3911d53ab21dc 100644 (file)
@@ -1622,7 +1622,15 @@ static dis_map_t field_flags_map [] = {
        { FIELD_ATTRIBUTE_SPECIAL_NAME,        "specialname " },
        { FIELD_ATTRIBUTE_PINVOKE_IMPL,        "FIXME:pinvokeimpl " },
        { FIELD_ATTRIBUTE_RT_SPECIAL_NAME,        "rtspecialname " },
-       /*{ FIELD_ATTRIBUTE_HAS_FIELD_MARSHAL,        "hasfieldmarshal " },*/
+
+       /* This is set when a MarshalAs attribute is seen. FIXME: round-trip?  */
+       { FIELD_ATTRIBUTE_HAS_FIELD_MARSHAL,        "" },
+
+       /* This seems to be set if LITERAL is set. FIXME: round-trip? */
+       { FIELD_ATTRIBUTE_HAS_DEFAULT,          "" },
+
+       /* This seems to be set on compiler-generated array initializer fields. FIXME: round-trip? */
+       { FIELD_ATTRIBUTE_HAS_FIELD_RVA,                "" },
        { 0, NULL }
 };
 
index 7b0b5ad3ef1197565c1274b43a3c813abb8415b9..a5c23595fd0f6e8f9d7cd33680078d2ca64eeec8 100644 (file)
@@ -535,8 +535,8 @@ static dis_map_t method_flags_map [] = {
        { METHOD_ATTRIBUTE_RT_SPECIAL_NAME,     "rtspecialname " },
        { METHOD_ATTRIBUTE_UNMANAGED_EXPORT,    "export " },
 /* MS ilasm doesn't compile this statement - is must be added automagically when permissionset are present */
-/*     { METHOD_ATTRIBUTE_HAS_SECURITY,        "hassecurity" }, */
-       { METHOD_ATTRIBUTE_REQUIRE_SEC_OBJECT,  "requiresecobj" },
+       { METHOD_ATTRIBUTE_HAS_SECURITY,        "" /*"hassecurity"*/ },
+       { METHOD_ATTRIBUTE_REQUIRE_SEC_OBJECT,  "requiresecobj " },
        { METHOD_ATTRIBUTE_PINVOKE_IMPL,        "pinvokeimpl " }, 
        { METHOD_ATTRIBUTE_STRICT,                  "strict " }, 
        { 0, NULL }
index e5e467d09ffcb6914bd6f6814784dacfbfaa1e6d..8f91209e2971f15223c09eb5431be5ed2d37c4fe 100644 (file)
@@ -45,12 +45,19 @@ flags (guint32 code, dis_map_t *table)
        
        buffer [0] = 0;
        
-       for (i = 0; table [i].str != NULL; i++)
-               if (table [i].code & code) {
-                       if (buffer [0])
-                               strcat (buffer, " ");
-                       strcat (buffer, table [i].str);
-               }
+       for (i = 0; code && table [i].str != NULL; i++) {
+               if (!(table [i].code & code))
+                       continue;
+               code &= ~table [i].code;
+               if (!*table [i].str)
+                       continue;
+               if (buffer [0])
+                       strcat (buffer, " ");
+               strcat (buffer, table [i].str);
+       }
+
+       if (code)
+               sprintf (buffer + strlen (buffer), " unknown-flag-%2x", code);
 
        return buffer;
 }