Skip to content

Releases: tphp-lang/TinyPHP

v0.2.0-beta.11

Choose a tag to compare

@KingBes KingBes released this 07 Aug 12:36
e577eda

What's Changed

Full Changelog: v0.2.0-beta.10...v0.2.0-beta.11

新增

  • 编译缓存机制tphp.php):用源文件 SHA256 + TPHP_VERSION + common.h 哈希作为缓存 key,跳过未变化的重复转译。头文件变更时缓存自动失效
  • CI 质量基础设施.github/workflows/test.yml + .github/scripts/run_tests.php):
    • ASan job(GCC + sanitizer)
    • SHA256 下载校验框架
    • doc_check 纳入 tools-tests(文档完整性检查)
    • @expect-error 负面测试注解(期望编译失败)
    • -j N 并行测试执行

变更

  • CodeGenerator 拆分src/CodeGenerator.php + 6 个 trait):主文件 14,212 → 4,102 行(-71.1%),提取 CodeGenData/TypeCast/VarWrap/Array/Call/Enum trait + CodeGenTypes 统一 C 类型常量
  • 消除重复代码:NameResolver 统一 6 处重复、tphp.php preprocessFlags()/resolvePlatform() 合并、Helpers.php 提取 7 个辅助函数
  • Channel 自旋优化include/object/channel.h):自旋次数 750→64,每轮 thrd_yield() 让出 CPU,减少高竞争下无效锁竞争
  • 字符串搜索优化include/std/core.h):strpos/strrpos/stripos/strriposmemchr 快速跳过首字节,替代逐字节线性扫描
  • 测试素材管理规范化:25 张测试图片迁移至 test/fixtures/images/,.gitignore 用通配符规则区分输入素材和输出产物

修复

  • Windows GCC 测试超时.github/scripts/run_tests.php):超时 60s→300s,GCC -O2 编译大型 C 文件(如 gd font_test 含 15 个 zlib 源文件)耗时接近 60s,CI 更慢导致超时
  • 缓存命中时变量未定义tphp.php):$debugMode/$extraFlags/$lateLinkFlags 在缓存检查前预初始化,修复缓存命中时 Undefined variable
  • unlink 文件锁 warningtphp.php):unlink@unlink 抑制 Windows 文件锁 "Resource temporarily unavailable" warning
  • run_tests.php Windows stream_select 引用参数错误stream_select() 要求引用参数,不能内联赋值
  • run_tests.php macOS 管道丢数据:Linux/macOS 恢复 system()+shell 重定向替代 proc_open
  • CI exif/gd 测试静默崩溃:测试素材图片纳入 git 跟踪 + t_be.jpg 路径修复
  • doc_check 误报:过滤内部 C 宏/实现函数,消除 257 个误报;移除硬编码白名单改用模式匹配
  • CI tools-tests shell 语法错误:移除 here-string,简化 shell 语法

清理

  • 删除 5 个死代码文件(builtin_full.h/std/builtins.h/klib//Compiler.php
  • 根目录残留 .exe/临时文件清理
  • PHP 8.2+ 动态属性 Deprecated 警告修复
  • Compiler.php 残留引用移除
  • 并行测试 .c 文件同名冲突修复

文档

v0.2.0-beta.10

Choose a tag to compare

@KingBes KingBes released this 05 Aug 04:48
f314fde

What's Changed

Full Changelog: v0.2.0-beta.9...v0.2.0-beta.10

新增

  • stdClass 动态属性对象支持include/object/stdclass.h + 编译器集成):兼容 PHP 原生 new stdClass(),支持字面量属性名的动态属性读写、isset/unset、foreach 遍历、(object)/(array) 类型转换、get_object_vars() 内置函数。
    • AOT 兼容性:仅支持字面量属性名(编译期已知),不支持 $obj->$var 动态属性名(与 $$var 同理,AOT 约束)。json_decode 保持返回 array(不改为 stdClass,因 JSON 键运行时才知道)
    • 运行时实现tphp_class_stdClass 结构体(t_object header + t_array* props 动态属性表),基于 array.h 的哈希索引实现 O(1) 属性查找。提供 new_stdClass/tphp_fn_stdclass_get/set/isset/unset/clone/count/from_array/to_array 10 个运行时函数
    • 编译器特判:visitNew/visitPropertyAccess/visitAssignPropStmt/isset/unset/foreach 在对象类型为 tphp_class_stdClass* 时生成运行时函数调用;新增 wrapTVar 辅助方法将任意类型包装为 t_var,emitStdClassForeach 生成属性遍历代码
    • 类型转换(object) $array 通过 tphp_fn_stdclass_from_array 复制键值对创建 stdClass;(array) $stdClass 通过 tphp_fn_stdclass_to_array 提取属性表为关联数组
    • var_dump 适配:stdClass 输出 PHP 兼容格式 object(stdClass)#N (count) { ["k"]=> val ... },递归显示所有动态属性
    • isset 语义:与 PHP 一致,null 值属性返回 false(不仅检查键存在性,还检查值非 null)
    • Parser 支持:新增 (object) cast 类型识别(Lexer 中 object 非类型关键字,需 Parser 特判)
    • 测试覆盖:6 个测试文件(basic/cast/isset_unset/foreach/functions/edge),TCC/GCC/Clang 三编译器全部通过

