- 添加了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