[Mono-dev] Runtime.MonoIline

Jerry Maine crashfourit at gmail.com
Sat Jan 24 16:43:32 EST 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

You mean something like this? (Released under MIT/X11 license)


gboolean*
mono_index_custom_attr (MonoImage *image, guint32 idx, const char
*attr_assembly, const char *attr_name_space, const char *attr)
{
    guint32 mtoken, i, len;
    guint32 cols [MONO_CUSTOM_ATTR_SIZE];
    MonoTableInfo *ca;
    //MonoCustomAttrInfo *ainfo;
    GList *tmp, *list = NULL;
    MonoMethod* attr_ctor;

    ca = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];

    if ((attr_assembly == NULL) || (attr_name_space == NULL) || (attr
== NULL))
        return FALSE;
   
    if (!mono_image_has_assembly_ref(assembly->image, attr_assembly)
        return FALSE;

    i = mono_metadata_custom_attrs_from_index (image, idx);
    if (!i)
        return NULL;
    i --;
    while (i < ca->rows) {
        if (mono_metadata_decode_row_col (ca, i,
MONO_CUSTOM_ATTR_PARENT) != idx)
            break;
        list = g_list_prepend (list, GUINT_TO_POINTER (i));
        ++i;
    }
    len = g_list_length (list);
    if (!len)
        return NULL;

    for (i = 0, tmp = list; i < len; ++i, tmp = tmp->next) {
        mono_metadata_decode_row (ca, GPOINTER_TO_UINT (tmp->data),
cols, MONO_CUSTOM_ATTR_SIZE);
        mtoken = cols [MONO_CUSTOM_ATTR_TYPE] >>
MONO_CUSTOM_ATTR_TYPE_BITS;
        switch (cols [MONO_CUSTOM_ATTR_TYPE] &
MONO_CUSTOM_ATTR_TYPE_MASK) {
        case MONO_CUSTOM_ATTR_TYPE_METHODDEF:
            mtoken |= MONO_TOKEN_METHOD_DEF;
            break;
        case MONO_CUSTOM_ATTR_TYPE_MEMBERREF:
            mtoken |= MONO_TOKEN_MEMBER_REF;
            break;
        default:
            g_error ("Unknown table for custom attr type %08x", cols
[MONO_CUSTOM_ATTR_TYPE]);
            break;
        }
        attr_ctor = mono_get_method (image, mtoken, NULL);
        if (!attr_ctor) {
            g_warning ("Can't find custom attr constructor image: %s
mtoken: 0x%08x", image->name, mtoken);
            g_list_free (list);
            //g_free (ainfo);
            return FALSE;
        } else {
            if (strcmp (attr_ctor->klass->image->assembly_name,
attr_assembly) )
                continue;
           
            if (strcmp (attr_ctor->klass->name_space, attr_name_space) )
                continue;

            if (!strcmp (attr_ctor->klass->name, attr_name) ) {
                g_list_free (list);
                return TRUE;
            }
        }
    }
    g_list_free (list);

    return FALSE;
}
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkl7i3sACgkQ1jvea6V8vHJO5ACfRi0EdEaVLnURhKs2gkguhILV
32oAnAh3013UYegJZ+kbdNxG5oehjfnZ
=uOXp
-----END PGP SIGNATURE-----



More information about the Mono-devel-list mailing list