@@ -113,7 +113,7 @@ v8::Local<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate) /* {{{ */
113
113
v8::Local<v8::Value> jsValue;
114
114
zend_string *value_str;
115
115
zend_class_entry *ce;
116
-
116
+
117
117
switch (Z_TYPE_P (value))
118
118
{
119
119
case IS_INDIRECT:
@@ -150,7 +150,20 @@ v8::Local<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate) /* {{{ */
150
150
break ;
151
151
}
152
152
153
- jsValue = V8JS_ZSTR (value_str);
153
+ zval fname, retval;
154
+ zval params[2 ];
155
+ ZVAL_STRING (&fname, " mb_check_encoding" );
156
+ ZVAL_COPY_VALUE (¶ms[0 ], value);
157
+ ZVAL_STRING (¶ms[1 ], " UTF-8" );
158
+
159
+ if ((SUCCESS == call_user_function (CG (function_table), NULL , &fname,
160
+ &retval, 2 , params)) && (Z_TYPE (retval) == IS_TRUE)) {
161
+ jsValue = V8JS_ZSTR (value_str);
162
+ }
163
+ else {
164
+ jsValue = v8::String::NewFromOneByte (isolate, (unsigned char *)ZSTR_VAL (value_str), v8::NewStringType::kNormal , ZSTR_LEN (value_str)).ToLocalChecked ();
165
+ }
166
+
154
167
break ;
155
168
156
169
case IS_LONG:
@@ -191,9 +204,19 @@ int v8js_to_zval(v8::Local<v8::Value> jsValue, zval *return_value, int flags, v8
191
204
192
205
if (jsValue->IsString ())
193
206
{
194
- v8::String::Utf8Value str (isolate, jsValue);
195
- const char *cstr = ToCString (str);
196
- RETVAL_STRINGL (cstr, str.length ());
207
+ v8::Local<v8::String> strOneByte = jsValue->ToString (v8_context).ToLocalChecked ();
208
+ if (strOneByte->IsOneByte () && strOneByte->ContainsOnlyOneByte ()) {
209
+ int length = strOneByte->Length ();
210
+ char * char_value = new char [length + 1 ];
211
+ strOneByte->WriteOneByte (isolate, reinterpret_cast <uint8_t *>(&char_value[0 ]), 0 , length);
212
+
213
+ RETVAL_STRINGL (char_value, length);
214
+ }
215
+ else {
216
+ v8::String::Utf8Value str (isolate, jsValue);
217
+ const char *cstr = ToCString (str);
218
+ RETVAL_STRINGL (cstr, str.length ());
219
+ }
197
220
}
198
221
else if (jsValue->IsBoolean ())
199
222
{
0 commit comments