修复

  • macOS Metal shader 缺失ext/ui/src/ui.h):shader 源码只有 SOKOL_GLCORESOKOL_GLES3 两个条件编译分支,macOS 使用 SOKOL_METAL 后端时 _sr_vs_src/_sr_fs_src 未声明导致编译失败。添加 SOKOL_METAL 分支提供 MSL(Metal Shading Language)源码,通过 _SR_VS_ENTRY/_SR_FS_ENTRY 宏为 Metal 后端设置显式 entry 函数名(vs_main/fs_main
  • Android NDK CI 报错 "built-in TCC not found"tphp.php):-os android 时默认尝试找 TCC,但 Linux CI 环境未安装 TCC。Android 目标使用 NDK clang,跳过 TCC 存在性检查;$ccClass 在条件编译求值阶段(Phase 1)提前设为 'Clang'(而非等到 NDK 探测逻辑 Phase 2)

v0.2.0-beta.9

Choose a tag to compare

@KingBes KingBes released this 02 Aug 15:47
2d181da

What's Changed

Full Changelog: v0.2.0-beta.8...v0.2.0-beta.9

[0.2.0-beta.9] — 2026-08-02

新增

  • ext/uiext/ui/):基于 sokol C 库的跨平台图形界面扩展(纯 phpc 模式)。9 个 PHP 类 + 9 个枚举,覆盖窗口管理、2D 绘图、控件体系、布局系统和事件处理。
    • 底层依赖:内置 sokol C 库源码(sokol_app/sokol_gfx/sokol_glue/sokol_log/sokol_time),位于 ext/ui/sokol/,零运行时依赖
    • 平台后端:Windows/Linux = OpenGL (SOKOL_GLCORE),macOS = Metal (SOKOL_METAL)。TCC 缺失 windowsx.h,故 Windows 使用 OpenGL 而非 D3D11
    • 核心类App(窗口生命周期 + onInit/onFrame/onEvent 回调)、Window(静态:width/height/dpiScale/setCursor)、Event(fromPtr 解析 sapp_event 指针)、Color(RGBA + toUint 0xAABBGGRR)、Rect(contains 命中测试)、Graphics(静态:clear/fillRect/drawText/drawLine/drawRect/drawCircle)
    • 控件体系Widget 抽象基类(init/draw/setPos/proposeSize/pointInside + 事件方法)、WidgetContainer(addChild/drawAll/hitTestIndex/dispatch*)、Button(press/release/click + onClick)、LabelTextBox(focus/blur/handleKeyDown/handleChar)、CheckBox(toggle/setChecked + onChange)、Slider(beginDrag/drag/endDrag/setValue + 值夹紧)
    • 布局系统Layout 抽象基类(addWidget/updateLayout/asWidget)、Stack(flex 风格,row/column 静态方法,Compact/Stretch/Fixed 尺寸模式)、CanvasLayout(绝对定位)
    • 软键盘桥接SoftInput 静态类(show/hide/isVisible/onInput/dispatch/clear),桌面端 show/hide 为 no-op,移动端未来支持
    • 枚举:EventType(22 值)/ Key(ASCII+VK_*)/ MouseButton / KeyMod / Cursor / Direction / WidgetState / LayoutAlign / ChildSize
    • 绘图契约:所有 Graphics::* 方法必须在 onFrame 回调内调用,否则抛 Exception("drawing outside frame callback")
    • 事件契约:sokol sapp_event* 指针以 t_int 流转(intptr_t 转换),PHP 侧通过 Event::fromPtr($evPtr) 解析
    • 回调安全onInit/onFrame/onEvent/SoftInput::onInput 注册的闭包通过 phpc_env_pin 钉在全局 pin 表,防异步回调 UAF
    • TCC Windows 兼容RegisterRawInputDevices/GetRawInputData 在 user32.def 缺失,提供 stub 满足链接器(仅 mouse_lock 时调用,UI 测试不使用)
    • 测试:test/ui/ui_color_test.php(Color 单元测试)+ test/ui/ui_widget_smoke_test.php(Widget/Layout 冒烟测试)+ 4 个集成测试(ui_basic.php/ui_events.php/ui_widget_render.php/ui_layout_render.php,标记 @skip 需图形环境)

