Pass name of called class to intercept handler for static methods

Otherwise there is no way to tell which class was actually called.
More context here: https://www.facebook.com/groups/243324789049477/permalink/470958322952788/
Esse commit está contido em:
Mark Williams
2013-05-09 13:51:56 -07:00
commit de Sara Golemon
commit 117823acf1
6 arquivos alterados com 52 adições e 19 exclusões
+3 -3
Ver Arquivo
@@ -1416,10 +1416,10 @@ bool f_fb_intercept(CStrRef name, CVarRef handler,
Variant f_fb_stubout_intercept_handler(CStrRef name, CVarRef obj,
CArrRef params, CVarRef data,
VRefParam done) {
if (obj.isNull()) {
return vm_call_user_func(data, params);
if (obj.isObject()) {
return vm_call_user_func(CREATE_VECTOR2(obj, data), params);
}
return vm_call_user_func(CREATE_VECTOR2(obj, data), params);
return vm_call_user_func(data, params);
}
Variant f_fb_rpc_intercept_handler(CStrRef name, CVarRef obj, CArrRef params,
+9 -3
Ver Arquivo
@@ -147,11 +147,17 @@ bool EventHook::RunInterceptHandler(ActRec* ar) {
try {
Variant doneFlag = true;
Variant obj = ar->hasThis() ?
Variant(Object(ar->getThis())) : uninit_null();
Variant called_on;
if (ar->hasThis()) {
called_on = Variant(ar->getThis());
} else if (ar->hasClass()) {
// For static methods, give handler the name of called class
called_on = Variant(const_cast<StringData*>(ar->getClass()->name()));
}
Array intArgs =
CREATE_VECTOR5(ar->m_func->fullNameRef(),
obj,
called_on,
get_frame_args_with_ref(ar),
h->asCArrRef()[1],
ref(doneFlag));
+3 -3
Ver Arquivo
@@ -42,7 +42,7 @@ array(5) {
caught magic call 1
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(5) "Blark"
array(0) {
}
NULL
@@ -51,7 +51,7 @@ bool(true)
caught static call 1
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(5) "Blark"
array(0) {
}
NULL
@@ -63,7 +63,7 @@ array(5) {
[0]=>
string(12) "Blark::sfrap"
[1]=>
NULL
string(5) "Blark"
[2]=>
array(0) {
}
+10 -10
Ver Arquivo
@@ -68,7 +68,7 @@ static frap SubBlark2
static frap SubBlark2
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(5) "Blark"
array(0) {
}
NULL
@@ -76,7 +76,7 @@ bool(true)
---------------
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(5) "Blark"
array(0) {
}
NULL
@@ -84,7 +84,7 @@ bool(true)
---------------
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(8) "SubBlark"
array(0) {
}
NULL
@@ -92,7 +92,7 @@ bool(true)
---------------
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(8) "SubBlark"
array(0) {
}
NULL
@@ -100,7 +100,7 @@ bool(true)
---------------
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(9) "SubBlark2"
array(0) {
}
NULL
@@ -108,7 +108,7 @@ bool(true)
---------------
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(9) "SubBlark2"
array(0) {
}
NULL
@@ -116,7 +116,7 @@ bool(true)
---------------
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(5) "Blark"
array(0) {
}
NULL
@@ -125,7 +125,7 @@ bool(true)
static frap Blark
----HANDLER----
string(12) "Blark::sfrap"
NULL
string(5) "Blark"
array(0) {
}
NULL
@@ -137,7 +137,7 @@ array(5) {
[0]=>
string(12) "Blark::sfrap"
[1]=>
NULL
string(5) "Blark"
[2]=>
array(0) {
}
@@ -152,7 +152,7 @@ array(5) {
[0]=>
string(12) "Blark::sfrap"
[1]=>
NULL
string(5) "Blark"
[2]=>
array(0) {
}
+24
Ver Arquivo
@@ -0,0 +1,24 @@
<?php
// Make sure that we can tell which class was called for intercepted static
// methods
class A {
public function foo() {
echo 'foo called';
}
}
class B extends A { }
fb_intercept('A::foo', function($_, $called_on) {
var_dump($called_on);
});
A::foo();
B::foo();
// Trigger run_intercept_handler_for_invokefunc codepath
$class = 'B';
$c = 'call_user_fun';
$c .= 'c';
$c(array($class, 'foo'));
+3
Ver Arquivo
@@ -0,0 +1,3 @@
string(1) "A"
string(1) "B"
string(1) "B"