Make func_get_args and friends work with namespaces
func_get_args would only return declared parameters when used inside of namespaces. This allows it to work correctly in that case. Closes #832
Esse commit está contido em:
@@ -397,7 +397,14 @@ void Parser::onCall(Token &out, bool dynamic, Token &name, Token ¶ms,
|
||||
assert(!fromCompiler);
|
||||
} else {
|
||||
const string &s = name.text();
|
||||
if (s == "func_num_args" || s == "func_get_args" || s == "func_get_arg") {
|
||||
// strip out namespaces for func_get_args and friends check
|
||||
size_t lastBackslash = s.find_last_of(NAMESPACE_SEP);
|
||||
const string stripped = lastBackslash == string::npos
|
||||
? s
|
||||
: s.substr(lastBackslash+1);
|
||||
if (stripped == "func_num_args" ||
|
||||
stripped == "func_get_args" ||
|
||||
stripped == "func_get_arg") {
|
||||
if (m_hasCallToGetArgs.size() > 0) {
|
||||
m_hasCallToGetArgs.back() = true;
|
||||
}
|
||||
@@ -876,9 +883,7 @@ void Parser::onFunction(Token &out, Token *modifiers, Token &ret, Token &ref,
|
||||
func->setOrigGeneratorFunc(origStmt);
|
||||
origStmt->setGeneratorFunc(func);
|
||||
origStmt->setHasCallToGetArgs(hasCallToGetArgs);
|
||||
func->setHasCallToGetArgs(hasCallToGetArgs);
|
||||
}
|
||||
|
||||
} else {
|
||||
ExpressionListPtr attrList;
|
||||
if (attr && attr->exp) {
|
||||
@@ -904,6 +909,7 @@ void Parser::onFunction(Token &out, Token *modifiers, Token &ret, Token &ref,
|
||||
out->stmt = NEW_STMT0(StatementList);
|
||||
}
|
||||
}
|
||||
func->setHasCallToGetArgs(hasCallToGetArgs);
|
||||
}
|
||||
|
||||
void Parser::onParam(Token &out, Token *params, Token &type, Token &var,
|
||||
@@ -1250,7 +1256,6 @@ void Parser::onMethod(Token &out, Token &modifiers, Token &ret, Token &ref,
|
||||
mth->setOrigGeneratorFunc(origStmt);
|
||||
origStmt->setGeneratorFunc(mth);
|
||||
origStmt->setHasCallToGetArgs(hasCallToGetArgs);
|
||||
mth->setHasCallToGetArgs(hasCallToGetArgs);
|
||||
} else {
|
||||
ExpressionListPtr attrList;
|
||||
if (attr && attr->exp) {
|
||||
@@ -1268,6 +1273,7 @@ void Parser::onMethod(Token &out, Token &modifiers, Token &ret, Token &ref,
|
||||
}
|
||||
completeScope(mth->onInitialParse(m_ar, m_file));
|
||||
}
|
||||
mth->setHasCallToGetArgs(hasCallToGetArgs);
|
||||
}
|
||||
|
||||
void Parser::onMemberModifier(Token &out, Token *modifiers, Token &modifier) {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace foo {
|
||||
function bar($a, $b) {
|
||||
var_dump(func_num_args(), func_get_args());
|
||||
}
|
||||
|
||||
bar(1,2,3,4,5);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
int(5)
|
||||
array(5) {
|
||||
[0]=>
|
||||
int(1)
|
||||
[1]=>
|
||||
int(2)
|
||||
[2]=>
|
||||
int(3)
|
||||
[3]=>
|
||||
int(4)
|
||||
[4]=>
|
||||
int(5)
|
||||
}
|
||||
Referência em uma Nova Issue
Bloquear um usuário