view runtime/object.h @ 163:9fab36cc706b

Add Raw Size method to blueprint to allow code to query the raw size of a type in bytes
author Mike Pavone <pavone@retrodev.com>
date Sun, 09 Jan 2011 23:03:30 -0500
parents a68e6828d896
children ba35ab624ec2
line wrap: on
line source

#ifndef OBJECT_H_
#define OBJECT_H_

#include "plat_types.h"
#include "thread.h"
#include "func.h"

typedef struct{
	rhope_func     *method_lookup;
	rhope_func     *getter_lookup;
	rhope_func     *setter_lookup;
	rhope_func     *convert_to;
	rhope_func     *convert_from;
	special_func   init;
	special_func   copy;
	special_func   cleanup;
	special_func   free;
	struct object  *name;
	uint32_t       type_id;
	uint32_t       first_methodid;
	uint32_t       last_methodid;
	uint32_t       first_getfieldid;
	uint32_t       last_getfieldid;
	uint32_t       first_setfieldid;
	uint32_t       last_setfieldid;
	uint32_t       first_convertto;
	uint32_t       last_convertto;
	uint32_t       first_convertfrom;
	uint32_t       last_convertfrom;
	int32_t        size;
	int32_t        boxed_size;
} blueprint;

struct object {
	rh_atomic32(refcount);
	blueprint  *bprint;
};

typedef struct {
	object    base;
	uint32_t  size;
} multisize;

#pragma pack(push,1)
struct calldata {
	struct calldata	*lastframe;
	void            *vars;
#ifdef ENABLE_PROFILING
	uint64_t        start;
	uint64_t        accum;
	uint64_t        self_start;
	uint64_t        self_accum;
	uint64_t        *myactivationlevel;
#endif
	uint32_t        func;
	uint16_t        num_params;
	uint16_t        callspace;
	object 	        *params[1];
};
#pragma pack(pop)

#define OBegin typedef struct {
#define Object(name) } nt_ ## name; typedef struct { object SP_header; nt_ ## name payload; } t_ ## name;
#define MObject(name) } nt_ ## name; typedef struct { multisize SP_header; nt_ ## name payload; } t_ ## name; 
#define Box(nakedtype,fieldname,objectname) typedef struct{ object SP_header; nakedtype fieldname; } t_ ## objectname;

#define get_blueprint(object) (object)->bprint

#define add_ref(object) (rh_atomic_add((object), refcount, 1),object)

returntype call_method(uint32_t methodid, calldata * params);
returntype set_field(uint32_t setfieldid, calldata * params);
returntype get_field(uint32_t getfieldid, calldata * params);
object * alloc_object(blueprint * bp);
void * alloc_variable(uint32_t size);
object * new_object(uint32_t type);
object * new_object_bp(blueprint * bp);
multisize * new_multisize(uint32_t type, uint32_t size);
void release_ref(object * obj);
blueprint * register_type_byid(uint32_t type, int32_t size, special_func init, special_func copy, special_func cleanup);
blueprint * register_type(int32_t size, special_func init, special_func copy, special_func cleanup);
blueprint * new_blueprint(uint32_t type, int32_t size, special_func init, special_func copy, special_func cleanup);
void add_method(blueprint * bp, uint32_t methodid, rhope_func impl);
void add_getter(blueprint * bp, uint32_t fieldid, rhope_func impl);
void add_setter(blueprint * bp, uint32_t fieldid, rhope_func impl);
returntype convert_to(uint32_t convertto, calldata * params);
returntype convert_from(uint32_t convertfrom, calldata * params);
object * copy_object(object * tocopy);
object * naked_to_boxed(uint32_t type, void * rawdata);
void boxed_to_naked(object * src, void * dest);
returntype coerce_value(uint32_t type, calldata * params);
blueprint * get_blueprint_byid(uint32_t type);

extern blueprint ** registered_types;
extern uint32_t max_registered_type;
#include "fixed_alloc.h"
extern mem_manager * manager;

#define INITIAL_TYPE_STORAGE	32
#define INITIAL_METHOD_LOOKUP	8
#define BELOW_INITIAL_METHOD	3

#endif //OBJECT_H_