Explorar o código

Set Array.prototype on ArrayAccess wrapped object

Stefan Siegl %!s(int64=10) %!d(string=hai) anos
pai
achega
3f6ea8fcfd
Modificáronse 2 ficheiros con 7 adicións e 2 borrados
  1. 3 1
      tests/array_access.phpt
  2. 4 1
      v8js_convert.cc

+ 3 - 1
tests/array_access.phpt

@@ -37,6 +37,7 @@ $js = <<<EOJS
 var_dump(PHP.myarr.constructor.name);
 var_dump(PHP.myarr.length);
 var_dump(PHP.myarr[5]);
+var_dump(PHP.myarr.join(', '));
 EOJS;
 
 $v8 = new V8Js();
@@ -48,7 +49,8 @@ $v8->executeString($js);
 --EXPECT--
 int(20)
 int(14)
-string(11) "ArrayAccess"
+string(5) "Array"
 int(20)
 int(14)
+string(68) "19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0"
 ===EOF===

+ 4 - 1
v8js_convert.cc

@@ -956,10 +956,13 @@ static v8::Handle<v8::Value> php_v8js_array_access_to_jsobj(zval *value, v8::Iso
 	inst_tpl->SetAccessor(V8JS_STR("length"), php_v8js_array_access_length);
 	inst_tpl->SetInternalFieldCount(1);
 
-
 	v8::Handle<v8::Object> newobj = inst_tpl->NewInstance();
 	newobj->SetAlignedPointerInInternalField(0, value);
 
+	/* Change prototype of `newobj' to that of Array */
+	v8::Local<v8::Array> arr = v8::Array::New(isolate);
+	newobj->SetPrototype(arr->GetPrototype());
+
 	return newobj;
 }
 /* }}} */