⚝
One Hat Cyber Team
⚝
Your IP:
216.73.216.1
Server IP:
185.238.29.86
Server:
Linux server2 6.8.12-6-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.12-6 (2024-12-19T19:05Z) x86_64
Server Software:
nginx/1.18.0
PHP Version:
8.1.31
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
var
/
www
/
test
/
vendor
/
psy
/
psysh
/
src
/
CodeCleaner
/
View File Name :
LabelContextPass.php
<?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\FunctionLike; use PhpParser\Node\Stmt\Goto_; use PhpParser\Node\Stmt\Label; use Psy\Exception\FatalErrorException; /** * CodeCleanerPass for label context. * * This class partially emulates the PHP label specification. * PsySH can not declare labels by sequentially executing lines with eval, * but since it is not a syntax error, no error is raised. * This class warns before invalid goto causes a fatal error. * Since this is a simple checker, it does not block real fatal error * with complex syntax. (ex. it does not parse inside function.) * * @see http://php.net/goto */ class LabelContextPass extends CodeCleanerPass { /** @var int */ private $functionDepth; /** @var array */ private $labelDeclarations; /** @var array */ private $labelGotos; /** * @param array $nodes * * @return Node[]|null Array of nodes */ public function beforeTraverse(array $nodes) { $this->functionDepth = 0; $this->labelDeclarations = []; $this->labelGotos = []; } /** * @return int|Node|null Replacement node (or special return value) */ public function enterNode(Node $node) { if ($node instanceof FunctionLike) { $this->functionDepth++; return; } // node is inside function context if ($this->functionDepth !== 0) { return; } if ($node instanceof Goto_) { $this->labelGotos[\strtolower($node->name)] = $node->getLine(); } elseif ($node instanceof Label) { $this->labelDeclarations[\strtolower($node->name)] = $node->getLine(); } } /** * @param \PhpParser\Node $node * * @return int|Node|Node[]|null Replacement node (or special return value) */ public function leaveNode(Node $node) { if ($node instanceof FunctionLike) { $this->functionDepth--; } } /** * @return Node[]|null Array of nodes */ public function afterTraverse(array $nodes) { foreach ($this->labelGotos as $name => $line) { if (!isset($this->labelDeclarations[$name])) { $msg = "'goto' to undefined label '{$name}'"; throw new FatalErrorException($msg, 0, \E_ERROR, null, $line); } } } }