瀏覽代碼

toJSON: use zend_hash_find_ptr_lc instead of ZEND_HASH_FOREACH_STR_KEY_PTR

Christiano Becker 2 年之前
父節點
當前提交
34d944a9f5
共有 1 個文件被更改,包括 17 次插入17 次删除
  1. 17 17
      v8js_object_export.cc

+ 17 - 17
v8js_object_export.cc

@@ -1016,23 +1016,23 @@ static v8::MaybeLocal<v8::Object> v8js_wrap_object(v8::Isolate *isolate, zend_cl
     }
     }
 
 
     if (has_json_serializable) {
     if (has_json_serializable) {
-        void *ptr;
-        zend_string *key;
-        ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, key, ptr) {
-            zend_function *method_ptr = reinterpret_cast<zend_function *>(ptr);
-            if (strcmp(ZSTR_VAL(method_ptr->common.function_name), "jsonSerialize") == 0) {
-                v8::Local<v8::String> method_name = V8JS_SYM("toJSON");
-                v8::Local<v8::FunctionTemplate> ft;
-
-                ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
-                        v8::External::New((isolate), method_ptr));
-
-                v8js_function_tmpl_t *persistent_ft = &ctx->method_tmpls[std::make_pair(ce, method_ptr)];
-                persistent_ft->Reset(isolate, ft);
-
-                newobj.ToLocalChecked()->CreateDataProperty(v8_context, method_name, ft->GetFunction(v8_context).ToLocalChecked());
-            }
-        } ZEND_HASH_FOREACH_END();
+		zend_string *jsonserialize_str = zend_string_init
+			("jsonSerialize", sizeof("jsonSerialize") - 1, 0);
+		zend_function *jsonserialize_method_ptr = reinterpret_cast<zend_function *>
+			(zend_hash_find_ptr_lc(&ce->function_table, jsonserialize_str));
+		if (jsonserialize_method_ptr &&
+			jsonserialize_method_ptr->common.fn_flags & ZEND_ACC_PUBLIC) {
+			v8::Local<v8::String> method_name = V8JS_SYM("toJSON");
+			v8::Local<v8::FunctionTemplate> ft;
+
+			ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
+					v8::External::New((isolate), jsonserialize_method_ptr));
+
+			v8js_function_tmpl_t *persistent_ft = &ctx->method_tmpls[std::make_pair(ce, jsonserialize_method_ptr)];
+			persistent_ft->Reset(isolate, ft);
+
+			newobj.ToLocalChecked()->CreateDataProperty(v8_context, method_name, ft->GetFunction(v8_context).ToLocalChecked());
+		}
     }
     }
 
 
 	if (ce == zend_ce_closure && !newobj.IsEmpty()) {
 	if (ce == zend_ce_closure && !newobj.IsEmpty()) {