view runtime/object.h @ 251:2557ce4e671f

Fix a couple of compiler bugs. topenv was getting initialized in multiple places. This resulted in multiple copies of modules getting created which caused problems for macro expansion. Additionally, arguments were not being marked as declared during code generation so assigning to an argument that was not closed over generated invalid C code.
author Michael Pavone <pavone@retrodev.com>
date Fri, 11 Apr 2014 22:29:32 -0700
parents 18598163e3ef
children 75dc7161c1ca
line wrap: on
line source

#ifndef OBJECT_H_
#define OBJECT_H_

#include <stdint.h>
#include <stdarg.h>

typedef struct obj_meta obj_meta;

typedef struct object
{
	obj_meta * meta;
	struct object * parent;
} object;

typedef object * (*method)(uint32_t method_id, uint32_t num_args, object * self, va_list args);

typedef object * (*closure_func)(void *, uint32_t, ...);
/*
typedef struct closure
{
	object header;
	void * env;
	closure_func func;
} closure;
*/
struct obj_meta
{
	uint32_t size;
	method   meth_lookup[16];
};

extern obj_meta lambda_meta;

object * mcall(uint32_t method_id, uint32_t num_args, object * self, ...);
#define ccall(clos, num_args, ...) (((lambda *)clos)->func(((lambda *)clos)->env, num_args,##__VA_ARGS__))

object * make_object(obj_meta * meta, void * parent, int num_props, ...);
object * make_lambda(void * env, closure_func func);
object * make_array(uint32_t num_els, ...);
object * make_list(uint32_t num_els, ...);

#endif //OBJECT_H_