shithub: libmujs

ref: 8e20fae71a16f5e9564cce2aebec0a1ad8fbf9f4
dir: /jsobject.c/

View raw version
#include "js.h"
#include "jscompile.h"
#include "jsrun.h"
#include "jsobject.h"
#include "jsstate.h"

static js_Object *jsR_newfunction(js_State *J, js_Function *function, js_Environment *scope)
{
	js_Object *obj = jsR_newobject(J, JS_CFUNCTION, J->Function_prototype);
	obj->function = function;
	obj->scope = scope;
	return obj;
}

static js_Object *jsR_newscript(js_State *J, js_Function *function)
{
	js_Object *obj = jsR_newobject(J, JS_CSCRIPT, NULL);
	obj->function = function;
	return obj;
}

static js_Object *jsR_newcfunction(js_State *J, js_CFunction cfunction)
{
	js_Object *obj = jsR_newobject(J, JS_CCFUNCTION, NULL);
	obj->cfunction = cfunction;
	obj->cconstructor = NULL;
	return obj;
}

static js_Object *jsR_newcconstructor(js_State *J, js_CFunction cfunction, js_CFunction cconstructor)
{
	js_Object *obj = jsR_newobject(J, JS_CCFUNCTION, NULL);
	obj->cfunction = cfunction;
	obj->cconstructor = cconstructor;
	return obj;
}

js_Object *jsR_newboolean(js_State *J, int v)
{
	js_Object *obj = jsR_newobject(J, JS_CBOOLEAN, J->Boolean_prototype);
	obj->primitive.boolean = v;
	return obj;
}

js_Object *jsR_newnumber(js_State *J, double v)
{
	js_Object *obj = jsR_newobject(J, JS_CNUMBER, J->Number_prototype);
	obj->primitive.number = v;
	return obj;
}

js_Object *jsR_newstring(js_State *J, const char *v)
{
	js_Object *obj = jsR_newobject(J, JS_CSTRING, J->String_prototype);
	obj->primitive.string = v;
	return obj;
}

void js_newobject(js_State *J)
{
	js_pushobject(J, jsR_newobject(J, JS_COBJECT, J->Object_prototype));
}

void js_newarray(js_State *J)
{
	js_pushobject(J, jsR_newobject(J, JS_CARRAY, J->Array_prototype));
}

void js_newfunction(js_State *J, js_Function *F, js_Environment *scope)
{
	js_pushobject(J, jsR_newfunction(J, F, scope));
	js_pushnumber(J, F->numparams);
	js_setproperty(J, -2, "length");
	js_newobject(J);
	js_copy(J, -2);
	js_setproperty(J, -2, "constructor");
	js_setproperty(J, -2, "prototype");
}

void js_newscript(js_State *J, js_Function *F)
{
	js_pushobject(J, jsR_newscript(J, F));
}

void js_newcfunction(js_State *J, js_CFunction fun)
{
	js_pushobject(J, jsR_newcfunction(J, fun));
	// TODO: length property?
	js_newobject(J);
	js_copy(J, -2);
	js_setproperty(J, -2, "constructor");
	js_setproperty(J, -2, "prototype");
}

void js_newcconstructor(js_State *J, js_CFunction fun, js_CFunction con)
{
	js_pushobject(J, jsR_newcconstructor(J, fun, con));
	// TODO: length property?
	js_newobject(J);
	js_copy(J, -2);
	js_setproperty(J, -2, "constructor");
	js_setproperty(J, -2, "prototype");
}