From 8fc173f4a7826e26445a1fb918d25f5adcac09ab Mon Sep 17 00:00:00 2001 From: Bogdan Padalko Date: Sun, 3 Sep 2017 00:00:02 +0300 Subject: [PATCH 1/6] Upgrade to libv8-6.3, closes #45 --- .travis.yml | 6 +++--- CMakeLists.txt | 4 ++-- README.md | 6 +++--- config.m4 | 2 +- scripts/provision/provision.sh | 4 ++-- stubs/src/StringValue.php | 2 +- tests/001-verify_extension_entities.phpt | 2 +- tests/StringValue.phpt | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1950db4..7328bba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,13 +16,13 @@ env: - NO_INTERACTION=1 - TEST_TIMEOUT=120 matrix: - - V8=6.2 - - V8=6.2 TEST_PHP_ARGS=-m + - V8=6.3 + - V8=6.3 TEST_PHP_ARGS=-m before_install: - sudo add-apt-repository ppa:pinepain/libv8-${V8} -y - sudo apt-get update -q - - sudo apt-get install -y libv8-${V8}-dev + - sudo apt-get install -y libv8-${V8}-dev libv8-${V8}-dbg - php -i - php-config || true diff --git a/CMakeLists.txt b/CMakeLists.txt index a1ff7df..e10f191 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,8 +3,8 @@ project(php-v8) # NOTE: This CMake file is just for syntax highlighting in CLion -include_directories(/usr/local/opt/v8@6.2/include) -include_directories(/usr/local/opt/v8@6.2/include/libplatform) +include_directories(/usr/local/opt/v8@6.3/include) +include_directories(/usr/local/opt/v8@6.3/include/libplatform) include_directories(/usr/local/include/php) include_directories(/usr/local/include/php/TSRM) diff --git a/README.md b/README.md index e7ab95d..15acebe 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ $source = new \V8\StringValue($isolate, "'Hello' + ', World!'"); $script = new \V8\Script($context, $source); $result = $script->run($context); -echo $result->toString($context)->value(), PHP_EOL; +echo $result->value(), PHP_EOL; ``` which will output `Hello, World!`. See how it's shorter and more readable than [that C++ version][v8-hello-world]? @@ -69,7 +69,7 @@ in your IDE and other code-analysis tools. ### Requirements #### V8 -You will need a recent v8 Google JavaScript engine version installed. At this time the extension is tested on 6.2.2. +You will need a recent v8 Google JavaScript engine version installed. At this time v8 >= 6.3.2 required. #### PHP This extension is PHP7-only. It works and tested with both PHP 7.0 and PHP 7.1. @@ -92,7 +92,7 @@ $ php --ri v8 While [pinepain/php](https://launchpad.net/~pinepain/+archive/ubuntu/php) PPA targets to contain all necessary extensions with dependencies, you may find -[pinepain/libv8-6.2](https://launchpad.net/~pinepain/+archive/ubuntu/libv8-6.2), +[pinepain/libv8-6.3](https://launchpad.net/~pinepain/+archive/ubuntu/libv8-6.3), [pinepain/libv8-experimental](https://launchpad.net/~pinepain/+archive/ubuntu/libv8-experimental) and [pinepain/php-v8](https://launchpad.net/~pinepain/+archive/ubuntu/php-v8) standalone PPAs useful. diff --git a/config.m4 b/config.m4 index 27af960..d68be07 100644 --- a/config.m4 +++ b/config.m4 @@ -19,7 +19,7 @@ if test "$PHP_V8" != "no"; then SEARCH_PATH="/usr/local /usr" SEARCH_FOR="include/v8.h" - V8_MIN_API_VERSION_STR=6.2.2 + V8_MIN_API_VERSION_STR=6.3.2 DESIRED_V8_VERSION=`echo "${V8_MIN_API_VERSION_STR}" | $AWK 'BEGIN { FS = "."; } { printf "%s.%s", [$]1, [$]2;}'` diff --git a/scripts/provision/provision.sh b/scripts/provision/provision.sh index c753748..078b469 100644 --- a/scripts/provision/provision.sh +++ b/scripts/provision/provision.sh @@ -5,7 +5,7 @@ echo Provisioning... # Add Ondřej Surý's PPA with co-installable PHP versions: sudo add-apt-repository -y ppa:ondrej/php # Add libv8 PPA: -sudo add-apt-repository ppa:pinepain/libv8-6.2 +sudo add-apt-repository ppa:pinepain/libv8-6.3 # Let's update packages list: sudo apt-get update @@ -19,7 +19,7 @@ sudo apt-get install -y git htop curl pkgconf # Build and development requirements -sudo apt-get install -y libv8-6.2 libv8-6.2-dev libv8-6.2-dbg +sudo apt-get install -y libv8-6.3 libv8-6.3-dev libv8-6.3-dbg sudo apt-get install -y dh-make valgrind sudo apt-get install -y libssl-dev openssl sudo apt-get install -y php7.1 php7.1-cli php7.1-dev php7.1-fpm diff --git a/stubs/src/StringValue.php b/stubs/src/StringValue.php index 349776a..4d966c1 100644 --- a/stubs/src/StringValue.php +++ b/stubs/src/StringValue.php @@ -21,7 +21,7 @@ */ class StringValue extends NameValue { - const MAX_LENGTH = (1 << 28) - 16; + const MAX_LENGTH = (1 << 30) - 25; // It's (1 << 28) - 16 on x32 platform, but we don't run on x32. /** * @param Isolate $isolate diff --git a/tests/001-verify_extension_entities.phpt b/tests/001-verify_extension_entities.phpt index 781d6ac..c4fd7a8 100644 --- a/tests/001-verify_extension_entities.phpt +++ b/tests/001-verify_extension_entities.phpt @@ -619,7 +619,7 @@ abstract class V8\NameValue class V8\StringValue extends V8\NameValue - const MAX_LENGTH = 268435440 + const MAX_LENGTH = 1073741799 public function __construct(V8\Isolate $isolate, $data) public function value(): string public function length(): int diff --git a/tests/StringValue.phpt b/tests/StringValue.phpt index 90f7293..b5579a5 100644 --- a/tests/StringValue.phpt +++ b/tests/StringValue.phpt @@ -120,7 +120,7 @@ StringValue extends Value: ok Class constants: ---------------- -V8\StringValue::MAX_LENGTH = 268435440 +V8\StringValue::MAX_LENGTH = 1073741799 Accessors: From 9fd0cd87729d944eac78700f7f94026fe0ca0ec5 Mon Sep 17 00:00:00 2001 From: Bogdan Padalko Date: Sun, 3 Sep 2017 17:03:11 +0300 Subject: [PATCH 2/6] Fix false-positive v8 6.3 valgrind reports, closes #47 --- .valgrind-v8.supp | 6 ++++++ .valgrindrc | 2 ++ tests/001-extension_info.phpt | 6 +++--- tests/001-verify-method-case.phpt | 2 ++ tests/001-verify-methods-signature.phpt | 2 ++ tests/001-verify_extension_entities.phpt | 6 +++--- tests/001.phpt | 2 ++ tests/002-enums.phpt | 6 +++--- tests/003-V8ObjectTemplate_recursive_chain.phpt | 2 ++ tests/003-V8ObjectTemplate_recursive_global.phpt | 2 ++ tests/003-V8ObjectTemplate_recursive_self.phpt | 2 ++ tests/003-V8ObjectTemplate_recursive_tree.phpt | 2 ++ tests/004-ICU-Intl_dateTimeFormat.phpt | 1 + tests/004-ICU-Intl_numberFormat.phpt | 2 ++ tests/005-V8FunctionTemplate_external_memory.phpt | 2 ++ tests/005-V8ObjectTemplate_external_memory.phpt | 2 ++ tests/005-V8ObjectValue_external_memory.phpt | 2 ++ tests/010-no-value-self-cleanup-on-shutdown.phpt | 6 +++--- tests/ArrayObject.phpt | 4 +++- tests/ArrayObject_length.phpt | 4 +++- tests/Boolean.phpt | 2 ++ tests/BooleanObject.phpt | 4 +++- tests/CachedData.phpt | 2 ++ tests/Context.phpt | 2 ++ tests/Context_globalObject.phpt | 2 ++ tests/Context_invalid_ctor_arg_type.phpt | 2 ++ tests/Context_reference_lifecycle.phpt | 6 +++--- tests/Context_setSecurityToken.phpt | 2 ++ tests/Context_weakness.phpt | 6 +++--- tests/Data.phpt | 2 ++ tests/DateObject.phpt | 5 ++--- tests/ExceptionManager_createCreateMessage.phpt | 2 ++ tests/ExceptionManager_createError.phpt | 2 ++ tests/ExceptionManager_createGetStackTrace.phpt | 2 ++ tests/ExceptionManager_createRangeError.phpt | 2 ++ tests/ExceptionManager_createReferenceError.phpt | 2 ++ tests/ExceptionManager_createSyntaxError.phpt | 2 ++ tests/ExceptionManager_createTypeError.phpt | 2 ++ tests/ExceptionsTryCatchException.phpt | 2 ++ tests/FunctionCallbackInfo.phpt | 6 +++--- tests/FunctionObject.phpt | 6 +++--- tests/FunctionObject_call.phpt | 6 +++--- tests/FunctionObject_call_bad_args.phpt | 6 +++--- tests/FunctionObject_constructor_behavior.phpt | 6 +++--- tests/FunctionObject_die.phpt | 6 +++--- tests/FunctionObject_die_different_isolates.phpt | 6 +++--- tests/FunctionObject_die_nested.phpt | 2 ++ tests/FunctionObject_newInstance.phpt | 6 +++--- tests/FunctionObject_weakness_multiple.phpt | 6 +++--- tests/FunctionTemplate.phpt | 6 +++--- tests/FunctionTemplate_callback_weakness.phpt | 6 +++--- tests/FunctionTemplate_constructor_behavior.phpt | 6 +++--- tests/FunctionTemplate_constructor_receiver.phpt | 6 +++--- tests/FunctionTemplate_exception_in_php.phpt | 6 +++--- tests/FunctionTemplate_getFunction.phpt | 6 +++--- tests/FunctionTemplate_invalid_ctor_arg_type.phpt | 6 +++--- tests/FunctionTemplate_require_implementation.phpt | 2 ++ tests/FunctionTemplate_set.phpt | 6 +++--- tests/FunctionTemplate_setCallHandler.phpt | 6 +++--- tests/FunctionTemplate_weakness.phpt | 6 +++--- tests/HeapStatistics.phpt | 2 ++ tests/IndexedPropertyHandlerConfiguration.phpt | 2 ++ tests/Int32Value.phpt | 2 ++ tests/IntegerValue.phpt | 2 ++ tests/Isolate.phpt | 2 ++ tests/Isolate_gc_cyclic_ref_memleak.phpt | 4 +++- tests/Isolate_getEnteredContext.phpt | 2 ++ tests/Isolate_isDead.phpt | 2 ++ tests/Isolate_isInUse.phpt | 2 ++ tests/Isolate_limit_memory.phpt | 2 ++ tests/Isolate_limit_memory_nested.phpt | 2 ++ tests/Isolate_limit_memory_not_hit.phpt | 2 ++ tests/Isolate_limit_time.phpt | 2 ++ tests/Isolate_limit_time_affects_js_runtime_only.phpt | 2 ++ tests/Isolate_limit_time_changed_at_runtime.phpt | 2 ++ tests/Isolate_limit_time_nested.phpt | 2 ++ tests/Isolate_limit_time_not_hit.phpt | 2 ++ tests/Isolate_limit_time_set_during_execution.phpt | 2 ++ tests/Isolate_nested_termination_exceptions.phpt | 2 ++ tests/Isolate_snapshot_support.phpt | 2 ++ tests/Isolate_throwException.phpt | 2 ++ tests/Isolate_throwException_with_external.phpt | 2 ++ tests/MapObject.phpt | 2 ++ tests/Message.phpt | 2 ++ tests/NamedPropertyHandlerConfiguration.phpt | 2 ++ tests/NullValue.phpt | 2 ++ tests/NumberObject.phpt | 4 +++- tests/NumberValue.phpt | 2 ++ tests/ObjectTemplate.phpt | 2 ++ tests/ObjectTemplate_invalid_ctor_arg_type.phpt | 6 +++--- tests/ObjectTemplate_set.phpt | 4 +++- tests/ObjectTemplate_setAccessor_receiver.phpt | 6 +++--- tests/ObjectTemplate_setCallAsFunctionHandler.phpt | 4 +++- tests/ObjectTemplate_setHandlerForIndexedProperty.phpt | 4 +++- tests/ObjectTemplate_setHandlerForNamedProperty.phpt | 4 +++- tests/ObjectTemplate_setHandler_both.phpt | 4 +++- tests/ObjectTemplate_setNativeDataProperty.phpt | 6 +++--- tests/ObjectValue.phpt | 2 ++ tests/ObjectValue_get.phpt | 2 ++ tests/ObjectValue_isArgumentsObject.phpt | 6 +++--- tests/ObjectValue_isNativeError.phpt | 6 +++--- tests/ObjectValue_setAccessor.phpt | 6 +++--- tests/ObjectValue_setIntegrityLevel.phpt | 2 ++ tests/ObjectValue_setNativeDataProperty.phpt | 6 +++--- tests/ObjectValue_setNativeDataProperty_from_template.phpt | 6 +++--- tests/PropertyCallbackInfo.phpt | 2 ++ tests/RegExpObject.phpt | 4 +++- tests/ReturnValue.phpt | 6 +++--- tests/ReturnValue_context.phpt | 6 +++--- tests/Script.phpt | 2 ++ tests/ScriptCompiler.phpt | 2 ++ tests/ScriptCompiler_compile.phpt | 2 ++ tests/ScriptCompiler_compileFunctionInContext.phpt | 2 ++ tests/ScriptCompiler_compileUnbound.phpt | 2 ++ tests/ScriptOrigin.phpt | 2 ++ tests/ScriptOriginOptions.phpt | 2 ++ tests/Script_exit_during_script_execution.phpt | 2 ++ tests/Script_run.phpt | 2 ++ tests/Script_run_out_of_memory.phpt | 4 +++- tests/Script_run_uncaught_exception.phpt | 2 ++ tests/Script_terminate_script_execution.phpt | 2 ++ tests/SetObject.phpt | 2 ++ tests/Source.phpt | 2 ++ tests/StackFrame.phpt | 2 ++ tests/StackTrace.phpt | 2 ++ tests/StackTrace_currentStackTrace.phpt | 2 ++ tests/StartupData_createFromSource.phpt | 2 ++ tests/StringObject.phpt | 4 +++- tests/StringValue.phpt | 2 ++ tests/String_range_error_length.phpt | 2 ++ tests/SymbolObject.phpt | 6 +++--- tests/SymbolValue.phpt | 4 +++- tests/TryCatch.phpt | 2 ++ tests/TryCatch_from_script.phpt | 2 ++ tests/Uint32Value.phpt | 2 ++ tests/UnboundScript.phpt | 2 ++ tests/Undefined.phpt | 2 ++ tests/UndefinedValue_destruct.phpt | 2 ++ tests/UndefinedValue_invalid_ctor_arg_type.phpt | 6 +++--- tests/Value_empty.phpt | 2 ++ 140 files changed, 334 insertions(+), 128 deletions(-) create mode 100644 .valgrind-v8.supp create mode 100644 .valgrindrc diff --git a/.valgrind-v8.supp b/.valgrind-v8.supp new file mode 100644 index 0000000..cd42837 --- /dev/null +++ b/.valgrind-v8.supp @@ -0,0 +1,6 @@ +{ + + Memcheck:Cond + fun:_ZN2v88internal20MarkCompactCollector20EmptyMarkingWorklistEv + ... +} diff --git a/.valgrindrc b/.valgrindrc new file mode 100644 index 0000000..f4680ae --- /dev/null +++ b/.valgrindrc @@ -0,0 +1,2 @@ +--gen-suppressions=all +--suppressions=./.valgrind-v8.supp diff --git a/tests/001-extension_info.phpt b/tests/001-extension_info.phpt index 17e8466..597fb0d 100644 --- a/tests/001-extension_info.phpt +++ b/tests/001-extension_info.phpt @@ -1,9 +1,9 @@ --TEST-- v8 extension info --SKIPIF-- - + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- --ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc TZ=UTC --INI-- date.timezone = "UTC" diff --git a/tests/004-ICU-Intl_numberFormat.phpt b/tests/004-ICU-Intl_numberFormat.phpt index 9601b78..59751b5 100644 --- a/tests/004-ICU-Intl_numberFormat.phpt +++ b/tests/004-ICU-Intl_numberFormat.phpt @@ -2,6 +2,8 @@ ICU - Intl.NumberFormat() --SKIPIF-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + --ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc TZ=UTC --INI-- date.timezone = "UTC" diff --git a/tests/ExceptionManager_createCreateMessage.phpt b/tests/ExceptionManager_createCreateMessage.phpt index 5277f60..3bbc75d 100644 --- a/tests/ExceptionManager_createCreateMessage.phpt +++ b/tests/ExceptionManager_createCreateMessage.phpt @@ -2,6 +2,8 @@ V8\ExceptionManager::createCreateMessage() --SKIPIF-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- value_matches_with_no_output($res, $obj); Fatal error: V8 OOM hit: location=invalid array length, is_heap_oom=yes - in %s/V8Script_Run_out_of_memory.php on line 44 + in %s/Script_Run_out_of_memory.php on line %d <--- Last few GCs ---> diff --git a/tests/Script_run_uncaught_exception.phpt b/tests/Script_run_uncaught_exception.phpt index 6810ec2..e14067f 100644 --- a/tests/Script_run_uncaught_exception.phpt +++ b/tests/Script_run_uncaught_exception.phpt @@ -2,6 +2,8 @@ V8\Script::run() - uncaught exception should not lead to leak --SKIPIF-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- + +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- +--ENV-- +HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc --FILE-- Date: Sun, 3 Sep 2017 00:38:27 +0300 Subject: [PATCH 3/6] Pass Isolate pointer to v8::String::Utf8Value constructors, closes #46 --- scripts/test_v8/hello_world.cpp | 2 +- src/php_v8_exceptions.cc | 6 +++--- src/php_v8_message.cc | 11 ++++------- src/php_v8_object.cc | 4 ++-- src/php_v8_object_template.cc | 2 +- src/php_v8_script_origin.cc | 7 +++---- src/php_v8_stack_frame.cc | 14 +++++--------- src/php_v8_stack_frame.h | 2 +- src/php_v8_stack_trace.cc | 4 ++-- src/php_v8_string.cc | 2 +- src/php_v8_symbol.cc | 2 +- src/php_v8_template.cc | 2 +- src/php_v8_value.h | 19 ++++++------------- 13 files changed, 31 insertions(+), 46 deletions(-) diff --git a/scripts/test_v8/hello_world.cpp b/scripts/test_v8/hello_world.cpp index 6e4de96..7f767ac 100644 --- a/scripts/test_v8/hello_world.cpp +++ b/scripts/test_v8/hello_world.cpp @@ -78,7 +78,7 @@ int main(int argc, char* argv[]) { Local result = script->Run(); // Convert the result to an UTF8 string and print it. - String::Utf8Value utf8(result); + String::Utf8Value utf8(isolate, result); printf("%s\n", *utf8); } diff --git a/src/php_v8_exceptions.cc b/src/php_v8_exceptions.cc index a8fe314..0ec77e1 100644 --- a/src/php_v8_exceptions.cc +++ b/src/php_v8_exceptions.cc @@ -52,6 +52,7 @@ void php_v8_create_try_catch_exception(zval *return_value, php_v8_isolate_t *php const char *message = NULL; PHP_V8_DECLARE_LIMITS(php_v8_isolate); + PHP_V8_DECLARE_ISOLATE(php_v8_isolate); if ((try_catch == NULL) || (try_catch->Exception()->IsNull() && try_catch->Message().IsEmpty() && !try_catch->CanContinue() && try_catch->HasTerminated())) { if (limits->time_limit_hit) { @@ -68,10 +69,9 @@ void php_v8_create_try_catch_exception(zval *return_value, php_v8_isolate_t *php object_init_ex(return_value, ce); zend_update_property_string(php_v8_try_catch_exception_class_entry, return_value, ZEND_STRL("message"), message); } else { - v8::String::Utf8Value exception(try_catch->Exception()); - ce = php_v8_try_catch_exception_class_entry; - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK_NODECL(exception, message); + + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING_NODECL(isolate, message, try_catch->Exception()); object_init_ex(return_value, ce); zend_update_property_string(php_v8_try_catch_exception_class_entry, return_value, ZEND_STRL("message"), message); diff --git a/src/php_v8_message.cc b/src/php_v8_message.cc index 3c95f57..e616813 100644 --- a/src/php_v8_message.cc +++ b/src/php_v8_message.cc @@ -29,20 +29,18 @@ void php_v8_message_create_from_message(zval *return_value, php_v8_isolate_t *ph object_init_ex(return_value, this_ce); - v8::Isolate *isolate = php_v8_isolate->isolate; + PHP_V8_DECLARE_ISOLATE(php_v8_isolate); v8::Local context = isolate->GetEnteredContext(); /* v8::Message::Get */ if (!message->Get().IsEmpty()) { - v8::String::Utf8Value message_utf8(message->Get()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(message_utf8, message_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, message_chars, message->Get()); zend_update_property_string(this_ce, return_value, ZEND_STRL("message"), message_chars); } /* v8::Message::GetSourceLine */ if (!message->GetSourceLine(context).IsEmpty()) { - v8::String::Utf8Value source_line_utf8(message->GetSourceLine(context).ToLocalChecked()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(source_line_utf8, source_line_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, source_line_chars, message->GetSourceLine(context).ToLocalChecked()); zend_update_property_string(this_ce, return_value, ZEND_STRL("source_line"), source_line_chars); } @@ -54,8 +52,7 @@ void php_v8_message_create_from_message(zval *return_value, php_v8_isolate_t *ph /* v8::Message::GetScriptResourceName */ if (!message->GetScriptResourceName().IsEmpty() && !message->GetScriptResourceName()->IsUndefined()) { - v8::String::Utf8Value script_resource_name_utf8(message->GetScriptResourceName()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(script_resource_name_utf8, script_resource_name_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, script_resource_name_chars, message->GetScriptResourceName()); zend_update_property_string(this_ce, return_value, ZEND_STRL("resource_name"), script_resource_name_chars); } diff --git a/src/php_v8_object.cc b/src/php_v8_object.cc index 79ddcb8..c7125c2 100644 --- a/src/php_v8_object.cc +++ b/src/php_v8_object.cc @@ -447,7 +447,7 @@ static PHP_METHOD(Object, setAccessor) { v8::Local local_object = php_v8_value_get_local_as(php_v8_value); v8::Local local_name = php_v8_value_get_local_as(php_v8_name); - PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(name, local_name); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, name, local_name); attributes = attributes ? attributes & PHP_V8_PROPERTY_ATTRIBUTE_FLAGS : attributes; settings = settings ? settings & PHP_V8_ACCESS_CONTROL_FLAGS : settings; @@ -574,7 +574,7 @@ static PHP_METHOD(Object, setNativeDataProperty) { v8::Local local_object = php_v8_value_get_local_as(php_v8_value); v8::Local local_name = php_v8_value_get_local_as(php_v8_name); - PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(name, local_name); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, name, local_name); attributes = attributes ? attributes & PHP_V8_PROPERTY_ATTRIBUTE_FLAGS : attributes; diff --git a/src/php_v8_object_template.cc b/src/php_v8_object_template.cc index 2274f8f..5cc44c9 100644 --- a/src/php_v8_object_template.cc +++ b/src/php_v8_object_template.cc @@ -245,7 +245,7 @@ static PHP_METHOD(ObjectTemplate, setAccessor) { v8::Local local_name = php_v8_value_get_local_as(php_v8_name); - PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(name, local_name); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, name, local_name); v8::AccessorNameGetterCallback getter; v8::AccessorNameSetterCallback setter = 0; diff --git a/src/php_v8_script_origin.cc b/src/php_v8_script_origin.cc index dcee26a..02c4f2b 100644 --- a/src/php_v8_script_origin.cc +++ b/src/php_v8_script_origin.cc @@ -27,11 +27,11 @@ extern void php_v8_create_script_origin(zval *return_value, v8::LocalGetIsolate(); /* v8::ScriptOrigin::ResourceName */ if (!origin.ResourceName().IsEmpty() && !origin.ResourceName()->IsUndefined()) { - v8::String::Utf8Value resource_name_utf8(origin.ResourceName()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(resource_name_utf8, resource_name_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, resource_name_chars, origin.ResourceName()); zend_update_property_string(this_ce, return_value, ZEND_STRL("resource_name"), resource_name_chars); } @@ -57,8 +57,7 @@ extern void php_v8_create_script_origin(zval *return_value, v8::LocalIsUndefined()) { - v8::String::Utf8Value source_map_url_utf8(origin.SourceMapUrl()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(source_map_url_utf8, source_map_url_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, source_map_url_chars, origin.SourceMapUrl()); zend_update_property_string(this_ce, return_value, ZEND_STRL("source_map_url"), source_map_url_chars); } } diff --git a/src/php_v8_stack_frame.cc b/src/php_v8_stack_frame.cc index 51edeea..27a2d53 100644 --- a/src/php_v8_stack_frame.cc +++ b/src/php_v8_stack_frame.cc @@ -22,7 +22,7 @@ zend_class_entry *php_v8_stack_frame_class_entry; #define this_ce php_v8_stack_frame_class_entry -void php_v8_stack_frame_create_from_stack_frame(zval *return_value, v8::Local frame) { +void php_v8_stack_frame_create_from_stack_frame(v8::Isolate *isolate, zval *return_value, v8::Local frame) { assert(!frame.IsEmpty()); @@ -41,23 +41,19 @@ void php_v8_stack_frame_create_from_stack_frame(zval *return_value, v8::LocalGetScriptName().IsEmpty()) { - v8::String::Utf8Value script_name_utf8(frame->GetScriptName()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(script_name_utf8, script_name_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, script_name_chars, frame->GetScriptName()); zend_update_property_string(this_ce, return_value, ZEND_STRL("script_name"), script_name_chars); } /* v8::StackFrame::GetScriptNameOrSourceURL */ if (!frame->GetScriptNameOrSourceURL().IsEmpty()) { - v8::String::Utf8Value script_name_or_source_url_utf8(frame->GetScriptNameOrSourceURL()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(script_name_or_source_url_utf8, script_name_or_source_url_chars); - zend_update_property_string(this_ce, return_value, ZEND_STRL("script_name_or_source_url"), - script_name_or_source_url_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, script_name_or_source_url_chars, frame->GetScriptNameOrSourceURL()); + zend_update_property_string(this_ce, return_value, ZEND_STRL("script_name_or_source_url"), script_name_or_source_url_chars); } /* v8::StackFrame::GetFunctionName */ if (!frame->GetFunctionName().IsEmpty()) { - v8::String::Utf8Value function_name_utf8(frame->GetFunctionName()); - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(function_name_utf8, function_name_chars); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, function_name_chars, frame->GetFunctionName()); zend_update_property_string(this_ce, return_value, ZEND_STRL("function_name"), function_name_chars); } diff --git a/src/php_v8_stack_frame.h b/src/php_v8_stack_frame.h index 01b8766..c3404a6 100644 --- a/src/php_v8_stack_frame.h +++ b/src/php_v8_stack_frame.h @@ -25,7 +25,7 @@ extern "C" { extern zend_class_entry* php_v8_stack_frame_class_entry; -extern void php_v8_stack_frame_create_from_stack_frame(zval *return_value, v8::Local frame); +extern void php_v8_stack_frame_create_from_stack_frame(v8::Isolate *isolate, zval *return_value, v8::Local frame); PHP_MINIT_FUNCTION(php_v8_stack_frame); diff --git a/src/php_v8_stack_trace.cc b/src/php_v8_stack_trace.cc index cdbf59b..d1f4d33 100644 --- a/src/php_v8_stack_trace.cc +++ b/src/php_v8_stack_trace.cc @@ -29,7 +29,7 @@ void php_v8_stack_trace_create_from_stack_trace(zval *return_value, php_v8_isola object_init_ex(return_value, this_ce); - v8::Isolate *isolate = php_v8_isolate->isolate; + PHP_V8_DECLARE_ISOLATE(php_v8_isolate); /* v8::StackTrace::GetFrames */ /* v8::StackTrace::GetFrame */ @@ -42,7 +42,7 @@ void php_v8_stack_trace_create_from_stack_trace(zval *return_value, php_v8_isola zval frame_zv; for (uint32_t i = 0; i < frames_cnt; i++) { - php_v8_stack_frame_create_from_stack_frame(&frame_zv, trace->GetFrame(i)); + php_v8_stack_frame_create_from_stack_frame(isolate, &frame_zv, trace->GetFrame(i)); add_index_zval(&frames_array_zv, i, &frame_zv); } diff --git a/src/php_v8_string.cc b/src/php_v8_string.cc index 0e8b044..45761d6 100644 --- a/src/php_v8_string.cc +++ b/src/php_v8_string.cc @@ -59,7 +59,7 @@ static PHP_METHOD(String, value) v8::Local str_tpl = php_v8_value_get_local(php_v8_value); - v8::String::Utf8Value str(str_tpl); + v8::String::Utf8Value str(isolate, str_tpl); PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(str, cstr); diff --git a/src/php_v8_symbol.cc b/src/php_v8_symbol.cc index b8e1831..143f125 100644 --- a/src/php_v8_symbol.cc +++ b/src/php_v8_symbol.cc @@ -69,7 +69,7 @@ static PHP_METHOD(Symbol, value) RETURN_EMPTY_STRING(); } - v8::String::Utf8Value str(local_name); + v8::String::Utf8Value str(isolate, local_name); PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(str, cstr); diff --git a/src/php_v8_template.cc b/src/php_v8_template.cc index b2667f0..150d36a 100644 --- a/src/php_v8_template.cc +++ b/src/php_v8_template.cc @@ -261,7 +261,7 @@ void php_v8_template_SetNativeDataProperty(v8::Isolate *isolate, v8::Local lo v8::Local local_name = php_v8_value_get_local_as(php_v8_name); - PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(name, local_name); + PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, name, local_name); phpv8::CallbacksBucket *bucket = php_v8_template->persistent_data->bucket("native_data_property_", local_name->IsSymbol(), name); data = v8::External::New(isolate, bucket); diff --git a/src/php_v8_value.h b/src/php_v8_value.h index 25a97b0..71c6102 100644 --- a/src/php_v8_value.h +++ b/src/php_v8_value.h @@ -87,20 +87,13 @@ extern php_v8_value_t *php_v8_get_or_create_value(zval *return_value, v8::Local< return; \ } -#define PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(cstr, v8_local_string_from) \ - v8::String::Utf8Value _v8_utf8_str_##cstr((v8_local_string_from)); \ - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(_v8_utf8_str_##cstr, cstr); \ +#define PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, cstr, v8_local_string_from) \ + v8::String::Utf8Value _v8_utf8_str_##cstr((isolate), (v8_local_string_from)); \ + PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(_v8_utf8_str_##cstr, cstr); \ -#define PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING_NODECL(cstr, v8_local_string_from) { \ - v8::String::Utf8Value _v8_utf8_str_##cstr((v8_local_string_from)); \ - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK_NODECL(_v8_utf8_str_##cstr, cstr); \ -} - -#define PHP_V8_SET_ZVAL_STRING_FROM_V8_STRING(zval_to, v8_local_string_from) { \ - v8::String::Utf8Value _v8_utf8_str((v8_local_string_from)); \ - PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK(_v8_utf8_str, _v8_utf8_cstr); \ - ZVAL_STRINGL((zval_to), _v8_utf8_cstr, _v8_utf8_str.length()); \ -} +#define PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING_NODECL(isolate, cstr, v8_local_string_from) \ + v8::String::Utf8Value _v8_utf8_str_##cstr((isolate), (v8_local_string_from)); \ + PHP_V8_CONVERT_UTF8VALUE_TO_STRING_WITH_CHECK_NODECL(_v8_utf8_str_##cstr, cstr); \ struct _php_v8_value_t { php_v8_isolate_t *php_v8_isolate; From 41d1589cd8dedf7ac253aa8f9f3e3a3edfd6b2d8 Mon Sep 17 00:00:00 2001 From: Bogdan Padalko Date: Mon, 4 Sep 2017 04:27:20 +0300 Subject: [PATCH 4/6] Move build system to docker --- .travis.yml | 40 ++++++++++------------------------------ .valgrind-docker.supp | 11 +++++++++++ .valgrindrc | 1 + Dockerfile | 28 ++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 30 deletions(-) create mode 100644 .valgrind-docker.supp create mode 100644 Dockerfile diff --git a/.travis.yml b/.travis.yml index 7328bba..d72cb16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,40 +1,20 @@ -sudo: required dist: trusty +sudo: required -language: php - -php: - - 7.1 - - nightly - -matrix: - allow_failures: - - php: nightly +services: + - docker env: global: - - NO_INTERACTION=1 - - TEST_TIMEOUT=120 - matrix: - V8=6.3 - - V8=6.3 TEST_PHP_ARGS=-m + matrix: + - PHP=7.1 + - PHP=7.1 TEST_PHP_ARGS=-m + - PHP=7.2 + - PHP=7.2 TEST_PHP_ARGS=-m before_install: - - sudo add-apt-repository ppa:pinepain/libv8-${V8} -y - - sudo apt-get update -q - - sudo apt-get install -y libv8-${V8}-dev libv8-${V8}-dbg - - php -i - - php-config || true - -before_script: - - echo 'variables_order = "EGPCS"' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - - phpize && ./configure && make + - docker build -t ${TRAVIS_REPO_SLUG}:${V8}-${PHP} --build-arg V8=${V8} --build-arg PHP=${PHP} . script: - - sh -c "make test | tee result.txt" - - sh test-report.sh - -addons: - apt: - packages: - - valgrind + - docker run -e TEST_PHP_ARGS ${TRAVIS_REPO_SLUG}:${V8}-${PHP} bash -c "make test | tee result.txt; ./test-report.sh" diff --git a/.valgrind-docker.supp b/.valgrind-docker.supp new file mode 100644 index 0000000..58451bc --- /dev/null +++ b/.valgrind-docker.supp @@ -0,0 +1,11 @@ +{ + + Memcheck:Free + fun:free + fun:deallocate + fun:deallocate + fun:_M_destroy + fun:_M_dispose + fun:~basic_string + ... +} diff --git a/.valgrindrc b/.valgrindrc index f4680ae..55df76c 100644 --- a/.valgrindrc +++ b/.valgrindrc @@ -1,2 +1,3 @@ --gen-suppressions=all --suppressions=./.valgrind-v8.supp +--suppressions=./.valgrind-docker.supp diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a69e5d5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM ubuntu:xenial + +ARG V8=6.3 +ARG PHP=7.1 + +ENV DEBIAN_FRONTEND noninteractive +ENV TERM=xterm-256color + +RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu xenial main" > /etc/apt/sources.list.d/ondrej-php-xenial.list && \ + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C && \ + echo "deb http://ppa.launchpad.net/pinepain/libv8-${V8}/ubuntu xenial main" > /etc/apt/sources.list.d/pinepain-libv8-xenial.list && \ + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40ECBCF960C60AA4 && \ + apt-get update && \ + apt-get install -y libv8-${V8} libv8-${V8}-dev libv8-${V8}-dbg && \ + apt-get install -y valgrind && \ + apt-get install -y php${PHP} php${PHP}-cli php${PHP}-dev php${PHP}-fpm && \ + rm -rf /var/lib/apt/lists/* && \ + php -i && \ + php-config || true && \ + echo 'variables_order = "EGPCS"' >> `php --ini | grep "Loaded Configuration File" | awk '{print $4}'` && \ + mkdir /root/php-v8 + +COPY . /root/php-v8 +COPY ./scripts/provision/.bashrc /root/.bashrc + +WORKDIR /root/php-v8 + +RUN phpize && ./configure && make From 3bdb4611a5ee03bf34adcf99ca32482ab7dc36db Mon Sep 17 00:00:00 2001 From: Bogdan Padalko Date: Mon, 4 Sep 2017 04:20:55 +0300 Subject: [PATCH 5/6] Update need_more_time() for any memtest run --- tests/.testsuite.php | 2 +- tests/Isolate_limit_memory.phpt | 8 -------- tests/Isolate_limit_memory_nested.phpt | 8 -------- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/tests/.testsuite.php b/tests/.testsuite.php index 351c65d..6bd07e0 100644 --- a/tests/.testsuite.php +++ b/tests/.testsuite.php @@ -303,7 +303,7 @@ public function dump_object_methods($object, array $arguments = [], FilterInterf public function need_more_time() { // NOTE: this check is a bit fragile but should fits our need - return isset($_ENV['TRAVIS']) && isset($_ENV['TEST_PHP_ARGS']) && $_ENV['TEST_PHP_ARGS'] == '-m'; + return isset($_ENV['TEST_PHP_ARGS']) && $_ENV['TEST_PHP_ARGS'] == '-m'; } public function is_memory_test() { diff --git a/tests/Isolate_limit_memory.phpt b/tests/Isolate_limit_memory.phpt index c4398e2..be5fd5e 100644 --- a/tests/Isolate_limit_memory.phpt +++ b/tests/Isolate_limit_memory.phpt @@ -4,14 +4,6 @@ V8\Isolate - memory limit --ENV-- HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc -need_more_time()) { - echo 'skip Random bugs on travis at this time under valgrind'; -} -?> --FILE-- --ENV-- HOME=/tmp/we-need-home-env-var-set-to-load-valgrindrc -need_more_time()) { - echo 'skip Random bugs on travis at this time under valgrind'; -} -?> --FILE-- Date: Mon, 4 Sep 2017 05:02:11 +0300 Subject: [PATCH 6/6] Experiment with prebuilt base image --- .travis.yml | 12 +++++++----- Dockerfile | 24 ++++-------------------- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/.travis.yml b/.travis.yml index d72cb16..64a6823 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,13 +8,15 @@ env: global: - V8=6.3 matrix: - - PHP=7.1 - - PHP=7.1 TEST_PHP_ARGS=-m - - PHP=7.2 - - PHP=7.2 TEST_PHP_ARGS=-m + - TAG=xenial-v8-63-php-71 + - TAG=xenial-v8-63-php-71 TEST_PHP_ARGS=-m + - TAG=xenial-v8-63-php-72 + - TAG=xenial-v8-63-php-72 TEST_PHP_ARGS=-m before_install: - - docker build -t ${TRAVIS_REPO_SLUG}:${V8}-${PHP} --build-arg V8=${V8} --build-arg PHP=${PHP} . + # docker on travis doesn't allow anything before FROM, let's fix that + - sed -i -e "s/\${TAG}/$TAG/g" Dockerfile && sed -i -e '1,2d' Dockerfile + - docker build -t ${TRAVIS_REPO_SLUG}:${V8}-${PHP} --build-arg TAG=${TAG} . script: - docker run -e TEST_PHP_ARGS ${TRAVIS_REPO_SLUG}:${V8}-${PHP} bash -c "make test | tee result.txt; ./test-report.sh" diff --git a/Dockerfile b/Dockerfile index a69e5d5..3924a39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,12 @@ -FROM ubuntu:xenial +ARG TAG=xenial-v8-63-php-72 -ARG V8=6.3 -ARG PHP=7.1 - -ENV DEBIAN_FRONTEND noninteractive -ENV TERM=xterm-256color - -RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu xenial main" > /etc/apt/sources.list.d/ondrej-php-xenial.list && \ - apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C && \ - echo "deb http://ppa.launchpad.net/pinepain/libv8-${V8}/ubuntu xenial main" > /etc/apt/sources.list.d/pinepain-libv8-xenial.list && \ - apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40ECBCF960C60AA4 && \ - apt-get update && \ - apt-get install -y libv8-${V8} libv8-${V8}-dev libv8-${V8}-dbg && \ - apt-get install -y valgrind && \ - apt-get install -y php${PHP} php${PHP}-cli php${PHP}-dev php${PHP}-fpm && \ - rm -rf /var/lib/apt/lists/* && \ - php -i && \ - php-config || true && \ - echo 'variables_order = "EGPCS"' >> `php --ini | grep "Loaded Configuration File" | awk '{print $4}'` && \ - mkdir /root/php-v8 +FROM pinepain/php-v8-docker:${TAG} COPY . /root/php-v8 COPY ./scripts/provision/.bashrc /root/.bashrc WORKDIR /root/php-v8 +RUN php -i && php-config || true + RUN phpize && ./configure && make