From fd3246bdbbb4aa565b4722ecdbccb0aaa943f50e Mon Sep 17 00:00:00 2001 From: Christiano Becker Date: Sat, 25 Feb 2023 09:23:12 -0300 Subject: [PATCH] * Added V8Js::FLAG_CHECK_BINARY_STRING --- php_v8js_macros.h | 1 + v8js_class.cc | 1 + v8js_convert.cc | 51 +++++++++++++++++++++++++---------------------- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/php_v8js_macros.h b/php_v8js_macros.h index 7f0d019e..7acb2aa7 100644 --- a/php_v8js_macros.h +++ b/php_v8js_macros.h @@ -77,6 +77,7 @@ extern "C" { #define V8JS_FLAG_NONE (1<<0) #define V8JS_FLAG_FORCE_ARRAY (1<<1) #define V8JS_FLAG_PROPAGATE_PHP_EXCEPTIONS (1<<2) +#define V8JS_FLAG_CHECK_BINARY_STRING (1<<3) /* These are not defined by Zend */ diff --git a/v8js_class.cc b/v8js_class.cc index 5b5ac513..26bc8f0a 100644 --- a/v8js_class.cc +++ b/v8js_class.cc @@ -1080,6 +1080,7 @@ PHP_MINIT_FUNCTION(v8js_class) /* {{{ */ zend_declare_class_constant_long(php_ce_v8js, ZEND_STRL("FLAG_NONE"), V8JS_FLAG_NONE); zend_declare_class_constant_long(php_ce_v8js, ZEND_STRL("FLAG_FORCE_ARRAY"), V8JS_FLAG_FORCE_ARRAY); zend_declare_class_constant_long(php_ce_v8js, ZEND_STRL("FLAG_PROPAGATE_PHP_EXCEPTIONS"), V8JS_FLAG_PROPAGATE_PHP_EXCEPTIONS); + zend_declare_class_constant_long(php_ce_v8js, ZEND_STRL("FLAG_CHECK_BINARY_STRING"), V8JS_FLAG_CHECK_BINARY_STRING); le_v8js_script = zend_register_list_destructors_ex(v8js_script_dtor, NULL, PHP_V8JS_SCRIPT_RES_NAME, module_number); diff --git a/v8js_convert.cc b/v8js_convert.cc index 1f97083b..db749c9e 100644 --- a/v8js_convert.cc +++ b/v8js_convert.cc @@ -110,6 +110,7 @@ v8::Local zend_long_to_v8js(zend_long v, v8::Isolate *isolate) /* {{{ v8::Local zval_to_v8js(zval *value, v8::Isolate *isolate) /* {{{ */ { + v8js_ctx *ctx = (v8js_ctx *) isolate->GetData(0); v8::Local jsValue; zend_string *value_str; zend_class_entry *ce; @@ -150,19 +151,21 @@ v8::Local zval_to_v8js(zval *value, v8::Isolate *isolate) /* {{{ */ break; } - zval fname, retval; - zval params[2]; - ZVAL_STRING(&fname, "mb_check_encoding"); - ZVAL_COPY_VALUE(¶ms[0], value); - ZVAL_STRING(¶ms[1], "UTF-8"); - - if ((SUCCESS == call_user_function(CG(function_table), NULL, &fname, - &retval, 2, params)) && (Z_TYPE(retval) == IS_TRUE)) { - jsValue = V8JS_ZSTR(value_str); - } - else { - jsValue = v8::String::NewFromOneByte(isolate, (unsigned char *)ZSTR_VAL(value_str), v8::NewStringType::kNormal, ZSTR_LEN(value_str)).ToLocalChecked(); + if (ctx->flags & V8JS_FLAG_CHECK_BINARY_STRING) { + zval fname, retval; + zval params[2]; + ZVAL_STRING(&fname, "mb_check_encoding"); + ZVAL_COPY_VALUE(¶ms[0], value); + ZVAL_STRING(¶ms[1], "UTF-8"); + if ((SUCCESS == call_user_function(CG(function_table), NULL, &fname, + &retval, 2, params)) && (Z_TYPE(retval) == IS_FALSE)) { + + jsValue = v8::String::NewFromOneByte(isolate, (unsigned char *)ZSTR_VAL(value_str), v8::NewStringType::kNormal, ZSTR_LEN(value_str)).ToLocalChecked(); + return jsValue; + } } + + jsValue = V8JS_ZSTR(value_str); break; @@ -204,19 +207,19 @@ int v8js_to_zval(v8::Local jsValue, zval *return_value, int flags, v8 if (jsValue->IsString()) { - v8::Local strOneByte = jsValue->ToString(v8_context).ToLocalChecked(); - if (strOneByte->IsOneByte() && strOneByte->ContainsOnlyOneByte()) { - int length = strOneByte->Length(); - char* char_value = new char[length + 1]; - strOneByte->WriteOneByte(isolate, reinterpret_cast(&char_value[0]), 0, length); - - RETVAL_STRINGL(char_value, length); - } - else { - v8::String::Utf8Value str(isolate, jsValue); - const char *cstr = ToCString(str); - RETVAL_STRINGL(cstr, str.length()); + if (ctx->flags & V8JS_FLAG_CHECK_BINARY_STRING) { + v8::Local strOneByte = jsValue->ToString(v8_context).ToLocalChecked(); + if (strOneByte->ContainsOnlyOneByte()) { + int length = strOneByte->Length(); + char* char_value = new char[length + 1]; + strOneByte->WriteOneByte(isolate, reinterpret_cast(&char_value[0]), 0, length); + RETVAL_STRINGL(char_value, length); + return SUCCESS; + } } + v8::String::Utf8Value str(isolate, jsValue); + const char *cstr = ToCString(str); + RETVAL_STRINGL(cstr, str.length()); } else if (jsValue->IsBoolean()) {