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:
@@ -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,
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
@@ -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'));
|
||||
@@ -0,0 +1,3 @@
|
||||
string(1) "A"
|
||||
string(1) "B"
|
||||
string(1) "B"
|
||||
Referência em uma Nova Issue
Bloquear um usuário