Skip to content

P2 - #9

Merged
KingBes merged 8 commits into
mainfrom
p2
Aug 5, 2026
Merged

P2#9
KingBes merged 8 commits into
mainfrom
p2

Conversation

@KingBes

@KingBes KingBes commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

KingBes added 8 commits August 2, 2026 23:03
- CHANGELOG: [Unreleased] → [0.2.0-beta.9] — 2026-08-02
- CodeGenerator: PHP_EXTRA_VERSION 硬编码 -beta.3 修正为 -beta.9,
  与 TPHP_VERSION(0.2.0-beta.9) 保持一致
Windows 上的 clang -target x86_64-linux-gnu 找不到 glibc 头文件(assert.h),因为 clang 默认只有 MSVC/MinGW 头文件没有 Linux sysroot。修复:1) 支持 TPHP_SYSROOT 环境变量指定 sysroot 路径(如 WSL rootfs);2) 无 sysroot 时 die 并给出 3 种解决方案(WSL+TPHP_SYSROOT / GCC 交叉编译器 / 原生编译),而非继续编译产生含糊的 'file not found' 错误
- tphp.php: 新增 -os android 选项,自动检测 ANDROID_NDK 环境变量,
  设置 -D__ANDROID__ 宏和 NDK sysroot,强制 -shared 生成 libtphp.so;
  默认编译 4 种 ABI(arm64-v8a/x86_64/armeabi-v7a/x86),通过子进程
  递归调用;APK 输出到 cwd/,命名遵循 -o 机制,debug 加 -debug 后缀
- tphp.php: Gradle 构建前临时重命名 SDK source.properties 避免干扰
  AGP 扫描;检测 Java 版本不兼容时自动切换 Java 17/21 LTS;补写
  Android SDK 许可哈希;使用腾讯云 Gradle 镜像和国内 Maven 镜像
- ext/ui/android: 新增 Android 项目模板(Gradle Wrapper + MainActivity +
  AndroidManifest),APK 输出由 tphp.php 复制到 cwd/,模板保持纯净
- ext/ui/src/ui.h: Android 模式下使用 SOKOL_GLES3 + SOKOL_NO_ENTRY,
  sokol_main() 首次调用时执行 tphp_android_main() 填充 desc;
  实现 native_event_cb 钩子拦截 Android 按键事件,映射 AKEYCODE_*
  到 ASCII 值并生成 KEY_DOWN/KEY_UP/CHAR 事件,修复 TextBox 无法输入
- ext/ui/src/ui.h: 实现即时模式形状渲染器(fill_rect/draw_line/
  draw_rect/draw_circle),内置 font8x8 点阵字体跨平台文字渲染;
  Android 触摸事件转换为鼠标事件;stdout/stderr 重定向到 logcat
- ext/ui/src/ui.h: 实现 JNI 软键盘显示/隐藏,修复内存泄漏和线程安全
- ext/ui/src/ui.h: Android GLES 版本设为 3.0(不能用桌面 GL 3.3)
- src/CodeGenerator.php: Android 模式下生成 tphp_android_main() 替代
  main(),不释放 Main 对象避免悬垂指针
- src/Lexer.php + Parser.php: 支持 android 平台前缀识别
- AndroidManifest.xml: 默认竖屏(portrait)
- .gitignore: 排除 .gradle/、*.apk、local.properties
补充 Android 平台在 README/QUICK_START/CHANGELOG/GRAMMAR/CONTRIBUTING/
FUNCTIONS/sokol 等 md 文件的说明(GLES3 后端、JNI 软键盘、按键/触摸适配、
ABI/产物位置、条件编译标识符),并在 test.yml 新增 android-ndk job
验证 NDK 交叉编译链路生成 libtphp.so。
兼容 PHP 原生 new stdClass(),支持字面量属性名的动态属性读写、
isset/unset、foreach 遍历、(object)/(array) 类型转换、get_object_vars()
内置函数。基于 t_array 哈希索引实现 O(1) 属性查找。

AOT 兼容性:仅支持字面量属性名(编译期已知),不支持 $obj->$var
动态属性名(与 $$var 同理)。json_decode 保持返回 array。

运行时(include/object/stdclass.h):
- tphp_class_stdClass 结构体(t_object header + t_array* props)
- 10 个运行时函数:new/get/set/isset/unset/clone/count/from_array/to_array
- isset 语义与 PHP 一致(null 值属性返回 false)

编译器集成(src/):
- TypeChecker/CodeGenerator 预注册 stdClass 类
- visitNew/visitPropertyAccess/visitAssignPropStmt/isset/unset/foreach 特判
- 新增 wrapTVar/emitStdClassForeach 辅助方法
- Parser 支持 (object) cast 识别
- var_dump 输出 object(stdClass)#N (count) { ["k"]=> val ... } 格式

测试覆盖:6 个测试文件(basic/cast/isset_unset/foreach/functions/edge),
TCC/GCC/Clang 三编译器全部通过。

文档更新:CHANGELOG/README/FUNCTIONS/GRAMMAR 添加 stdClass 相关说明。
1. macOS UI 测试编译失败(ext/ui/src/ui.h):
   - shader 源码只有 SOKOL_GLCORE 和 SOKOL_GLES3 两个分支
   - macOS 使用 SOKOL_METAL 后端,两个符号 _sr_vs_src/_sr_fs_src 未声明
   - 添加 SOKOL_METAL 分支提供 MSL(Metal Shading Language)源码
   - Metal 后端需要显式 entry 函数名,通过 _SR_VS_ENTRY/_SR_FS_ENTRY 宏处理

2. 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)才设置
@KingBes
KingBes merged commit f314fde into main Aug 5, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant