static void JsFunctionProtoInit(struct JsObject* obj,struct JsObject* obj_proto, struct JsObject* fun,struct JsObject* fun_proto){ struct JsValue* vProperty ; fun_proto->Prototype = obj_proto; fun_proto->Call = &JsFunctionProtoCall; //constructor vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = fun; (*fun_proto->Put)(fun_proto,"constructor",vProperty,JS_OBJECT_ATTR_DONTENUM); //toString vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsFunctionProtoToStringCall; (*fun_proto->Put)(fun_proto,"toString",vProperty,JS_OBJECT_ATTR_DONTENUM); //apply vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsFunctionProtoApplyCall; (*fun_proto->Put)(fun_proto,"apply",vProperty,JS_OBJECT_ATTR_DONTENUM); //call vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsFunctionProtoCallCall; (*fun_proto->Put)(fun_proto,"call",vProperty,JS_OBJECT_ATTR_DONTENUM); }
static void JsStringProtoInit(struct JsObject* str,struct JsObject* str_proto){ struct JsValue* p = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); //String.prototype.constructor p= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); p->type = JS_OBJECT; p->u.object = str; (*str_proto->Put)(str_proto,"constructor",p,JS_OBJECT_ATTR_DONTENUM); //toString p= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsStringProtoToString; (*str_proto->Put)(str_proto,"toString",p,JS_OBJECT_ATTR_DONTENUM); //valueOf p= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsStringProtoValueOf; (*str_proto->Put)(str_proto,"valueOf",p,JS_OBJECT_ATTR_DONTENUM); //CharAt p= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsStringProtoCharAt; (*str_proto->Put)(str_proto,"charAt",p,JS_OBJECT_ATTR_DONTENUM); //Concat p= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsStringProtoConcat; (*str_proto->Put)(str_proto,"concat",p,JS_OBJECT_ATTR_DONTENUM); }
static void JsInitResponse(struct JsObject* response){ struct JsValue* p= NULL; p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &setHeader; (*response->Put)(response,"setHeader",p,JS_OBJECT_ATTR_STRICT); p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &setStatus; (*response->Put)(response,"setStatus",p,JS_OBJECT_ATTR_STRICT); p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &write0; (*response->Put)(response,"write",p,JS_OBJECT_ATTR_STRICT); p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &clear; (*response->Put)(response,"clear",p,JS_OBJECT_ATTR_STRICT); }
void JsECMAScriptObjectInit(struct JsVm* vm) { struct JsValue t ; struct JsValue* v; //初始化vm->Global对象 struct JsObject* Global = JsCreateStandardObject(NULL); vm->Global = Global; JsOFInit(vm); JsArrayInit(vm); JsStringInit(vm); JsBooleanInit(vm); JsNumberInit(vm); //配置Global //Gloabl->Prototype (*vm->Global->Get)(vm->Global,"Object",NULL,&t); if(t.type != JS_OBJECT) JsAssert(FALSE); (*t.u.object->Get)(t.u.object,"prototype",NULL,&t); vm->Global->Prototype = t.u.object; //Global->Class vm->Global->Class = "Global"; //NaN v = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); v->type = JS_NUMBER; v->u.number = JS_VALUE_NUMBER_NAN; (*vm->Global->Put)(vm->Global,"NaN",v,JS_OBJECT_ATTR_STRICT); //undefined v = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); v->type = JS_UNDEFINED; (*vm->Global->Put)(vm->Global,"undefined",v,JS_OBJECT_ATTR_STRICT); //eval v = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); v->type = JS_OBJECT; v->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); v->u.object->Call = &JsGlobalEval; (*vm->Global->Put)(vm->Global,"eval",v,JS_OBJECT_ATTR_STRICT); //isNaN v = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); v->type = JS_OBJECT; v->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); v->u.object->Call = &JsIsNaN; (*vm->Global->Put)(vm->Global,"isNaN",v,JS_OBJECT_ATTR_STRICT); }
void JsStringInit(struct JsVm* vm){ struct JsObject* str = JsCreateStandardFunctionObject(NULL,NULL,TRUE); struct JsObject* str_proto = JsCreateStringObject(NULL,NULL); JsStringFunctionInit(str,str_proto); JsStringProtoInit(str,str_proto); struct JsValue* v = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); v->type = JS_OBJECT; v->u.object = str; (*vm->Global->Put)(vm->Global,"String",v,JS_OBJECT_ATTR_STRICT); }
static void JsObjectProtoInit(struct JsObject* obj,struct JsObject* obj_proto, struct JsObject* fun,struct JsObject* fun_proto){ struct JsValue* vProperty ; //constructor vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = obj; (*obj_proto->Put)(obj_proto,"constructor",vProperty,JS_OBJECT_ATTR_DONTENUM); //toString vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsObjectProtoToStringCall; (*obj_proto->Put)(obj_proto,"toString",vProperty,JS_OBJECT_ATTR_DONTENUM); //valueOf vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsObjectProtoValueOfCall; (*obj_proto->Put)(obj_proto,"valueOf",vProperty,JS_OBJECT_ATTR_DONTENUM); //hasOwnProperty vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsObjectProtoHasOwnPropertyCall; (*obj_proto->Put)(obj_proto,"hasOwnProperty",vProperty,JS_OBJECT_ATTR_DONTENUM); //isPrototypeOf vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsObjectProtoIsPrototypeOfCall; (*obj_proto->Put)(obj_proto,"isPrototypeOf",vProperty,JS_OBJECT_ATTR_DONTENUM); //propertyIsEnumerable vProperty= (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vProperty->type = JS_OBJECT; vProperty->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); vProperty->u.object->Call = &JsObjectProtoPropertyIsEnumerableCall; (*obj_proto->Put)(obj_proto,"propertyIsEnumerable",vProperty,JS_OBJECT_ATTR_DONTENUM); }
static void JsArrayProtoInit(struct JsObject* array,struct JsObject* array_proto){ struct JsValue* p; //Array.prototype.constructor p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = array; (*array_proto->Put)(array_proto,"constructor",p,JS_OBJECT_ATTR_DONTENUM); //Array.prototype.toString p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsArrayProtoToString; (*array_proto->Put)(array_proto,"toString",p,JS_OBJECT_ATTR_DONTENUM); //Array.prototype.join p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsArrayProtoJoin; (*array_proto->Put)(array_proto,"join",p,JS_OBJECT_ATTR_DONTENUM); //Array.prototype.pop p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsArrayProtoPop; (*array_proto->Put)(array_proto,"pop",p,JS_OBJECT_ATTR_DONTENUM); //Array.prototype.push p= JsCreateValue(); p->type = JS_OBJECT; p->u.object = JsCreateStandardFunctionObject(NULL,NULL,FALSE); p->u.object->Call = &JsArrayProtoPush; (*array_proto->Put)(array_proto,"push",p,JS_OBJECT_ATTR_DONTENUM); }
//---------------------------------------------------------------------------- void JsArrayInit(struct JsVm* vm){ struct JsObject* array = JsCreateStandardFunctionObject(NULL,NULL,TRUE); //Array.prototype 是一个缩减版的Array对象 struct JsObject* array_proto = JsCreateArray(NULL,0,NULL); JsArrayFunctionInit(array,array_proto); JsArrayProtoInit(array,array_proto); //向Global添加Array struct JsValue* v = JsCreateValue(); v->type = JS_OBJECT; v->u.object = array; (*vm->Global->Put)(vm->Global,"Array",v,JS_OBJECT_ATTR_STRICT); }
void JsOFInit(struct JsVm* vm){ struct JsValue* vPrototype; struct JsObject* obj = JsCreateStandardFunctionObject(NULL,NULL,TRUE); struct JsObject* obj_proto = JsCreateStandardObject(NULL); struct JsObject* fun = JsCreateStandardFunctionObject(NULL,NULL,TRUE); //不存在construct和prototype属性 struct JsObject* fun_proto = JsCreateStandardFunctionObject(NULL,NULL,FALSE); //预先配置他们的prototype属性, 给CreateObject类型函数使用 vPrototype = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vPrototype->type = JS_OBJECT; vPrototype->u.object = obj_proto; (*obj->Put)(obj,"prototype",vPrototype,JS_OBJECT_ATTR_STRICT); vPrototype = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vPrototype->type = JS_OBJECT; vPrototype->u.object = fun_proto; (*fun->Put)(fun,"prototype",vPrototype,JS_OBJECT_ATTR_STRICT); //向Global添加Object和Function struct JsValue* vObject = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vObject->type = JS_OBJECT; vObject->u.object = obj; struct JsValue* vFunction = (struct JsValue*)JsMalloc(sizeof(struct JsValue)); vFunction->type = JS_OBJECT; vFunction->u.object = fun; (*vm->Global->Put)(vm->Global,"Object",vObject,JS_OBJECT_ATTR_STRICT); (*vm->Global->Put)(vm->Global,"Function",vFunction,JS_OBJECT_ATTR_STRICT); //到现在已经可以正常的使用CreateObject 类型函数, Prototype属性不会缺失. //注意 上述四个对象的Prototype属性依旧为NULL, 且obj_proto->Prototype = NULL; JsObjectInit(obj,obj_proto,fun,fun_proto); JsObjectProtoInit(obj,obj_proto,fun,fun_proto); JsFunctionInit(obj,obj_proto,fun,fun_proto); JsFunctionProtoInit(obj,obj_proto,fun,fun_proto); }