mirror of https://github.com/dotnet/runtime
Add methodheader.h, fix Makefile.am. Thanks to Alex
svn path=/trunk/mono/; revision=42
Commit migrated from b36357e896
This commit is contained in:
parent
fe93a14505
commit
0a18b5c47d
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue