Skip to content

feat/openssl encrypt decrypt - #669

Open
nahime0 wants to merge 8 commits into
mainfrom
feat/openssl-encrypt-decrypt
Open

feat/openssl encrypt decrypt#669
nahime0 wants to merge 8 commits into
mainfrom
feat/openssl-encrypt-decrypt

Conversation

@nahime0

@nahime0 nahime0 commented Aug 5, 2026

Copy link
Copy Markdown
Member

Summary

Adds OpenSSL-compatible symmetric encryption on both the AOT and eval() (magician) paths:

  • openssl_encrypt(), openssl_decrypt(), openssl_cipher_iv_length(), openssl_get_cipher_methods()
  • Constants: OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING, OPENSSL_DONT_ZERO_PAD_KEY
  • Pure-Rust, pay-for-use implementation in elephc-crypto (no system OpenSSL / libcrypto)

Cipher matrix

AES-128/192/256 × CBC, CTR, ECB, GCM (exactly what openssl_get_cipher_methods() returns — 12 methods).

Behavior

  • Raw vs Base64 via OPENSSL_RAW_DATA (Base64 handled in PHP glue; bridge is always raw)
  • PHP-compatible key zero-pad/truncate and CBC/CTR IV pad/truncate
  • OPENSSL_ZERO_PADDING / OPENSSL_DONT_ZERO_PAD_KEY
  • GCM: AAD, by-ref $tag on encrypt, by-value tag on decrypt, tag_length 1–16
  • Failures return false (warning text from stock PHP is not yet reproduced)

Architecture

PHP call
  ├─ AOT:  builtin! → RuntimeFnId → __rt_openssl_* → elephc_crypto_*
  └─ eval: eval_builtin! → same elephc_crypto_* ABI

Shared bridge keeps AOT and magician from diverging. Bridge links only when crypto builtins are used.

Docs / example

  • examples/openssl_crypt/ — CBC + GCM round trips
  • User docs in docs/php/strings.md + generated builtin pages
  • CHANGELOG.md under [Unreleased]

Test plan

  • cargo build
  • cargo test -p elephc-crypto (hash vectors + OpenSSL PHP goldens / ABI)
  • cargo test --test codegen_tests openssl (non-AEAD + GCM AOT)
  • cargo test -p elephc-magician openssl
  • cargo test --test builtin_parity_tests
  • Example: cargo run -- examples/openssl_crypt/main.php && ./examples/openssl_crypt/main
  • Builtin docs audit (audit_builtins.py / validate_site_compat.py)
  • CI full matrix (macos-aarch64, linux-aarch64, linux-x86_64)

Notes

  • Implementation plan: .plans/openssl-encrypt-decrypt.md
  • PHP goldens baselined against PHP 8.4 / OpenSSL 3.6 fixtures under crates/elephc-crypto/tests/fixtures/

@github-actions github-actions Bot added area:builtins Touches PHP builtin declarations or emitters. area:magician Touches eval, include execution, or elephc-magician. area:runtime Touches runtime helpers, GC, ownership, or bridge runtimes. scope:multi-area Touches more compiler areas than the automatic area-label cap. size:xl Very large pull request that needs deliberate review planning. type:feature Introduces new user-visible behavior or capabilities. labels Aug 5, 2026
@nahime0
nahime0 requested a review from Guikingone August 5, 2026 18:20
@greptile-apps

greptile-apps Bot commented Aug 5, 2026

Copy link
Copy Markdown

Too many files changed for review (618 files, 100 file limit).

@nahime0
nahime0 marked this pull request as ready for review August 5, 2026 18:22
…decrypt

