Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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);
}
Esempio n. 6
0
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);
}
Esempio n. 9
0
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);
}