v0.2.0-beta.8

Choose a tag to compare

@KingBes KingBes released this 30 Jul 15:34
5178041

🎉 New Features

异步与协程通信库 (Channel / Future / chan_select)

参考 vlang CSP 模型设计的异步通信原语,采用 tphp OOP 思想:

  • Channel — CSP 风格有界通道,环形缓冲区实现(push/pop 零 malloc),阻塞前自旋 750 次减少 syscall。9 个方法
  • Future — 一次性异步结果传递,支持 await/then/catch 链式调用 + all/race 组合器。10 个方法
  • chan_select — 多通道多路复用,支持超时机制
  • 内存安全:push 时 retain,close 时遍历释放,dtor 保证不泄漏
  • 新增 ChannelClosedException / FutureRejectedException 异常类型

ext/pgsql + ext/pdo_pgsql

PostgreSQL 扩展(纯 C 协议实现,支持 trust/md5/SCRAM-SHA-256 认证):

  • 78 个 pg_* 函数(连接/查询/预处理/结果集/COPY/DML/Large Object/持久连接/通知回调)
  • ~60 个常量
  • 参考 vlang Pool+IdleSlot 模式实现 pg_pconnect 持久连接池
  • pdo_pgsql 驱动复用 ext/pgsql 协议实现

🐛 Bug Fixes

  • fix(ci): 修复 TCC on macOS 定义 __GNUC__ 导致误命中 GCC __atomic_* 内建,283 个测试全部编译失败
  • fix(pdo_pgsql): 修复 c_int() 截断 64 位 dbh 指针导致多平台段错误
  • fix(pgsql): 修复 notice 回调段错误 + TypeChecker 常量 null type 警告
  • fix(ext): pgsql/pdo_pgsql 改用 phpc 正确前缀 + 修复常量引用类型推导
  • fix(ci): Windows PostgreSQL 改用 EnterpriseDB binaries ZIP 包手动安装

Full Changelog: v0.2.0-beta.7...v0.2.0-beta.8

What's Changed

Full Changelog: v0.2.0-beta.7...v0.2.0-beta.8

v0.2.0-beta.7

Choose a tag to compare

@KingBes KingBes released this 29 Jul 14:24
d39ba1a

What's Changed

新特性

cURL 扩展 (ext/curl/)

  • 纯 phpc 实现 HTTP/HTTPS 客户端,不依赖 libcurl C 库
  • 35 个函数 + 690 个常量 + 6 个类(CurlHandle/CURLFile 等)
  • 复用 ext/openssl(mbedTLS)和 ext/stream 的 socket 抽象
  • 支持 multipart 文件上传、chunked 解码、FOLLOWLOCATION 重定向

GD 扩展 (ext/gd/)

  • 纯 phpc 实现图像处理,不依赖 libgd/libpng/libjpeg
  • ~90 个函数 + 89 个常量 + 2 个类(GdImage/GdFont)
  • 支持 PNG/GIF/BMP/GD/GD2/WBMP/XBM/TGA 共 8 种编解码
  • 不支持格式(JPEG/WebP 等)调用时抛 RuntimeException 明确报错

array 泛型数组类型系统

  • array 编译期单态化为独立 C 类型(t_arr_int/t_arr_str 等)
  • 元素紧凑存储(array 比 array 节省 67% 内存)
  • 协变转换机制 + 元素类型追踪 + 特化排序/洗牌

修复

异常处理机制 (include/object/try.h)

  • TP_SETJMP 宏:MinGW x86_64 SEH + GCC -O2 下使用 _setjmp(buf, NULL)
    跳过 RtlUnwindEx,修复 longjmp 跨函数跳转时 ACCESS_VIOLATION
  • _tp_do_longjmp noinline 辅助函数:隔离 longjmp 调用,防止 GCC 内联
    优化破坏 SEH unwind 表
  • TP_FINALLY 不再吞掉未处理异常:新增 _tp_need_rethrow 标志和保存变量,
    TP_END_TRY 据此重抛,修复 try { throw } finally { ... } catch 语义

其他修复

  • 对象唯一 ID 机制(t_object 新增 id 字段,替代 refcount & 0xFFFF)
  • 数组元素引用计数系统性修复(fetchAll 悬垂指针 use-after-free)
  • 数组重赋值自赋值 guard 双重释放
  • stream_socket_accept 错误处理契约(真错误抛异常,EAGAIN 返回 -1)
  • macOS -framework 链接支持(TCC 不识别 -framework X 语法)
  • gcc/clang 下特化排序/洗牌函数指针类型不兼容
  • isset/empty 返回类型推导缺失
  • mbedTLS 相关:声明顺序、参数类型、aesni.c 源文件缺失
  • gcc/clang 静态库归档命令不兼容(改用系统 ar)

v0.2.0-beta.6

Choose a tag to compare

@KingBes KingBes released this 26 Jul 12:19
b215125

What's Changed

New Contributors

Full Changelog: v0.2.0-beta.5...v0.2.0-beta.6

#3 架构重构
万能数组采用泛型数组代替提高效率.

  • 新增支持 type ...$var 参数

版本号忘改了

v0.2.0-beta.5

Choose a tag to compare

@KingBes KingBes released this 24 Jul 14:09

v0.2.0-beta.4

Choose a tag to compare

@KingBes KingBes released this 23 Jul 14:47

v0.2.0-beta.4

重点关注:内存安全(数组引用计数系统性修复)、编译器兼容性(gcc/clang 全平台通过)、PDO MySQL 驱动。

新增

  • PDO MySQL 驱动:在 SQLite 驱动基础上新增 MySQL 驱动,实现 PDO 驱动抽象层。CodeGenerator 自动注入驱动注册代码,PDO::__construct("mysql:...") 开箱即用。CI 已覆盖 Linux/Windows/macOS 三平台 MySQL 集成测试。
  • 字符串函数strrpos / stripos / strripos 三个查找函数。
  • stream_context_create:占位实现,接收 options 数组参数保持签名兼容。

修复

  • 数组元素引用计数系统性修复arr_push / arr_set_int / arr_set_str 存储数组/对象值时未 retain,导致 PDOStatement::fetchAllresult[] = row 后 row 被重赋值 free,result 残留悬垂指针(use-after-free)。
  • 对象唯一 ID 机制t_object 新增独立 id 字段(全局递增计数器),替代 refcount & 0xFFFFvar_dump 输出符合标准 PHP 行为。
  • 数组重赋值双重释放$result = func(..., $result, ...) 时函数内部 realloc 了旧指针,guard 再次 free 导致堆损坏。新增 exprIsCallWithVarArg 检测跳过此类释放。
  • gcc/clang 编译兼容性:修复多处 static inline 前向声明缺失导致的 implicit declaration / conflicting types 错误(array.h / pcre.c / iconv 等),三平台 gcc/clang/tcc 全部 222 测试通过
  • 闭包 $this 捕获:闭包内使用 $this 时自动捕获 self 指针并增加引用计数。
  • 继承类结构体:子类不再重复 _obj 字段,修复 upcast 指针偏移错误。
  • 注解 newInstance() 类型推断foreach (ROUTE as $v) 遍历注解数组时正确推导返回类型,修复 Call to undefined method 转译错误。
  • stream_socket_accept 错误处理:真正错误抛异常(可 try-catch),超时/EAGAIN 返回 -1,符合 AOT 错误处理原则。
  • runtime 错误处理:所有公共函数/对象方法改用 tp_throw 抛异常,消除静默错误处理。
  • Windows stream_isatty:用 GetFileType 替代 _isatty 避免崩溃。
  • $obj->prop[] = value 语法:Parser 支持属性数组 push 赋值。
  • 命名空间兼容性:类前向声明、静态属性方法调用、拓扑排序等命名空间场景修复。
  • macOS -framework 链接:TCC 透传 -framework X 给系统 ld。
  • #2