# Conflicts:
#	CHANGELOG.md
#	Cargo.lock
#	crates/elephc-magician/src/interpreter/builtins/string/mod.rs
#	crates/elephc-magician/src/interpreter/constants.rs
#	docs/internals/builtins/_internal/__elephc_gmmktime_raw.md
#	docs/internals/builtins/_internal/__elephc_hash_ctx_copy.md
#	docs/internals/builtins/_internal/__elephc_hash_ctx_final.md
#	docs/internals/builtins/_internal/__elephc_hash_ctx_init.md
#	docs/internals/builtins/_internal/__elephc_hash_ctx_update.md
#	docs/internals/builtins/_internal/__elephc_mktime_raw.md
#	docs/internals/builtins/_internal/__elephc_phar_bzip2_archive.md
#	docs/internals/builtins/_internal/__elephc_phar_decompress_archive.md
#	docs/internals/builtins/_internal/__elephc_phar_get_file_metadata.md
#	docs/internals/builtins/_internal/__elephc_phar_get_metadata.md
#	docs/internals/builtins/_internal/__elephc_phar_get_signature_hash.md
#	docs/internals/builtins/_internal/__elephc_phar_get_signature_type.md
#	docs/internals/builtins/_internal/__elephc_phar_get_stub.md
#	docs/internals/builtins/_internal/__elephc_phar_gzip_archive.md
#	docs/internals/builtins/_internal/__elephc_phar_list_entries.md
#	docs/internals/builtins/_internal/__elephc_phar_set_compression.md
#	docs/internals/builtins/_internal/__elephc_phar_set_file_metadata.md
#	docs/internals/builtins/_internal/__elephc_phar_set_metadata.md
#	docs/internals/builtins/_internal/__elephc_phar_set_stub.md
#	docs/internals/builtins/_internal/__elephc_phar_set_zip_password.md
#	docs/internals/builtins/_internal/__elephc_phar_sign_hash.md
#	docs/internals/builtins/_internal/__elephc_phar_sign_openssl.md
#	docs/internals/builtins/_internal/__elephc_ptr_is_null.md
#	docs/internals/builtins/_internal/__elephc_ptr_read_string.md
#	docs/internals/builtins/_internal/__elephc_ptr_write_string.md
#	docs/internals/builtins/_internal/__elephc_strtotime_raw.md
#	docs/internals/builtins/array/array_all.md
#	docs/internals/builtins/array/array_any.md
#	docs/internals/builtins/array/array_chunk.md
#	docs/internals/builtins/array/array_column.md
#	docs/internals/builtins/array/array_combine.md
#	docs/internals/builtins/array/array_diff.md
#	docs/internals/builtins/array/array_diff_assoc.md
#	docs/internals/builtins/array/array_diff_key.md
#	docs/internals/builtins/array/array_fill.md
#	docs/internals/builtins/array/array_fill_keys.md
#	docs/internals/builtins/array/array_filter.md
#	docs/internals/builtins/array/array_find.md
#	docs/internals/builtins/array/array_flip.md
#	docs/internals/builtins/array/array_intersect.md
#	docs/internals/builtins/array/array_intersect_assoc.md
#	docs/internals/builtins/array/array_intersect_key.md
#	docs/internals/builtins/array/array_is_list.md
#	docs/internals/builtins/array/array_key_exists.md
#	docs/internals/builtins/array/array_key_first.md
#	docs/internals/builtins/array/array_key_last.md
#	docs/internals/builtins/array/array_keys.md
#	docs/internals/builtins/array/array_map.md
#	docs/internals/builtins/array/array_merge.md
#	docs/internals/builtins/array/array_merge_recursive.md
#	docs/internals/builtins/array/array_multisort.md
#	docs/internals/builtins/array/array_pad.md
#	docs/internals/builtins/array/array_pop.md
#	docs/internals/builtins/array/array_product.md
#	docs/internals/builtins/array/array_push.md
#	docs/internals/builtins/array/array_rand.md
#	docs/internals/builtins/array/array_reduce.md
#	docs/internals/builtins/array/array_replace.md
#	docs/internals/builtins/array/array_replace_recursive.md
#	docs/internals/builtins/array/array_reverse.md
#	docs/internals/builtins/array/array_search.md
#	docs/internals/builtins/array/array_shift.md
#	docs/internals/builtins/array/array_slice.md
#	docs/internals/builtins/array/array_splice.md
#	docs/internals/builtins/array/array_sum.md
#	docs/internals/builtins/array/array_udiff.md
#	docs/internals/builtins/array/array_uintersect.md
#	docs/internals/builtins/array/array_unique.md
#	docs/internals/builtins/array/array_unshift.md
#	docs/internals/builtins/array/array_values.md
#	docs/internals/builtins/array/array_walk.md
#	docs/internals/builtins/array/array_walk_recursive.md
#	docs/internals/builtins/array/arsort.md
#	docs/internals/builtins/array/asort.md
#	docs/internals/builtins/array/call_user_func.md
#	docs/internals/builtins/array/call_user_func_array.md
#	docs/internals/builtins/array/count.md
#	docs/internals/builtins/array/in_array.md
#	docs/internals/builtins/array/krsort.md
#	docs/internals/builtins/array/ksort.md
#	docs/internals/builtins/array/natcasesort.md
#	docs/internals/builtins/array/natsort.md
#	docs/internals/builtins/array/range.md
#	docs/internals/builtins/array/rsort.md
#	docs/internals/builtins/array/shuffle.md
#	docs/internals/builtins/array/sort.md
#	docs/internals/builtins/array/uasort.md
#	docs/internals/builtins/array/uksort.md
#	docs/internals/builtins/array/usort.md
#	docs/internals/builtins/buffer/buffer_free.md
#	docs/internals/builtins/buffer/buffer_len.md
#	docs/internals/builtins/class/class_alias.md
#	docs/internals/builtins/class/class_attribute_args.md
#	docs/internals/builtins/class/class_attribute_names.md
#	docs/internals/builtins/class/class_exists.md
#	docs/internals/builtins/class/class_get_attributes.md
#	docs/internals/builtins/class/class_implements.md
#	docs/internals/builtins/class/class_parents.md
#	docs/internals/builtins/class/class_uses.md
#	docs/internals/builtins/class/enum_exists.md
#	docs/internals/builtins/class/function_exists.md
#	docs/internals/builtins/class/get_class.md
#	docs/internals/builtins/class/get_declared_classes.md
#	docs/internals/builtins/class/get_declared_interfaces.md
#	docs/internals/builtins/class/get_declared_traits.md
#	docs/internals/builtins/class/get_parent_class.md
#	docs/internals/builtins/class/interface_exists.md
#	docs/internals/builtins/class/is_a.md
#	docs/internals/builtins/class/is_subclass_of.md
#	docs/internals/builtins/class/method_exists.md
#	docs/internals/builtins/class/property_exists.md
#	docs/internals/builtins/class/trait_exists.md
#	docs/internals/builtins/date/checkdate.md
#	docs/internals/builtins/date/date.md
#	docs/internals/builtins/date/date_default_timezone_get.md
#	docs/internals/builtins/date/date_default_timezone_set.md
#	docs/internals/builtins/date/getdate.md
#	docs/internals/builtins/date/gmdate.md
#	docs/internals/builtins/date/gmmktime.md
#	docs/internals/builtins/date/hrtime.md
#	docs/internals/builtins/date/localtime.md
#	docs/internals/builtins/date/microtime.md
#	docs/internals/builtins/date/mktime.md
#	docs/internals/builtins/date/strtotime.md
#	docs/internals/builtins/date/time.md
#	docs/internals/builtins/filesystem/basename.md
#	docs/internals/builtins/filesystem/chdir.md
#	docs/internals/builtins/filesystem/chgrp.md
#	docs/internals/builtins/filesystem/chmod.md
#	docs/internals/builtins/filesystem/chown.md
#	docs/internals/builtins/filesystem/clearstatcache.md
#	docs/internals/builtins/filesystem/copy.md
#	docs/internals/builtins/filesystem/dirname.md
#	docs/internals/builtins/filesystem/disk_free_space.md
#	docs/internals/builtins/filesystem/disk_total_space.md
#	docs/internals/builtins/filesystem/file_exists.md
#	docs/internals/builtins/filesystem/fileatime.md
#	docs/internals/builtins/filesystem/filectime.md
#	docs/internals/builtins/filesystem/filegroup.md
#	docs/internals/builtins/filesystem/fileinode.md
#	docs/internals/builtins/filesystem/filemtime.md
#	docs/internals/builtins/filesystem/fileowner.md
#	docs/internals/builtins/filesystem/fileperms.md
#	docs/internals/builtins/filesystem/filesize.md
#	docs/internals/builtins/filesystem/filetype.md
#	docs/internals/builtins/filesystem/fnmatch.md
#	docs/internals/builtins/filesystem/getcwd.md
#	docs/internals/builtins/filesystem/getenv.md
#	docs/internals/builtins/filesystem/glob.md
#	docs/internals/builtins/filesystem/is_dir.md
#	docs/internals/builtins/filesystem/is_executable.md
#	docs/internals/builtins/filesystem/is_file.md
#	docs/internals/builtins/filesystem/is_link.md
#	docs/internals/builtins/filesystem/is_readable.md
#	docs/internals/builtins/filesystem/is_writable.md
#	docs/internals/builtins/filesystem/is_writeable.md
#	docs/internals/builtins/filesystem/lchgrp.md
#	docs/internals/builtins/filesystem/lchown.md
#	docs/internals/builtins/filesystem/link.md
#	docs/internals/builtins/filesystem/linkinfo.md
#	docs/internals/builtins/filesystem/lstat.md
#	docs/internals/builtins/filesystem/mkdir.md
#	docs/internals/builtins/filesystem/pathinfo.md
#	docs/internals/builtins/filesystem/putenv.md
#	docs/internals/builtins/filesystem/readfile.md
#	docs/internals/builtins/filesystem/readlink.md
#	docs/internals/builtins/filesystem/realpath.md
#	docs/internals/builtins/filesystem/realpath_cache_get.md
#	docs/internals/builtins/filesystem/realpath_cache_size.md
#	docs/internals/builtins/filesystem/rename.md
#	docs/internals/builtins/filesystem/rmdir.md
#	docs/internals/builtins/filesystem/scandir.md
#	docs/internals/builtins/filesystem/stat.md
#	docs/internals/builtins/filesystem/symlink.md
#	docs/internals/builtins/filesystem/sys_get_temp_dir.md
#	docs/internals/builtins/filesystem/tempnam.md
#	docs/internals/builtins/filesystem/tmpfile.md
#	docs/internals/builtins/filesystem/touch.md
#	docs/internals/builtins/filesystem/umask.md
#	docs/internals/builtins/filesystem/unlink.md
#	docs/internals/builtins/io/closedir.md
#	docs/internals/builtins/io/fclose.md
#	docs/internals/builtins/io/fdatasync.md
#	docs/internals/builtins/io/feof.md
#	docs/internals/builtins/io/fflush.md
#	docs/internals/builtins/io/fgetc.md
#	docs/internals/builtins/io/fgetcsv.md
#	docs/internals/builtins/io/fgets.md
#	docs/internals/builtins/io/file.md
#	docs/internals/builtins/io/file_get_contents.md
#	docs/internals/builtins/io/file_put_contents.md
#	docs/internals/builtins/io/flock.md
#	docs/internals/builtins/io/fopen.md
#	docs/internals/builtins/io/fpassthru.md
#	docs/internals/builtins/io/fprintf.md
#	docs/internals/builtins/io/fputcsv.md
#	docs/internals/builtins/io/fread.md
#	docs/internals/builtins/io/fscanf.md
#	docs/internals/builtins/io/fseek.md
#	docs/internals/builtins/io/fstat.md
#	docs/internals/builtins/io/fsync.md
#	docs/internals/builtins/io/ftell.md
#	docs/internals/builtins/io/ftruncate.md
#	docs/internals/builtins/io/fwrite.md
#	docs/internals/builtins/io/gethostbyaddr.md
#	docs/internals/builtins/io/gethostbyname.md
#	docs/internals/builtins/io/gethostname.md
#	docs/internals/builtins/io/getprotobyname.md
#	docs/internals/builtins/io/getprotobynumber.md
#	docs/internals/builtins/io/getservbyname.md
#	docs/internals/builtins/io/getservbyport.md
#	docs/internals/builtins/io/hash_file.md
#	docs/internals/builtins/io/ob_clean.md
#	docs/internals/builtins/io/ob_end_clean.md
#	docs/internals/builtins/io/ob_end_flush.md
#	docs/internals/builtins/io/ob_flush.md
#	docs/internals/builtins/io/ob_get_clean.md
#	docs/internals/builtins/io/ob_get_contents.md
#	docs/internals/builtins/io/ob_get_flush.md
#	docs/internals/builtins/io/ob_get_length.md
#	docs/internals/builtins/io/ob_get_level.md
#	docs/internals/builtins/io/ob_get_status.md
#	docs/internals/builtins/io/ob_implicit_flush.md
#	docs/internals/builtins/io/ob_list_handlers.md
#	docs/internals/builtins/io/ob_start.md
#	docs/internals/builtins/io/opendir.md
#	docs/internals/builtins/io/readdir.md
#	docs/internals/builtins/io/rewind.md
#	docs/internals/builtins/io/rewinddir.md
#	docs/internals/builtins/io/stream_bucket_make_writeable.md
#	docs/internals/builtins/io/stream_bucket_new.md
#	docs/internals/builtins/io/stream_context_create.md
#	docs/internals/builtins/io/stream_context_get_default.md
#	docs/internals/builtins/io/stream_context_get_options.md
#	docs/internals/builtins/io/stream_context_get_params.md
#	docs/internals/builtins/io/stream_context_set_default.md
#	docs/internals/builtins/io/stream_context_set_option.md
#	docs/internals/builtins/io/stream_context_set_params.md
#	docs/internals/builtins/io/stream_copy_to_stream.md
#	docs/internals/builtins/io/stream_filter_register.md
#	docs/internals/builtins/io/stream_filter_remove.md
#	docs/internals/builtins/io/stream_get_contents.md
#	docs/internals/builtins/io/stream_get_filters.md
#	docs/internals/builtins/io/stream_get_line.md
#	docs/internals/builtins/io/stream_get_meta_data.md
#	docs/internals/builtins/io/stream_get_transports.md
#	docs/internals/builtins/io/stream_get_wrappers.md
#	docs/internals/builtins/io/stream_is_local.md
#	docs/internals/builtins/io/stream_isatty.md
#	docs/internals/builtins/io/stream_resolve_include_path.md
#	docs/internals/builtins/io/stream_select.md
#	docs/internals/builtins/io/stream_set_blocking.md
#	docs/internals/builtins/io/stream_set_chunk_size.md
#	docs/internals/builtins/io/stream_set_read_buffer.md
#	docs/internals/builtins/io/stream_set_timeout.md
#	docs/internals/builtins/io/stream_set_write_buffer.md
#	docs/internals/builtins/io/stream_socket_accept.md
#	docs/internals/builtins/io/stream_socket_client.md
#	docs/internals/builtins/io/stream_socket_enable_crypto.md
#	docs/internals/builtins/io/stream_socket_get_name.md
#	docs/internals/builtins/io/stream_socket_pair.md
#	docs/internals/builtins/io/stream_socket_recvfrom.md
#	docs/internals/builtins/io/stream_socket_sendto.md
#	docs/internals/builtins/io/stream_socket_server.md
#	docs/internals/builtins/io/stream_socket_shutdown.md
#	docs/internals/builtins/io/stream_supports_lock.md
#	docs/internals/builtins/io/stream_wrapper_register.md
#	docs/internals/builtins/io/stream_wrapper_restore.md
#	docs/internals/builtins/io/stream_wrapper_unregister.md
#	docs/internals/builtins/io/vfprintf.md
#	docs/internals/builtins/json/json_decode.md
#	docs/internals/builtins/json/json_encode.md
#	docs/internals/builtins/json/json_last_error.md
#	docs/internals/builtins/json/json_last_error_msg.md
#	docs/internals/builtins/json/json_validate.md
#	docs/internals/builtins/math/abs.md
#	docs/internals/builtins/math/acos.md
#	docs/internals/builtins/math/asin.md
#	docs/internals/builtins/math/atan.md
#	docs/internals/builtins/math/atan2.md
#	docs/internals/builtins/math/ceil.md
#	docs/internals/builtins/math/clamp.md
#	docs/internals/builtins/math/cos.md
#	docs/internals/builtins/math/cosh.md
#	docs/internals/builtins/math/deg2rad.md
#	docs/internals/builtins/math/exp.md
#	docs/internals/builtins/math/fdiv.md
#	docs/internals/builtins/math/floor.md
#	docs/internals/builtins/math/fmod.md
#	docs/internals/builtins/math/hypot.md
#	docs/internals/builtins/math/intdiv.md
#	docs/internals/builtins/math/is_finite.md
#	docs/internals/builtins/math/is_infinite.md
#	docs/internals/builtins/math/is_nan.md
#	docs/internals/builtins/math/log.md
#	docs/internals/builtins/math/log10.md
#	docs/internals/builtins/math/log2.md
#	docs/internals/builtins/math/max.md
#	docs/internals/builtins/math/min.md
#	docs/internals/builtins/math/mt_rand.md
#	docs/internals/builtins/math/pi.md
#	docs/internals/builtins/math/pow.md
#	docs/internals/builtins/math/rad2deg.md
#	docs/internals/builtins/math/rand.md
#	docs/internals/builtins/math/random_int.md
#	docs/internals/builtins/math/round.md
#	docs/internals/builtins/math/sin.md
#	docs/internals/builtins/math/sinh.md
#	docs/internals/builtins/math/sqrt.md
#	docs/internals/builtins/math/tan.md
#	docs/internals/builtins/math/tanh.md
#	docs/internals/builtins/misc/define.md
#	docs/internals/builtins/misc/defined.md
#	docs/internals/builtins/misc/empty.md
#	docs/internals/builtins/misc/extension_loaded.md
#	docs/internals/builtins/misc/get_loaded_extensions.md
#	docs/internals/builtins/misc/header.md
#	docs/internals/builtins/misc/http_response_code.md
#	docs/internals/builtins/misc/php_uname.md
#	docs/internals/builtins/misc/phpversion.md
#	docs/internals/builtins/misc/print_r.md
#	docs/internals/builtins/misc/serialize.md
#	docs/internals/builtins/misc/unserialize.md
#	docs/internals/builtins/misc/var_dump.md
#	docs/internals/builtins/pointer/ptr.md
#	docs/internals/builtins/pointer/ptr_get.md
#	docs/internals/builtins/pointer/ptr_is_null.md
#	docs/internals/builtins/pointer/ptr_null.md
#	docs/internals/builtins/pointer/ptr_offset.md
#	docs/internals/builtins/pointer/ptr_read16.md
#	docs/internals/builtins/pointer/ptr_read32.md
#	docs/internals/builtins/pointer/ptr_read8.md
#	docs/internals/builtins/pointer/ptr_read_string.md
#	docs/internals/builtins/pointer/ptr_set.md
#	docs/internals/builtins/pointer/ptr_sizeof.md
#	docs/internals/builtins/pointer/ptr_write16.md
#	docs/internals/builtins/pointer/ptr_write32.md
#	docs/internals/builtins/pointer/ptr_write8.md
#	docs/internals/builtins/pointer/ptr_write_string.md
#	docs/internals/builtins/pointer/zval_free.md
#	docs/internals/builtins/pointer/zval_pack.md
#	docs/internals/builtins/pointer/zval_type.md
#	docs/internals/builtins/pointer/zval_unpack.md
#	docs/internals/builtins/process/exec.md
#	docs/internals/builtins/process/passthru.md
#	docs/internals/builtins/process/pclose.md
#	docs/internals/builtins/process/popen.md
#	docs/internals/builtins/process/readline.md
#	docs/internals/builtins/process/shell_exec.md
#	docs/internals/builtins/process/sleep.md
#	docs/internals/builtins/process/system.md
#	docs/internals/builtins/process/usleep.md
#	docs/internals/builtins/regex/mb_ereg_match.md
#	docs/internals/builtins/regex/preg_match.md
#	docs/internals/builtins/regex/preg_match_all.md
#	docs/internals/builtins/regex/preg_replace.md
#	docs/internals/builtins/regex/preg_replace_callback.md
#	docs/internals/builtins/regex/preg_split.md
#	docs/internals/builtins/spl/iterator_apply.md
#	docs/internals/builtins/spl/iterator_count.md
#	docs/internals/builtins/spl/iterator_to_array.md
#	docs/internals/builtins/spl/spl_autoload.md
#	docs/internals/builtins/spl/spl_autoload_call.md
#	docs/internals/builtins/spl/spl_autoload_extensions.md
#	docs/internals/builtins/spl/spl_autoload_functions.md
#	docs/internals/builtins/spl/spl_autoload_register.md
#	docs/internals/builtins/spl/spl_autoload_unregister.md
#	docs/internals/builtins/spl/spl_classes.md
#	docs/internals/builtins/spl/spl_object_hash.md
#	docs/internals/builtins/spl/spl_object_id.md
#	docs/internals/builtins/streams/fsockopen.md
#	docs/internals/builtins/streams/pfsockopen.md
#	docs/internals/builtins/streams/stream_bucket_append.md
#	docs/internals/builtins/streams/stream_bucket_prepend.md
#	docs/internals/builtins/streams/stream_filter_append.md
#	docs/internals/builtins/streams/stream_filter_prepend.md
#	docs/internals/builtins/string/addslashes.md
#	docs/internals/builtins/string/base64_decode.md
#	docs/internals/builtins/string/base64_encode.md
#	docs/internals/builtins/string/bin2hex.md
#	docs/internals/builtins/string/chop.md
#	docs/internals/builtins/string/chr.md
#	docs/internals/builtins/string/crc32.md
#	docs/internals/builtins/string/explode.md
#	docs/internals/builtins/string/grapheme_strrev.md
#	docs/internals/builtins/string/gzcompress.md
#	docs/internals/builtins/string/gzdeflate.md
#	docs/internals/builtins/string/gzinflate.md
#	docs/internals/builtins/string/gzuncompress.md
#	docs/internals/builtins/string/hash.md
#	docs/internals/builtins/string/hash_algos.md
#	docs/internals/builtins/string/hash_equals.md
#	docs/internals/builtins/string/hash_hmac.md
#	docs/internals/builtins/string/hex2bin.md
#	docs/internals/builtins/string/html_entity_decode.md
#	docs/internals/builtins/string/htmlentities.md
#	docs/internals/builtins/string/htmlspecialchars.md
#	docs/internals/builtins/string/implode.md
#	docs/internals/builtins/string/inet_ntop.md
#	docs/internals/builtins/string/inet_pton.md
#	docs/internals/builtins/string/ip2long.md
#	docs/internals/builtins/string/lcfirst.md
#	docs/internals/builtins/string/long2ip.md
#	docs/internals/builtins/string/ltrim.md
#	docs/internals/builtins/string/mb_strlen.md
#	docs/internals/builtins/string/md5.md
#	docs/internals/builtins/string/nl2br.md
#	docs/internals/builtins/string/number_format.md
#	docs/internals/builtins/string/ord.md
#	docs/internals/builtins/string/printf.md
#	docs/internals/builtins/string/rawurldecode.md
#	docs/internals/builtins/string/rawurlencode.md
#	docs/internals/builtins/string/rtrim.md
#	docs/internals/builtins/string/sha1.md
#	docs/internals/builtins/string/sprintf.md
#	docs/internals/builtins/string/sscanf.md
#	docs/internals/builtins/string/str_contains.md
#	docs/internals/builtins/string/str_ends_with.md
#	docs/internals/builtins/string/str_ireplace.md
#	docs/internals/builtins/string/str_pad.md
#	docs/internals/builtins/string/str_repeat.md
#	docs/internals/builtins/string/str_replace.md
#	docs/internals/builtins/string/str_split.md
#	docs/internals/builtins/string/str_starts_with.md
#	docs/internals/builtins/string/strcasecmp.md
#	docs/internals/builtins/string/strcmp.md
#	docs/internals/builtins/string/stripslashes.md
#	docs/internals/builtins/string/strlen.md
#	docs/internals/builtins/string/strpos.md
#	docs/internals/builtins/string/strrev.md
#	docs/internals/builtins/string/strrpos.md
#	docs/internals/builtins/string/strstr.md
#	docs/internals/builtins/string/strtolower.md
#	docs/internals/builtins/string/strtoupper.md
#	docs/internals/builtins/string/substr.md
#	docs/internals/builtins/string/substr_replace.md
#	docs/internals/builtins/string/trim.md
#	docs/internals/builtins/string/ucfirst.md
#	docs/internals/builtins/string/ucwords.md
#	docs/internals/builtins/string/urldecode.md
#	docs/internals/builtins/string/urlencode.md
#	docs/internals/builtins/string/vprintf.md
#	docs/internals/builtins/string/vsprintf.md
#	docs/internals/builtins/string/wordwrap.md
#	docs/internals/builtins/type/boolval.md
#	docs/internals/builtins/type/ctype_alnum.md
#	docs/internals/builtins/type/ctype_alpha.md
#	docs/internals/builtins/type/ctype_digit.md
#	docs/internals/builtins/type/ctype_space.md
#	docs/internals/builtins/type/floatval.md
#	docs/internals/builtins/type/get_resource_id.md
#	docs/internals/builtins/type/get_resource_type.md
#	docs/internals/builtins/type/gettype.md
#	docs/internals/builtins/type/intval.md
#	docs/internals/builtins/type/is_array.md
#	docs/internals/builtins/type/is_bool.md
#	docs/internals/builtins/type/is_callable.md
#	docs/internals/builtins/type/is_double.md
#	docs/internals/builtins/type/is_float.md
#	docs/internals/builtins/type/is_int.md
#	docs/internals/builtins/type/is_integer.md
#	docs/internals/builtins/type/is_iterable.md
#	docs/internals/builtins/type/is_long.md
#	docs/internals/builtins/type/is_null.md
#	docs/internals/builtins/type/is_numeric.md
#	docs/internals/builtins/type/is_object.md
#	docs/internals/builtins/type/is_real.md
#	docs/internals/builtins/type/is_resource.md
#	docs/internals/builtins/type/is_scalar.md
#	docs/internals/builtins/type/is_string.md
#	docs/internals/builtins/type/settype.md
#	docs/internals/builtins/type/strval.md
#	docs/php/builtins/string/printf.md
#	docs/php/builtins/string/rawurldecode.md
#	docs/php/builtins/string/rawurlencode.md
#	docs/php/builtins/string/rtrim.md
#	docs/php/builtins/string/sha1.md
#	docs/php/builtins/string/sprintf.md
#	docs/php/builtins/string/sscanf.md
#	docs/php/builtins/string/str_contains.md
#	docs/php/builtins/string/str_ends_with.md
#	docs/php/builtins/string/str_ireplace.md
#	docs/php/builtins/string/str_pad.md
#	docs/php/builtins/string/str_repeat.md
#	docs/php/builtins/string/str_replace.md
#	docs/php/builtins/string/str_split.md
#	docs/php/builtins/string/str_starts_with.md
#	docs/php/builtins/string/strcasecmp.md
#	docs/php/builtins/string/strcmp.md
#	docs/php/builtins/string/stripslashes.md
#	docs/php/builtins/string/strlen.md
#	docs/php/builtins/string/strpos.md
#	docs/php/builtins/string/strrev.md
#	docs/php/builtins/string/strrpos.md
#	docs/php/builtins/string/strstr.md
#	docs/php/builtins/string/strtolower.md
#	docs/php/builtins/string/strtoupper.md
#	docs/php/builtins/string/substr.md
#	docs/php/builtins/string/substr_replace.md
#	docs/php/builtins/string/trim.md
#	docs/php/builtins/string/ucfirst.md
#	docs/php/builtins/string/ucwords.md
#	docs/php/builtins/string/urldecode.md
#	docs/php/builtins/string/urlencode.md
#	docs/php/builtins/string/vprintf.md
#	docs/php/builtins/string/vsprintf.md
#	docs/php/builtins/string/wordwrap.md
#	docs/php/builtins/type/boolval.md
#	docs/php/builtins/type/ctype_alnum.md
#	docs/php/builtins/type/ctype_alpha.md
#	docs/php/builtins/type/ctype_digit.md
#	docs/php/builtins/type/ctype_space.md
#	docs/php/builtins/type/floatval.md
#	docs/php/builtins/type/get_resource_id.md
#	docs/php/builtins/type/get_resource_type.md
#	docs/php/builtins/type/gettype.md
#	docs/php/builtins/type/intval.md
#	docs/php/builtins/type/is_array.md
#	docs/php/builtins/type/is_bool.md
#	docs/php/builtins/type/is_callable.md
#	docs/php/builtins/type/is_double.md
#	docs/php/builtins/type/is_float.md
#	docs/php/builtins/type/is_int.md
#	docs/php/builtins/type/is_integer.md
#	docs/php/builtins/type/is_iterable.md
#	docs/php/builtins/type/is_long.md
#	docs/php/builtins/type/is_null.md
#	docs/php/builtins/type/is_numeric.md
#	docs/php/builtins/type/is_object.md
#	docs/php/builtins/type/is_real.md
#	docs/php/builtins/type/is_resource.md
#	docs/php/builtins/type/is_scalar.md
#	docs/php/builtins/type/is_string.md
#	docs/php/builtins/type/settype.md
#	docs/php/builtins/type/strval.md
#	docs/php/strings.md
#	scripts/docs/builtin_registry.json
#	src/builtins/string/mod.rs
#	src/codegen/lower_inst/builtins/strings.rs
#	src/ir/runtime_fn.rs
#	src/ir_lower/expr/mod.rs
#	tests/codegen/strings.rs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:builtins Touches PHP builtin declarations or emitters. area:magician Touches eval, include execution, or elephc-magician. area:runtime Touches runtime helpers, GC, ownership, or bridge runtimes. scope:multi-area Touches more compiler areas than the automatic area-label cap. size:xl Very large pull request that needs deliberate review planning. type:feature Introduces new user-visible behavior or capabilities.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant