diff --git a/tests/array_pass.phpt b/tests/array_pass.phpt new file mode 100644 index 0000000..834fa05 --- /dev/null +++ b/tests/array_pass.phpt @@ -0,0 +1,99 @@ +--TEST-- +Test V8::executeString() : Check passing array from JS to PHP +--SKIPIF-- + +--FILE-- +test = function ($arr) { var_dump($arr); }; +try { + $v8->executeString('PHP.test([0, 1, 2]);'); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + $v8->executeString('PHP.test({ "0" : "0", "1" : "1", "2" : "2" });'); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + $v8->executeString('PHP.test({ "0" : "foo", "1" : "bar", "2" : "baz" });'); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + $v8->executeString('PHP.test({ "foo" : "0", "bar" : "1", "baz" : "2" });'); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + // includes gap + $v8->executeString('PHP.test({ "0" : "0", "2" : "2", "3" : "3" });'); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + // mixed key types + $v8->executeString('PHP.test({ "0" : "0", "bar" : "1", "2" : "2" });'); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +?> +===EOF=== +--EXPECT-- +array(3) { + [0]=> + int(0) + [1]=> + int(1) + [2]=> + int(2) +} +object(V8Object)#3 (3) { + ["0"]=> + string(1) "0" + ["1"]=> + string(1) "1" + ["2"]=> + string(1) "2" +} +object(V8Object)#3 (3) { + ["0"]=> + string(3) "foo" + ["1"]=> + string(3) "bar" + ["2"]=> + string(3) "baz" +} +object(V8Object)#3 (3) { + ["foo"]=> + string(1) "0" + ["bar"]=> + string(1) "1" + ["baz"]=> + string(1) "2" +} +object(V8Object)#3 (3) { + ["0"]=> + string(1) "0" + ["2"]=> + string(1) "2" + ["3"]=> + string(1) "3" +} +object(V8Object)#3 (3) { + ["0"]=> + string(1) "0" + ["2"]=> + string(1) "2" + ["bar"]=> + string(1) "1" +} +===EOF=== diff --git a/tests/array_pass_flags.phpt b/tests/array_pass_flags.phpt new file mode 100644 index 0000000..5bcc594 --- /dev/null +++ b/tests/array_pass_flags.phpt @@ -0,0 +1,99 @@ +--TEST-- +Test V8::executeString() : Check passing array from JS to PHP (using force array flag) +--SKIPIF-- + +--FILE-- +test = function ($arr) { var_dump($arr); }; +try { + $v8->executeString('PHP.test([0, 1, 2]);', "test", \V8Js::FLAG_FORCE_ARRAY); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + $v8->executeString('PHP.test({ "0" : "0", "1" : "1", "2" : "2" });', "test", \V8Js::FLAG_FORCE_ARRAY); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + $v8->executeString('PHP.test({ "0" : "foo", "1" : "bar", "2" : "baz" });', "test", \V8Js::FLAG_FORCE_ARRAY); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + $v8->executeString('PHP.test({ "foo" : "0", "bar" : "1", "baz" : "2" });', "test", \V8Js::FLAG_FORCE_ARRAY); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + // includes gap + $v8->executeString('PHP.test({ "0" : "0", "2" : "2", "3" : "3" });', "test", \V8Js::FLAG_FORCE_ARRAY); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +try { + // mixed key types + $v8->executeString('PHP.test({ "0" : "0", "bar" : "1", "2" : "2" });', "test", \V8Js::FLAG_FORCE_ARRAY); +} catch (V8JsScriptException $e) { + var_dump($e->getMessage()); +} + +?> +===EOF=== +--EXPECT-- +array(3) { + [0]=> + int(0) + [1]=> + int(1) + [2]=> + int(2) +} +array(3) { + [0]=> + string(1) "0" + [1]=> + string(1) "1" + [2]=> + string(1) "2" +} +array(3) { + [0]=> + string(3) "foo" + [1]=> + string(3) "bar" + [2]=> + string(3) "baz" +} +array(3) { + ["foo"]=> + string(1) "0" + ["bar"]=> + string(1) "1" + ["baz"]=> + string(1) "2" +} +array(3) { + [0]=> + string(1) "0" + [2]=> + string(1) "2" + [3]=> + string(1) "3" +} +array(3) { + [0]=> + string(1) "0" + [2]=> + string(1) "2" + ["bar"]=> + string(1) "1" +} +===EOF=== diff --git a/v8js.cc b/v8js.cc index 82647df..fc0ca80 100644 --- a/v8js.cc +++ b/v8js.cc @@ -261,7 +261,7 @@ int php_v8js_v8_get_properties_hash(v8::Handle jsValue, HashTable *re v8::Local jsKey = jsKeys->Get(i)->ToString(); /* Skip any prototype properties */ - if (!jsObj->HasRealNamedProperty(jsKey) && !jsObj->HasRealNamedCallbackProperty(jsKey) && !jsObj->HasRealIndexedProperty(i)) { + if (!jsObj->HasOwnProperty(jsKey) && !jsObj->HasRealNamedProperty(jsKey) && !jsObj->HasRealNamedCallbackProperty(jsKey)) { continue; }