变更

  • PDO 驱动注册自动化:CodeGenerator 自动注入驱动初始化代码到 main(),无需手动注册。

Full Changelog: v0.2.0-beta.3...v0.2.0-beta.4

v0.2.0-beta.3

Choose a tag to compare

@KingBes KingBes released this 19 Jul 01:22

Full Changelog: 0.2.0-beta.2...v0.2.0-beta.3

v0.2.0-beta.3

本次版本聚焦测试体系对标 PHP 原生PHP 8.5 兼容性修复,同时包含多个扩展补全。

🎯 核心亮点

1. 测试体系对标 PHP 原生

  • 测试数量 169 → 209(+40,超出 200+ 目标)
  • 目录结构对齐 PHP tests/ 原生布局(lang//func//array//strings//math/ 等)
  • 移植 50+ PHP 8.5 原生 .phpt 测试,每个文件标注原生测试编号
  • 跨平台 CI 全绿:Windows AMD64 / Linux x86_64 / Linux aarch64 / macOS arm64

2. PHP 8.5 兼容性修复(14 项)

  • 嵌套数组深层访问$arr[0][1][2]$m["items"][0]["id"] 现可正确读取(新增 AST 追踪 + 嵌套深度推断)
  • list/[] 解构类型推断:混合类型数组 [$a1, [$a2, [$a3]]] = [10, [20, [30]]] 正确解构(per-index 类型推断)
  • ?? 数组键语义$arr["missing"] ?? "default"array_key_exists 检查,缺失键返回右侧而非 getter 默认值
  • 数学函数语义对齐abs(float) 返回 float、pow(int, -1) 返回 float、sqrt(-1) 返回 NAN、count($arr, COUNT_RECURSIVE) 递归统计
  • 数组函数补全array_pad() 新实现、array_keys($arr, $search) 搜索参数、max(1,2,3)/min(...) 可变参数形式

3. 扩展补全

  • PDO 扩展(SQLite 驱动):首个基于类的扩展,33 个方法
  • stream 扩展:新增 6 个函数(15 → 21)
  • OpenSSL 扩展:内置 mbedTLS 3.6.6 静态编译,21 个函数,零运行时依赖
  • zlib 扩展:新增 22 个函数(gz 文件流 + 增量上下文 API)
  • zip 扩展:新增 5 个函数

📊 数据对比

指标 beta.1 beta.3 变化
测试数量 161 209 +48
内置函数 281+ 345+ +64
跨平台 CI 3 平台 4 平台 +macOS arm64

⚠️ 已知限制

  • array_splice 需要 by-reference 修改支持,AOT 下不支持,测试保留 @skip
  • macOS + TCC:Generator 通过 pthread 线程模拟实现
  • TCC + Windows:使用 ELF 目标格式,与 MinGW COFF .a 库不兼容

📚 详细变更

完整变更记录见 CHANGELOG.md

0.2.0-beta.2

Choose a tag to compare

@KingBes KingBes released this 16 Jul 14:28
5e013fa

Full Changelog: 0.2.0-beta.1...0.2.0-beta.2

修复phpc部分问题。

参加测试的项目:https://github.com/tphp-lang/tphp-raylib
实测Windows/Linux成功,macos未测试