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().
{ 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 }
};
{ 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 }
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;
}