ソースを参照

add zend_class_entry* to method_tmpls key, fixes #410

Stefan Siegl 5 年 前
コミット
35398cc4e3
3 ファイル変更6 行追加6 行削除
  1. 3 3
      v8js_class.cc
  2. 1 1
      v8js_class.h
  3. 2 2
      v8js_object_export.cc

+ 3 - 3
v8js_class.cc

@@ -119,7 +119,7 @@ static void v8js_free_storage(zend_object *object) /* {{{ */
 	}
 	}
 	c->call_impls.~map();
 	c->call_impls.~map();
 
 
-	for (std::map<zend_function *, v8js_function_tmpl_t>::iterator it = c->method_tmpls.begin();
+	for (std::map<std::pair<zend_class_entry *, zend_function *>, v8js_function_tmpl_t>::iterator it = c->method_tmpls.begin();
 		 it != c->method_tmpls.end(); ++it) {
 		 it != c->method_tmpls.end(); ++it) {
 		it->second.Reset();
 		it->second.Reset();
 	}
 	}
@@ -232,7 +232,7 @@ static zend_object* v8js_new(zend_class_entry *ce) /* {{{ */
 	new(&c->weak_closures) std::map<v8js_function_tmpl_t *, v8js_persistent_obj_t>();
 	new(&c->weak_closures) std::map<v8js_function_tmpl_t *, v8js_persistent_obj_t>();
 	new(&c->weak_objects) std::map<zend_object *, v8js_persistent_obj_t>();
 	new(&c->weak_objects) std::map<zend_object *, v8js_persistent_obj_t>();
 	new(&c->call_impls) std::map<v8js_function_tmpl_t *, v8js_function_tmpl_t>();
 	new(&c->call_impls) std::map<v8js_function_tmpl_t *, v8js_function_tmpl_t>();
-	new(&c->method_tmpls) std::map<zend_function *, v8js_function_tmpl_t>();
+	new(&c->method_tmpls) std::map<std::pair<zend_class_entry *, zend_function *>, v8js_function_tmpl_t>();
 
 
 	new(&c->v8js_v8objects) std::list<v8js_v8object *>();
 	new(&c->v8js_v8objects) std::list<v8js_v8object *>();
 	new(&c->script_objects) std::vector<v8js_script *>();
 	new(&c->script_objects) std::vector<v8js_script *>();
@@ -589,7 +589,7 @@ static PHP_METHOD(V8Js, __construct)
 		ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
 		ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
 				v8::External::New((isolate), method_ptr));
 				v8::External::New((isolate), method_ptr));
 		// @fixme add/check Signature v8::Signature::New((isolate), tmpl));
 		// @fixme add/check Signature v8::Signature::New((isolate), tmpl));
-		v8js_function_tmpl_t *persistent_ft = &c->method_tmpls[method_ptr];
+		v8js_function_tmpl_t *persistent_ft = &c->method_tmpls[std::make_pair(ce, method_ptr)];
 		persistent_ft->Reset(isolate, ft);
 		persistent_ft->Reset(isolate, ft);
 
 
 		php_obj->CreateDataProperty(context, method_name, ft->GetFunction(context).ToLocalChecked());
 		php_obj->CreateDataProperty(context, method_name, ft->GetFunction(context).ToLocalChecked());

+ 1 - 1
v8js_class.h

@@ -63,7 +63,7 @@ struct v8js_ctx {
   std::map<zend_object *, v8js_persistent_obj_t> weak_objects;
   std::map<zend_object *, v8js_persistent_obj_t> weak_objects;
   std::map<v8js_function_tmpl_t *, v8js_persistent_obj_t> weak_closures;
   std::map<v8js_function_tmpl_t *, v8js_persistent_obj_t> weak_closures;
   std::map<v8js_function_tmpl_t *, v8js_function_tmpl_t> call_impls;
   std::map<v8js_function_tmpl_t *, v8js_function_tmpl_t> call_impls;
-  std::map<zend_function *, v8js_function_tmpl_t> method_tmpls;
+  std::map<std::pair<zend_class_entry *, zend_function *>, v8js_function_tmpl_t> method_tmpls;
 
 
   std::list<v8js_v8object *> v8js_v8objects;
   std::list<v8js_v8object *> v8js_v8objects;
 
 

+ 2 - 2
v8js_object_export.cc

@@ -701,13 +701,13 @@ v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::Name> property_n
 					v8::Local<v8::FunctionTemplate> ft;
 					v8::Local<v8::FunctionTemplate> ft;
 					try {
 					try {
 						ft = v8::Local<v8::FunctionTemplate>::New
 						ft = v8::Local<v8::FunctionTemplate>::New
-							(isolate, ctx->method_tmpls.at(method_ptr));
+							(isolate, ctx->method_tmpls.at(std::make_pair(ce, method_ptr)));
 					}
 					}
 					catch (const std::out_of_range &) {
 					catch (const std::out_of_range &) {
 						ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
 						ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
 								v8::External::New((isolate), method_ptr),
 								v8::External::New((isolate), method_ptr),
 								v8::Signature::New((isolate), tmpl));
 								v8::Signature::New((isolate), tmpl));
-						v8js_function_tmpl_t *persistent_ft = &ctx->method_tmpls[method_ptr];
+						v8js_function_tmpl_t *persistent_ft = &ctx->method_tmpls[std::make_pair(ce, method_ptr)];
 						persistent_ft->Reset(isolate, ft);
 						persistent_ft->Reset(isolate, ft);
 					}
 					}
 					ft->GetFunction(v8_context).ToLocal(&ret_value);
 					ft->GetFunction(v8_context).ToLocal(&ret_value);