ref: 8aa062755760b61f9131a0411e9125bafddc0a4f
dir: /jsobject.c/
#include "js.h" #include "jscompile.h" #include "jsobject.h" #include "jsrun.h" #include "jsstate.h" #include "jsutf.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->u.f.function = function; obj->u.f.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->u.f.function = function; obj->u.f.scope = NULL; return obj; } static js_Object *jsR_newcfunction(js_State *J, js_CFunction cfunction) { js_Object *obj = jsR_newobject(J, JS_CCFUNCTION, J->Function_prototype); obj->u.c.function = cfunction; obj->u.c.constructor = NULL; return obj; } js_Object *jsR_newcconstructor(js_State *J, js_CFunction cfunction, js_CFunction cconstructor) { js_Object *obj = jsR_newobject(J, JS_CCFUNCTION, J->Function_prototype); obj->u.c.function = cfunction; obj->u.c.constructor = cconstructor; return obj; } js_Object *jsR_newboolean(js_State *J, int v) { js_Object *obj = jsR_newobject(J, JS_CBOOLEAN, J->Boolean_prototype); obj->u.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->u.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->u.string = v; { js_Property *ref; ref = jsR_setproperty(J, obj, "length"); ref->value.type = JS_TNUMBER; ref->value.u.number = utflen(v); ref->readonly = 1; ref->dontenum = 1; ref->dontconf = 1; } 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, int length) { js_pushobject(J, jsR_newcfunction(J, fun)); { js_pushnumber(J, length); js_setproperty(J, -2, "length"); js_newobject(J); { js_copy(J, -2); js_setproperty(J, -2, "constructor"); } js_setproperty(J, -2, "prototype"); } }