Skip to content

Stdlib: mb_substr/mb_strpos/mb_strtolower/mb_strtoupper UTF-8 VM (#3239) - #8440

Merged
PurHur merged 1 commit into
masterfrom
agent/issue-3239-mb-substr-pos-case
Jun 13, 2026
Merged

PurHur merged 1 commit into
masterfrom
agent/issue-3239-mb-substr-pos-case

Conversation

@PurHur

@PurHur PurHur commented Jun 13, 2026

Copy link
Copy Markdown
Owner

Summary

  • Register mb_substr(), mb_strpos(), mb_strtolower(), and mb_strtoupper() in ext/mbstring/ (php-src ext/mbstring/mbstring.c).
  • Shared UTF-8 codepoint logic lives in VmMbstring + VmString::utf8CharSubstr() — no new C runtime.
  • VM-only v1 (UTF-8 / ASCII / 8BIT); JIT deferred like other mbstring search helpers.

Closes #3239

php-src reference

  • ext/mbstring/mbstring.cphp_mb_substr, php_mb_strpos, case conversion wrappers

PHP implementation

  • ext/mbstring/mb_substr.php, mb_strpos.php, mb_strtolower.php, mb_strtoupper.php
  • ext/mbstring/VmMbstring.phpsubstr(), strpos(), strtolower(), strtoupper()

Verification

Issue repro:

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php bin/vm.php -r "var_dump(function_exists(\"mb_substr\"));"
php bin/vm.php -r "echo mb_substr(\"café\", 0, 2, \"UTF-8\");"
'

Output:

bool(true)
ca

Repro script + compliance:

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php bin/vm.php test/repro-maintainer/mb_substr_basic.php
./vendor/bin/phpunit --filter mb_substr_utf8 test/compliance/VMTest.php
'

Output:

bool(true)
bool(true)
ca
int(2)
hello
HELLO
OK (1 test, 1 assertion)

Made with Cursor

Register core mbstring helpers in ext/mbstring using VmMbstring/VmString
UTF-8 codepoint paths (php-src ext/mbstring/mbstring.c). Closes gap where
only mb_strlen existed for multibyte string manipulation.

Co-authored-by: Cursor <cursoragent@cursor.com>
@PurHur
PurHur merged commit 1ac2f40 into master Jun 13, 2026
@PurHur
PurHur deleted the agent/issue-3239-mb-substr-pos-case branch June 13, 2026 23:04
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.

Stdlib: mb_substr / mb_strpos / mb_strtolower — mbstring beyond mb_strlen (ext/mbstring parity)

1 participant