Merge branch 'stable' into minor-next

This commit is contained in:
Dylan K. Taylor 2023-08-08 17:48:12 +01:00
commit 9f14901820
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
13 changed files with 95 additions and 31 deletions

@ -1 +1 @@
Subproject commit 46604f2f6a07e3f68a82e4f4d7efdd45629b101e Subproject commit ed0bc4d2afafd00f9ee92823c6b1bd66789ce4f2

View File

@ -22,7 +22,7 @@
"ext-openssl": "*", "ext-openssl": "*",
"ext-pcre": "*", "ext-pcre": "*",
"ext-phar": "*", "ext-phar": "*",
"ext-pmmpthread": "^6.0.4", "ext-pmmpthread": "^6.0.7",
"ext-reflection": "*", "ext-reflection": "*",
"ext-simplexml": "*", "ext-simplexml": "*",
"ext-sockets": "*", "ext-sockets": "*",

18
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "63ecdcea88960659a6977300a0ea79b3", "content-hash": "2d51c1adf069760587b6d36f9c4a5db3",
"packages": [ "packages": [
{ {
"name": "adhocore/json-comment", "name": "adhocore/json-comment",
@ -1861,16 +1861,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "10.2.7", "version": "10.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "a215d9ee8bac1733796e4ddff3306811f14414e5" "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a215d9ee8bac1733796e4ddff3306811f14414e5", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d442ce7c4104d5683c12e67e4dcb5058159e9804",
"reference": "a215d9ee8bac1733796e4ddff3306811f14414e5", "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1910,7 +1910,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "10.2-dev" "dev-main": "10.3-dev"
} }
}, },
"autoload": { "autoload": {
@ -1942,7 +1942,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.7" "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.1"
}, },
"funding": [ "funding": [
{ {
@ -1958,7 +1958,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-02T06:46:08+00:00" "time": "2023-08-04T06:48:08+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -2945,7 +2945,7 @@
"ext-openssl": "*", "ext-openssl": "*",
"ext-pcre": "*", "ext-pcre": "*",
"ext-phar": "*", "ext-phar": "*",
"ext-pmmpthread": "^6.0.4", "ext-pmmpthread": "^6.0.7",
"ext-reflection": "*", "ext-reflection": "*",
"ext-simplexml": "*", "ext-simplexml": "*",
"ext-sockets": "*", "ext-sockets": "*",

View File

@ -11,6 +11,7 @@ includes:
rules: rules:
- pocketmine\phpstan\rules\DisallowEnumComparisonRule - pocketmine\phpstan\rules\DisallowEnumComparisonRule
- pocketmine\phpstan\rules\DisallowForeachByReferenceRule
- pocketmine\phpstan\rules\UnsafeForeachArrayOfStringRule - pocketmine\phpstan\rules\UnsafeForeachArrayOfStringRule
# - pocketmine\phpstan\rules\ThreadedSupportedTypesRule # - pocketmine\phpstan\rules\ThreadedSupportedTypesRule

View File

@ -120,8 +120,8 @@ namespace pocketmine {
} }
if(($pmmpthread_version = phpversion("pmmpthread")) !== false){ if(($pmmpthread_version = phpversion("pmmpthread")) !== false){
if(version_compare($pmmpthread_version, "6.0.4") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){ if(version_compare($pmmpthread_version, "6.0.7") < 0 || version_compare($pmmpthread_version, "7.0.0") >= 0){
$messages[] = "pmmpthread ^6.0.4 is required, while you have $pmmpthread_version."; $messages[] = "pmmpthread ^6.0.7 is required, while you have $pmmpthread_version.";
} }
} }

View File

@ -27,6 +27,10 @@ use pocketmine\item\Item;
class Podzol extends Opaque{ class Podzol extends Opaque{
public function isAffectedBySilkTouch() : bool{
return true;
}
public function getDropsForCompatibleTool(Item $item) : array{ public function getDropsForCompatibleTool(Item $item) : array{
return [ return [
VanillaBlocks::DIRT()->asItem() VanillaBlocks::DIRT()->asItem()

View File

@ -85,6 +85,7 @@ class RakLibServer extends Thread{
gc_enable(); gc_enable();
ini_set("display_errors", '1'); ini_set("display_errors", '1');
ini_set("display_startup_errors", '1'); ini_set("display_startup_errors", '1');
\GlobalLogger::set($this->logger);
$socket = new ServerSocket($this->address->deserialize()); $socket = new ServerSocket($this->address->deserialize());
$manager = new Server( $manager = new Server(
@ -107,11 +108,6 @@ class RakLibServer extends Thread{
$manager->waitShutdown(); $manager->waitShutdown();
} }
protected function onUncaughtException(\Throwable $e) : void{
parent::onUncaughtException($e);
$this->logger->logException($e);
}
public function getThreadName() : string{ public function getThreadName() : string{
return "RakLib"; return "RakLib";
} }

View File

@ -81,9 +81,9 @@ class PermissionManager{
} }
public function unsubscribeFromAllPermissions(PermissibleInternal $permissible) : void{ public function unsubscribeFromAllPermissions(PermissibleInternal $permissible) : void{
foreach($this->permSubs as $permission => &$subs){ foreach($this->permSubs as $permission => $subs){
unset($subs[spl_object_id($permissible)]); unset($this->permSubs[$permission][spl_object_id($permissible)]);
if(count($subs) === 0){ if(count($this->permSubs[$permission]) === 0){
unset($this->permSubs[$permission]); unset($this->permSubs[$permission]);
} }
} }

View File

@ -69,11 +69,6 @@ class AsyncWorker extends Worker{
$this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier()); $this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier());
} }
protected function onUncaughtException(\Throwable $e) : void{
parent::onUncaughtException($e);
$this->logger->logException($e);
}
public function getLogger() : ThreadSafeLogger{ public function getLogger() : ThreadSafeLogger{
return $this->logger; return $this->logger;
} }

View File

@ -28,6 +28,7 @@ use pocketmine\errorhandler\ErrorToExceptionHandler;
use pocketmine\Server; use pocketmine\Server;
use function error_get_last; use function error_get_last;
use function error_reporting; use function error_reporting;
use function implode;
use function register_shutdown_function; use function register_shutdown_function;
use function set_exception_handler; use function set_exception_handler;
@ -115,6 +116,7 @@ trait CommonThreadPartsTrait{
protected function onUncaughtException(\Throwable $e) : void{ protected function onUncaughtException(\Throwable $e) : void{
$this->synchronized(function() use ($e) : void{ $this->synchronized(function() use ($e) : void{
$this->crashInfo = ThreadCrashInfo::fromThrowable($e, $this->getThreadName()); $this->crashInfo = ThreadCrashInfo::fromThrowable($e, $this->getThreadName());
\GlobalLogger::get()->logException($e);
}); });
} }
@ -124,15 +126,26 @@ trait CommonThreadPartsTrait{
*/ */
protected function onShutdown() : void{ protected function onShutdown() : void{
$this->synchronized(function() : void{ $this->synchronized(function() : void{
if(!$this->isKilled && $this->crashInfo === null){ if($this->isTerminated() && $this->crashInfo === null){
$last = error_get_last(); $last = error_get_last();
if($last !== null){ if($last !== null){
//fatal error //fatal error
$this->crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName()); $crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName());
}else{ }else{
//probably misused exit() //probably misused exit()
$this->crashInfo = ThreadCrashInfo::fromThrowable(new \RuntimeException("Thread crashed without an error - perhaps exit() was called?"), $this->getThreadName()); $crashInfo = ThreadCrashInfo::fromThrowable(new \RuntimeException("Thread crashed without an error - perhaps exit() was called?"), $this->getThreadName());
} }
$this->crashInfo = $crashInfo;
$lines = [];
//mimic exception printed format
$lines[] = "Fatal error: " . $crashInfo->makePrettyMessage();
$lines[] = "--- Stack trace ---";
foreach($crashInfo->getTrace() as $frame){
$lines[] = " " . $frame->getPrintableFrame();
}
$lines[] = "--- End of fatal error information ---";
\GlobalLogger::get()->critical(implode("\n", $lines));
} }
}); });
} }

View File

@ -3003,7 +3003,7 @@ class World implements ChunkManager{
* @throws WorldException if the terrain is not generated * @throws WorldException if the terrain is not generated
*/ */
public function getSafeSpawn(?Vector3 $spawn = null) : Position{ public function getSafeSpawn(?Vector3 $spawn = null) : Position{
if(!($spawn instanceof Vector3) || $spawn->y < 1){ if(!($spawn instanceof Vector3) || $spawn->y <= $this->minY){
$spawn = $this->getSpawnLocation(); $spawn = $this->getSpawnLocation();
} }

View File

@ -0,0 +1,53 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\phpstan\rules;
use PhpParser\Node;
use PhpParser\Node\Stmt\Foreach_;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleErrorBuilder;
/**
* @phpstan-implements Rule<Foreach_>
*/
final class DisallowForeachByReferenceRule implements Rule{
public function getNodeType() : string{
return Foreach_::class;
}
public function processNode(Node $node, Scope $scope) : array{
/** @var Foreach_ $node */
if($node->byRef){
return [
RuleErrorBuilder::message("Foreach by-reference is not allowed, because it has surprising behaviour.")
->tip("If the value variable is used outside of the foreach construct (e.g. in a second foreach), the iterable's contents will be unexpectedly altered.")
->build()
];
}
return [];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
use pocketmine\block\Block; use pocketmine\block\Block;
use pocketmine\block\RuntimeBlockStateRegistry; use pocketmine\block\RuntimeBlockStateRegistry;
use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\AssumptionFailedError;
use pocketmine\utils\Utils;
require dirname(__DIR__, 3) . '/vendor/autoload.php'; require dirname(__DIR__, 3) . '/vendor/autoload.php';
@ -91,8 +92,9 @@ foreach($new as $stateId => $name){
$newTable[$name][] = $stateId; $newTable[$name][] = $stateId;
} }
ksort($newTable, SORT_STRING); ksort($newTable, SORT_STRING);
foreach($newTable as &$stateIds){ foreach(Utils::stringifyKeys($newTable) as $name => $stateIds){
sort($stateIds, SORT_NUMERIC); sort($stateIds, SORT_NUMERIC);
$newTable[$name] = $stateIds;
} }
file_put_contents(__DIR__ . '/block_factory_consistency_check.json', json_encode( file_put_contents(__DIR__ . '/block_factory_consistency_check.json', json_encode(