Skip to content

Commit af22796

Browse files
authored
Merge pull request #416 from stesie/issue-410
Fixes #410
2 parents 754d29d + 35398cc commit af22796

File tree

4 files changed

+55
-6
lines changed

4 files changed

+55
-6
lines changed

tests/issue_410_basic.phpt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
--TEST--
2+
Test V8::executeString() : Method access from multiple derived classes
3+
--SKIPIF--
4+
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
5+
--FILE--
6+
<?php
7+
8+
class BaseClass {
9+
public function bla() {
10+
printf('print bla, called class: %s' . PHP_EOL, get_called_class());
11+
}
12+
}
13+
14+
class Foo extends BaseClass {}
15+
16+
class Bar extends BaseClass {}
17+
18+
$v8 = new V8Js('PHP');
19+
$v8->Foo = new Foo();
20+
$v8->Bar = new Bar();
21+
22+
$code = <<<EOT
23+
var_dump(PHP.Foo);
24+
PHP.Foo.bla();
25+
var_dump(PHP.Bar);
26+
PHP.Bar.bla();
27+
EOT;
28+
29+
$v8->executeString($code);
30+
31+
?>
32+
===EOF===
33+
--EXPECTF--
34+
object(Foo)#%d (1) {
35+
["bla"] =>
36+
object(Closure)#%d {
37+
function () { [native code] }
38+
}
39+
}
40+
print bla, called class: Foo
41+
object(Bar)#%d (1) {
42+
["bla"] =>
43+
object(Closure)#%d {
44+
function () { [native code] }
45+
}
46+
}
47+
print bla, called class: Bar
48+
===EOF===
49+

v8js_class.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ static void v8js_free_storage(zend_object *object) /* {{{ */
119119
}
120120
c->call_impls.~map();
121121

122-
for (std::map<zend_function *, v8js_function_tmpl_t>::iterator it = c->method_tmpls.begin();
122+
for (std::map<std::pair<zend_class_entry *, zend_function *>, v8js_function_tmpl_t>::iterator it = c->method_tmpls.begin();
123123
it != c->method_tmpls.end(); ++it) {
124124
it->second.Reset();
125125
}
@@ -232,7 +232,7 @@ static zend_object* v8js_new(zend_class_entry *ce) /* {{{ */
232232
new(&c->weak_closures) std::map<v8js_function_tmpl_t *, v8js_persistent_obj_t>();
233233
new(&c->weak_objects) std::map<zend_object *, v8js_persistent_obj_t>();
234234
new(&c->call_impls) std::map<v8js_function_tmpl_t *, v8js_function_tmpl_t>();
235-
new(&c->method_tmpls) std::map<zend_function *, v8js_function_tmpl_t>();
235+
new(&c->method_tmpls) std::map<std::pair<zend_class_entry *, zend_function *>, v8js_function_tmpl_t>();
236236

237237
new(&c->v8js_v8objects) std::list<v8js_v8object *>();
238238
new(&c->script_objects) std::vector<v8js_script *>();
@@ -589,7 +589,7 @@ static PHP_METHOD(V8Js, __construct)
589589
ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
590590
v8::External::New((isolate), method_ptr));
591591
// @fixme add/check Signature v8::Signature::New((isolate), tmpl));
592-
v8js_function_tmpl_t *persistent_ft = &c->method_tmpls[method_ptr];
592+
v8js_function_tmpl_t *persistent_ft = &c->method_tmpls[std::make_pair(ce, method_ptr)];
593593
persistent_ft->Reset(isolate, ft);
594594

595595
php_obj->CreateDataProperty(context, method_name, ft->GetFunction(context).ToLocalChecked());

v8js_class.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ struct v8js_ctx {
6363
std::map<zend_object *, v8js_persistent_obj_t> weak_objects;
6464
std::map<v8js_function_tmpl_t *, v8js_persistent_obj_t> weak_closures;
6565
std::map<v8js_function_tmpl_t *, v8js_function_tmpl_t> call_impls;
66-
std::map<zend_function *, v8js_function_tmpl_t> method_tmpls;
66+
std::map<std::pair<zend_class_entry *, zend_function *>, v8js_function_tmpl_t> method_tmpls;
6767

6868
std::list<v8js_v8object *> v8js_v8objects;
6969

v8js_object_export.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,13 +701,13 @@ v8::Local<v8::Value> v8js_named_property_callback(v8::Local<v8::Name> property_n
701701
v8::Local<v8::FunctionTemplate> ft;
702702
try {
703703
ft = v8::Local<v8::FunctionTemplate>::New
704-
(isolate, ctx->method_tmpls.at(method_ptr));
704+
(isolate, ctx->method_tmpls.at(std::make_pair(ce, method_ptr)));
705705
}
706706
catch (const std::out_of_range &) {
707707
ft = v8::FunctionTemplate::New(isolate, v8js_php_callback,
708708
v8::External::New((isolate), method_ptr),
709709
v8::Signature::New((isolate), tmpl));
710-
v8js_function_tmpl_t *persistent_ft = &ctx->method_tmpls[method_ptr];
710+
v8js_function_tmpl_t *persistent_ft = &ctx->method_tmpls[std::make_pair(ce, method_ptr)];
711711
persistent_ft->Reset(isolate, ft);
712712
}
713713
ft->GetFunction(v8_context).ToLocal(&ret_value);

0 commit comments

Comments
 (0)