- 添加了stdTypeMap用于存储标准类型映射关系 - 实现了registerStdType方法用于注册标准类型ID - 为std数组、向量和映射容器添加了类型ID分配逻辑 - 在unsafe_cast操作中增加了类型ID验证机制 - 添加了类型不匹配时的异常抛出功能 - 修复了self::class和parent::class的命名空间解析问题 - 更新了unsafe_ptr创建时的类型ID传递逻辑 - 添加了多个测试用例验证类型不匹配场景pull/1/head
parent
79bc9d4e69
commit
7f4dee40c0
7 changed files with 179 additions and 14 deletions
@ -0,0 +1,15 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
class StdContainerStaticBase |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
class StdContainerStaticChild extends StdContainerStaticBase |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
function test_std_container_static_class_mismatch(): void |
||||||
|
{ |
||||||
|
$vector = std::vector(StdContainerStaticBase::class); |
||||||
|
$vector[] = new StdContainerStaticChild(); |
||||||
|
} |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
function std_unsafe_cast_requires_unsafe_ptr(mixed $ptr): void |
||||||
|
{ |
||||||
|
$array = std::unsafe_cast(std::array(native_types::type_int, 3), $ptr); |
||||||
|
} |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
--TEST-- |
||||||
|
std vector: unsafe_cast type mismatch |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
function std_vector_unsafe_ptr_type_mismatch(UnsafePtr $unsafePtr): void |
||||||
|
{ |
||||||
|
$vector = std::unsafe_cast(std::vector(native_types::type_float), $unsafePtr); |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
$vector = std::vector(native_types::type_int, 3); |
||||||
|
$ptr = std::unsafe_ptr($vector); |
||||||
|
|
||||||
|
try { |
||||||
|
std_vector_unsafe_ptr_type_mismatch($ptr); |
||||||
|
} catch (RuntimeException $e) { |
||||||
|
echo $e->getMessage(), "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
std::unsafe_cast(): UnsafePtr type mismatch |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
--TEST-- |
||||||
|
std vector: unsafe_cast class value type mismatch |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
class StdVectorUnsafeCastBase |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
class StdVectorUnsafeCastOther |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
function std_vector_unsafe_ptr_class_type_mismatch(UnsafePtr $unsafePtr): void |
||||||
|
{ |
||||||
|
$vector = std::unsafe_cast(std::vector(StdVectorUnsafeCastOther::class), $unsafePtr); |
||||||
|
} |
||||||
|
|
||||||
|
function main() { |
||||||
|
$vector = std::vector(StdVectorUnsafeCastBase::class); |
||||||
|
$ptr = std::unsafe_ptr($vector); |
||||||
|
|
||||||
|
try { |
||||||
|
std_vector_unsafe_ptr_class_type_mismatch($ptr); |
||||||
|
} catch (RuntimeException $e) { |
||||||
|
echo $e->getMessage(), "\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
std::unsafe_cast(): UnsafePtr type mismatch |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
--TEST-- |
||||||
|
std vector: namespaced self class value unsafe_cast |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
namespace StdVectorUnsafeCastNs { |
||||||
|
class Holder |
||||||
|
{ |
||||||
|
public static function update(UnsafePtr $unsafePtr): void |
||||||
|
{ |
||||||
|
$vector = std::unsafe_cast(std::vector(self::class), $unsafePtr); |
||||||
|
echo "ok\n"; |
||||||
|
} |
||||||
|
|
||||||
|
public static function run(): void |
||||||
|
{ |
||||||
|
$vector = std::vector(self::class); |
||||||
|
$ptr = std::unsafe_ptr($vector); |
||||||
|
self::update($ptr); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
namespace { |
||||||
|
function main() { |
||||||
|
StdVectorUnsafeCastNs\Holder::run(); |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
ok |
||||||
Loading…
Reference in new issue