Add methodheader.h, fix Makefile.am. Thanks to Alex

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


Commit migrated from b36357e896
This commit is contained in:
Miguel de Icaza 2001-06-29 14:06:16 +00:00
parent fe93a14505
commit 0a18b5c47d
4 changed files with 125 additions and 30 deletions

View File

@ -7,7 +7,7 @@ INCLUDES = $(GLIB_CFLAGS) -I$(top_srcdir)
libmetadata_a_SOURCES = \ libmetadata_a_SOURCES = \
assembly.c \ assembly.c \
metadata.c \ metadata.c \
rawbuffer.c \ rawbuffer.c
libmetadataincludedir = $(includedir)/mono/metadata libmetadataincludedir = $(includedir)/mono/metadata

View File

@ -8,6 +8,7 @@
*/ */
#include <config.h> #include <config.h>
#include <stdio.h>
#include <glib.h> #include <glib.h>
#include "metadata.h" #include "metadata.h"
#include "methodheader.h" #include "methodheader.h"
@ -543,8 +544,8 @@ compute_size (metadata_t *meta, MonoMetaTable *table, int rowcount, guint32 *res
n = MAX (n, meta->tables [META_TABLE_ASSEMBLYREF].rows); n = MAX (n, meta->tables [META_TABLE_ASSEMBLYREF].rows);
n = MAX (n, meta->tables [META_TABLE_TYPEREF].rows); n = MAX (n, meta->tables [META_TABLE_TYPEREF].rows);
/* 3 bits used to encode tag */ /* 2 bits used to encode tag (ECMA spec claims 3) */
field_size = rtsize (n, 16 - 3); field_size = rtsize (n, 16 - 2);
break; break;
} }
@ -660,7 +661,81 @@ dword_align (const char *ptr)
{ {
return (const char *) (((guint32) (ptr + 3)) & ~3); return (const char *) (((guint32) (ptr + 3)) & ~3);
} }
static MonoMetaExceptionHandler *
parse_exception_handler (const char *ptr, gboolean is_fat)
{
MonoMetaExceptionHandler *eh = g_new0 (MonoMetaExceptionHandler, 1);
int size;
eh->kind = (MonoMetaExceptionEnum) *ptr;
ptr++;
if (is_fat)
size = (ptr [0] << 16) | (ptr [1] << 8) | ptr [2];
else
size = (unsigned char) ptr [0];
/*
* It must be aligned
*/
ptr += 4;
g_assert ((((guint32) ptr) & 3) == 0);
if (is_fat){
printf ("Records: %d (%d)\n", size / 12, size);
} else {
printf ("Records: %d (%d)\n", size / 12, size);
}
return eh;
}
static void
parse_section_data (MonoMetaMethodHeader *mh, const char *ptr)
{
#if 0
*************
adsf
asdf
asdf
sadf
asfd
sdf
adsf
asf
while ((*ptr) & METHOD_HEADER_SECTION_MORE_SECTS){
/* align on 32-bit boundary */
/* FIXME: not 64-bit clean code */
ptr = dword_align (ptr);
sect_data_flags = *ptr;
ptr++;
if (sect_data_flags & METHOD_HEADER_SECTION_MORE_SECTS){
g_error ("Can not deal with more sections");
}
if (sect_data_flags & METHOD_HEADER_SECTION_FAT_FORMAT){
sect_data_len =
} else {
sect_data_len = ptr [0];
ptr++;
}
if (!(sect_data_flags & METHOD_HEADER_SECTION_EHTABLE))
return mh;
ptr = dword_align (ptr);
/*
* Now ptr points to the EH table header
*/
#endif
}
MonoMetaMethodHeader * MonoMetaMethodHeader *
mono_metadata_parse_mh (const char *ptr) mono_metadata_parse_mh (const char *ptr)
{ {
@ -668,8 +743,7 @@ mono_metadata_parse_mh (const char *ptr)
unsigned char flags = *(unsigned char *) ptr; unsigned char flags = *(unsigned char *) ptr;
unsigned char format = flags & METHOD_HEADER_FORMAT_MASK; unsigned char format = flags & METHOD_HEADER_FORMAT_MASK;
guint16 fat_flags; guint16 fat_flags;
unsigned char sect_data_flags; int hsize;
int hsize, sect_data_len;
g_return_val_if_fail (ptr != NULL, NULL); g_return_val_if_fail (ptr != NULL, NULL);
g_return_val_if_fail (mh != NULL, NULL); g_return_val_if_fail (mh != NULL, NULL);
@ -717,31 +791,8 @@ mono_metadata_parse_mh (const char *ptr)
* There are more sections * There are more sections
*/ */
ptr = mh->code + mh->code_size; ptr = mh->code + mh->code_size;
/* align on 32-bit boundary */
/* FIXME: not 64-bit clean code */
ptr = dword_align (ptr);
sect_data_flags = *ptr;
ptr++;
if (sect_data_flags & METHOD_HEADER_SECTION_MORE_SECTS){
g_error ("Can not deal with more sections");
}
if (sect_data_flags & METHOD_HEADER_SECTION_FAT_FORMAT){
sect_data_len = (ptr [0] << 16) | (ptr [1] << 8) | ptr [2];
ptr += 3;
} else {
sect_data_len = ptr [0];
ptr++;
}
if (!(sect_data_flags & METHOD_HEADER_SECTION_EHTABLE))
return mh;
ptr = dword_align (ptr);
parse_section_data (mh, ptr);
break; break;
default: default:

View File

@ -173,6 +173,20 @@ char *mono_metadata_locate_token (metadata_t *meta, guint32 token);
const char *mono_metadata_string_heap (metadata_t *meta, guint32 index); const char *mono_metadata_string_heap (metadata_t *meta, guint32 index);
const char *mono_metadata_blob_heap (metadata_t *meta, guint32 index); const char *mono_metadata_blob_heap (metadata_t *meta, guint32 index);
typedef enum {
MONO_META_EXCEPTION_CLAUSE_NONE,
MONO_META_EXCEPTION_CLAUSE_FILTER,
MONO_META_EXCEPTION_CLAUSE_FINALLY,
MONO_META_EXCEPTION_CLAUSE_FAULT
} MonoMetaExceptionEnum;
typedef struct {
MonoMetaExceptionEnum kind;
int n_clauses;
void **clauses;
} MonoMetaExceptionHandler;
typedef struct { typedef struct {
guint32 code_size; guint32 code_size;
const char *code; const char *code;
@ -182,6 +196,7 @@ typedef struct {
/* if local_var_sig_tok != 0, then the following apply: */ /* if local_var_sig_tok != 0, then the following apply: */
unsigned int init_locals : 1; unsigned int init_locals : 1;
GList *exception_handler_list;
} MonoMetaMethodHeader; } MonoMetaMethodHeader;
MonoMetaMethodHeader *mono_metadata_parse_mh (const char *ptr); MonoMetaMethodHeader *mono_metadata_parse_mh (const char *ptr);

View File

@ -0,0 +1,29 @@
#ifndef _MONO_METADATA_METHOD_HEADER_H_
#define _MONO_METADATA_METHOD_HEADER_H_
/*
* 25.2.1: Method header type values
*/
#define METHOD_HEADER_FORMAT_MASK 7
#define METHOD_HEADER_TINY_FORMAT 2
#define METHOD_HEADER_TINY_FORMAT1 6
#define METHOD_HEADER_FAT_FORMAT 3
/*
* 25.2.3.1: Flags for method headers
*/
#define METHOD_HEADER_INIT_LOCALS 0x10
#define METHOD_HEADER_MORE_SECTS 0x08
/*
* For section data (25.3)
*/
#define METHOD_HEADER_SECTION_RESERVED 0
#define METHOD_HEADER_SECTION_EHTABLE 1
#define METHOD_HEADER_SECTION_OPTIL_TABLE 2
#define METHOD_HEADER_SECTION_FAT_FORMAT 0x40
#define METHOD_HEADER_SECTION_MORE_SECTS 0x80
#endif /* _MONO_METADATA_METHOD_HEADER_H_ */