From 42fd2ae6c1a6a622afd607dbf10caf981474141e Mon Sep 17 00:00:00 2001 From: PurHur Date: Wed, 2 Sep 2026 05:57:33 +0000 Subject: [PATCH 1/2] Codegen: outline __value__copy once per module (#36193) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace 176 open-coded 15-block copyBetweenPointers expansions with a single lazy-linked __value__copy runtime helper (VmValueCopy SSOT). Verified: aot-smoke 9/9; dev-verify-fast OK; north-star5-verify-fast OK; echo IR lines 117653→91133; ValueBoxCopyOutlineTest 4/4. Co-authored-by: Cursor --- docs/bootstrap-inventory.md | 1474 +++++++++-------- lib/JIT/Builtin/Type/Value.php | 18 + lib/JIT/Builtin/Type/Value.pre | 3 + lib/JIT/Builtin/ValueBoxCopyJit.php | 41 + lib/JIT/Context.php | 4 + lib/JIT/JitValueBox.php | 158 +- lib/VM/VmValueCopy.php | 217 +++ .../.m3_compiler_lib_sidecar.sha | 2 +- .../compiler_lib_spine_smoke/main.php | 2 + test/unit/StringCopyOnWriteAotTest.php | 2 +- test/unit/ValueBoxCopyOutlineTest.php | 61 + 11 files changed, 1120 insertions(+), 862 deletions(-) create mode 100644 lib/JIT/Builtin/ValueBoxCopyJit.php create mode 100644 lib/VM/VmValueCopy.php create mode 100644 test/unit/ValueBoxCopyOutlineTest.php diff --git a/docs/bootstrap-inventory.md b/docs/bootstrap-inventory.md index cffc7c0a02a..dfbd5203cd9 100644 --- a/docs/bootstrap-inventory.md +++ b/docs/bootstrap-inventory.md @@ -8,11 +8,11 @@ Regenerate: `php script/bootstrap-inventory.php` | Metric | Count | |--------|------:| -| PHP files on vm.php path | 8063 | -| Phase A inventory files (M2 ratio SSOT) | 8063 | +| PHP files on vm.php path | 8072 | +| Phase A inventory files (M2 ratio SSOT) | 8072 | | Phase A ratio-deferred paths | 0 | | Source constructs flagged (blockers) | 0 | -| Source constructs flagged (warnings) | 25658 | +| Source constructs flagged (warnings) | 25673 | ## Compiler CFG gaps (`lib/Compiler.php`) @@ -2856,6 +2856,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `ext/standard/GcCollectCyclesNativeFreeJitHelper.php` | 0 | 1 | | `ext/standard/GcCollectCyclesNativeScanJitHelper.php` | 0 | 1 | | `ext/standard/GcCollectCyclesRegistryJitHelper.php` | 0 | 1 | +| `ext/standard/GcCollectCyclesRegistrySyncJitHelper.php` | 0 | 1 | | `ext/standard/GcCollectCyclesStandaloneJitHelper.php` | 0 | 1 | | `ext/standard/GcDestructAllowDelrefJitHelper.php` | 0 | 1 | | `ext/standard/GcDestructShutdownJitHelper.php` | 0 | 1 | @@ -3487,7 +3488,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `ext/standard/MkdirJitHelper.php` | 0 | 1 | | `ext/standard/MktimeJitHelper.php` | 0 | 1 | | `ext/standard/ModfJitHelper.php` | 0 | 1 | -| `ext/standard/Module.php` | 0 | 842 | +| `ext/standard/Module.php` | 0 | 844 | | `ext/standard/ModuleRegistry.php` | 0 | 1 | | `ext/standard/MultisortJitHelper.php` | 0 | 2 | | `ext/standard/NCompareJitHelper.php` | 0 | 1 | @@ -4600,6 +4601,9 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `ext/standard/phpc_clone_with_reinit.php` | 0 | 1 | | `ext/standard/phpc_deploy_path.php` | 0 | 1 | | `ext/standard/phpc_destruct_try_invoke_native.php` | 0 | 1 | +| `ext/standard/phpc_gc_llvm_registry_count.php` | 0 | 1 | +| `ext/standard/phpc_gc_llvm_registry_object_at.php` | 0 | 1 | +| `ext/standard/phpc_gc_llvm_registry_prop_count_at.php` | 0 | 1 | | `ext/standard/phpc_gc_native_child_at.php` | 0 | 1 | | `ext/standard/phpc_gc_native_clear_slot_at.php` | 0 | 1 | | `ext/standard/phpc_gc_native_free_object.php` | 0 | 1 | @@ -5443,6 +5447,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/AOT/AutoloadDiscovery.php` | 0 | 2 | | `lib/AOT/ExternalMethodBind.php` | 0 | 2 | | `lib/AOT/HelperRuntimeCache.php` | 0 | 2 | +| `lib/AOT/HelperRuntimeCommon.php` | 0 | 1 | | `lib/AOT/HelperUnitGlobalCtor.php` | 0 | 1 | | `lib/AOT/Linker.php` | 0 | 1 | | `lib/AOT/LinkerProcessPolyfill.php` | 0 | 1 | @@ -5512,6 +5517,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/Cli/PhpcFcgi.php` | 0 | 1 | | `lib/Cli/PhpcInit.php` | 0 | 1 | | `lib/Cli/PhpcRun.php` | 0 | 1 | +| `lib/Cli/ProcPipeReader.php` | 0 | 1 | | `lib/CloneWithSyntaxRejector.php` | 0 | 3 | | `lib/Compiler.php` | 0 | 515 | | `lib/Compiler/AbstractMethodBodyCheck.php` | 0 | 3 | @@ -6496,6 +6502,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/Builtin/UploadTempJit.php` | 0 | 1 | | `lib/JIT/Builtin/UrlRewriterApplyRuntime.php` | 0 | 1 | | `lib/JIT/Builtin/UsortRuntime.php` | 0 | 1 | +| `lib/JIT/Builtin/ValueBoxCopyJit.php` | 0 | 2 | | `lib/JIT/Builtin/ValueBoxWriteBoolJit.php` | 0 | 2 | | `lib/JIT/Builtin/ValueBoxWriteDoubleJit.php` | 0 | 2 | | `lib/JIT/Builtin/ValueBoxWriteLongJit.php` | 0 | 2 | @@ -6968,7 +6975,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/CoalesceHelper.php` | 0 | 1 | | `lib/JIT/CompileCache.php` | 0 | 1 | | `lib/JIT/CompilerOperandChainNative.php` | 0 | 3 | -| `lib/JIT/Context.php` | 0 | 355 | +| `lib/JIT/Context.php` | 0 | 356 | | `lib/JIT/DatePeriodForeachSnapshot.php` | 0 | 3 | | `lib/JIT/DeprecatedCallGuard.php` | 0 | 1 | | `lib/JIT/DiscardedPureCallElision.php` | 0 | 1 | @@ -7055,7 +7062,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/JitIncDec.php` | 0 | 6 | | `lib/JIT/JitIterableArg.php` | 0 | 2 | | `lib/JIT/JitLongArg.php` | 0 | 1 | -| `lib/JIT/JitLongArithOverflow.php` | 0 | 4 | +| `lib/JIT/JitLongArithOverflow.php` | 0 | 6 | | `lib/JIT/JitLongDiv.php` | 0 | 5 | | `lib/JIT/JitMemoryUsageArg.php` | 0 | 1 | | `lib/JIT/JitNativeString.php` | 0 | 11 | @@ -7202,6 +7209,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/XmlWriterInstanceMethodJit.php` | 0 | 5 | | `lib/JIT/XsltInstanceMethodJit.php` | 0 | 2 | | `lib/JitMcjitEmbed.php` | 0 | 1 | +| `lib/JitVmLoweringPolicy.php` | 0 | 1 | | `lib/LanguageProfileScope.php` | 0 | 2 | | `lib/LazyPropertyRejector.php` | 0 | 2 | | `lib/Lint/Issue.php` | 0 | 2 | @@ -7918,6 +7926,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/VM/VmValueBoxWriteLong.php` | 0 | 1 | | `lib/VM/VmValueBoxWriteNull.php` | 0 | 1 | | `lib/VM/VmValueCompare.php` | 0 | 1 | +| `lib/VM/VmValueCopy.php` | 0 | 1 | | `lib/VM/VmVarFetch.php` | 0 | 1 | | `lib/VM/VmVarFetchJitHelper.php` | 0 | 1 | | `lib/VM/WeakMapInternalIteratorHandler.php` | 0 | 3 | @@ -30883,6 +30892,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 11 class method(s) +### `ext/standard/GcCollectCyclesRegistrySyncJitHelper.php` + +**Warnings** (review for bootstrap subset): +- 1 class method(s) + ### `ext/standard/GcCollectCyclesStandaloneJitHelper.php` **Warnings** (review for bootstrap subset): @@ -34917,296 +34931,298 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new phpc_gc_native_child_at (line 656) - new phpc_gc_native_clear_slot_at (line 657) - new phpc_gc_native_object_refcount (line 658) -- new phpc_gc_native_clear_slot_at (line 659) -- new phpc_gc_native_free_object (line 660) -- new phpc_object_is_constructed_native (line 661) -- new phpc_object_invoke_destructor_native (line 662) -- new phpc_gc_notify_object_freed_native (line 663) -- new phpc_mm_free_native (line 664) -- new phpc_destruct_try_invoke_native (line 665) -- new phpc_object_release_storage_native (line 666) -- new phpc_weakref_null_slot (line 667) -- new phpc_weakref_unset_map_key (line 668) -- new phpc_native_ht_alloc (line 669) -- new phpc_native_ht_set_string_key (line 670) -- new phpc_native_ht_set_string_key_ht (line 671) -- new phpc_native_ht_set_string_at (line 672) -- new phpc_native_ht_set_long_at (line 673) -- new phpc_native_ht_set_null_at (line 674) -- new phpc_native_ht_set_hashtable_at (line 675) -- new phpc_native_ht_set_string_key_long (line 676) -- new phpc_native_ht_set_string_key_double (line 677) -- new phpc_native_ht_set_string_key_bool (line 678) -- new phpc_native_ht_set_string_key_null (line 679) -- new phpc_native_ht_set_double_at (line 680) -- new phpc_native_ht_set_bool_at (line 681) -- new phpc_ob_write_stdout_kernel (line 682) -- new phpc_url_rewriter_apply_kernel (line 683) -- new phpc_rewrite_vars_set_tags_kernel (line 684) -- new phpc_libcrypt_verify (line 685) -- new phpc_argon2_hash (line 686) -- new phpc_argon2_verify (line 687) -- new phpc_stat_mode_kernel (line 688) -- new phpc_access_kernel (line 689) -- new sys_get_temp_dir (line 691) -- new sys_getloadavg (line 692) -- new openlog (line 693) -- new syslog (line 694) -- new closelog (line 695) -- new tempnam (line 696) -- new tmpfile (line 697) -- new getcwd_ (line 698) -- new get_include_path (line 699) -- new set_include_path (line 700) -- new stream_resolve_include_path (line 701) -- new gethostname (line 702) -- new net_get_interfaces (line 703) -- new gethostbynamel (line 704) -- new gethostbyname (line 705) -- new gethostbyaddr (line 706) -- new checkdnsrr (line 707) -- new checkdnsrr (line 708) -- new dns_get_mx (line 709) -- new dns_get_record (line 710) -- new getmxrr (line 711) -- new long2ip (line 712) -- new ip2long (line 713) -- new inet_ntop (line 714) -- new inet_pton (line 715) -- new getprotobyname (line 716) -- new getprotobynumber (line 717) -- new getservbyname (line 718) -- new getservbyport (line 719) -- new chdir_ (line 720) -- new chroot_ (line 721) -- new putenv_ (line 722) -- new ini_set_ (line 723) -- new ini_set_ (line 724) -- new ini_get_ (line 725) -- new ini_get_all (line 726) -- new ini_restore (line 727) -- new ini_parse_quantity (line 728) -- new parse_ini_string (line 729) -- new parse_ini_file (line 730) -- new error_reporting (line 731) -- new error_log (line 732) -- new define_ (line 733) -- new defined_ (line 734) -- new constant_ (line 735) -- new class_constants_ (line 736) -- new get_defined_constants_ (line 737) -- new get_defined_vars_ (line 738) -- new get_declared_interfaces_ (line 740) -- new get_declared_classes_ (line 741) -- new get_declared_traits_ (line 742) -- new get_declared_attributes_ (line 744) -- new get_defined_functions_ (line 746) -- new get_included_files_ (line 747) -- new get_included_files_ (line 748) -- new debug_backtrace (line 749) -- new debug_print_backtrace (line 750) -- new class_exists_ (line 752) -- new class_alias (line 753) -- new create_lazy_ghost (line 756) -- new create_lazy_proxy (line 757) -- new class_has_lazy_object_initializer (line 761) -- new class_has_lazy_object_uninitializer (line 762) -- new enum_exists_ (line 764) -- new unitenum_exists_ (line 765) -- new interface_exists_ (line 766) -- new trait_exists_ (line 767) -- new class_uses_ (line 768) -- new class_uses_recursive (line 769) -- new class_implements_ (line 770) -- new class_parents_ (line 771) -- new function_exists (line 772) -- new is_callable (line 773) -- new call_user_func (line 774) -- new call_user_func_array (line 775) -- new func_get_arg (line 776) -- new func_get_args (line 777) -- new func_num_args (line 778) -- new method_exists_ (line 779) -- new class_meth_exists_ (line 780) -- new class_has_method_ (line 782) -- new class_has_property_ (line 783) -- new class_has_constant_ (line 784) -- new property_exists_ (line 786) -- new attribute_exists_ (line 787) -- new get_object_vars_ (line 788) -- new get_mangled_object_vars_ (line 789) -- new get_object_id (line 790) -- new spl_object_id (line 791) -- new spl_object_hash (line 792) -- new get_class_ (line 793) -- new get_called_class_ (line 794) -- new get_class_vars_ (line 795) -- new get_class_methods_ (line 796) -- new get_parent_class_ (line 797) -- new is_a_ (line 798) -- new is_subclass_of_ (line 799) -- new assert_ (line 800) -- new assert_options (line 801) -- new trigger_error_ (line 802) -- new user_error (line 803) -- new compiler_language_warning_ (line 804) -- new set_error_handler_ (line 805) -- new restore_error_handler_ (line 806) -- new get_error_handler_ (line 808) -- new set_exception_handler (line 810) -- new restore_exception_handler (line 811) -- new get_exception_handler (line 813) -- new error_get_last (line 815) -- new error_clear_last (line 816) -- new exif_tagname (line 817) -- new eval_ (line 818) -- new phpc_deploy_path (line 819) -- new compiler_is_superglobal_name (line 820) -- new __compiler_libcrypt (line 821) -- new __compiler_password_random_bytes (line 822) -- new phpc_match_unhandled_operand_is_object (line 823) -- new phpc_match_unhandled_operand_message (line 824) -- new phpc_match_unhandled_format_scalar (line 825) -- new phpc_clone_with_begin (line 826) -- new phpc_clone_with_end (line 827) -- new phpc_clone_with_reinit (line 828) -- new extract_ (line 829) -- new compact_ (line 830) -- new scandir (line 831) -- new opendir (line 832) -- new dir_ (line 833) -- new readdir (line 834) -- new closedir (line 835) -- new rewinddir (line 836) -- new glob_ (line 837) -- new gzcompress (line 838) -- new gzdecode (line 839) -- new gzdeflate (line 840) -- new gzencode (line 841) -- new gzinflate (line 842) -- new gzuncompress (line 843) -- new gzopen (line 844) -- new gzwrite (line 845) -- new gzputs (line 846) -- new gzread (line 847) -- new gzgetc (line 848) -- new gzgets (line 849) -- new gzseek (line 850) -- new gztell (line 851) -- new gzrewind (line 852) -- new gzeof (line 853) -- new gzclose (line 854) -- new readgzfile (line 855) -- new gzfile (line 856) -- new gzpassthru (line 857) -- new zlib_encode (line 858) -- new zlib_decode (line 859) -- new deflate_init (line 860) -- new deflate_add (line 861) -- new inflate_init (line 862) -- new inflate_add (line 863) -- new inflate_get_status (line 864) -- new inflate_get_read_len (line 865) -- new zlib_get_coding_type (line 866) -- new fnmatch (line 867) -- new time (line 868) -- new getmypid (line 869) -- new getmyuid (line 870) -- new getmygid (line 871) -- new get_current_user (line 872) -- new get_cfg_var (line 873) -- new php_ini_loaded_file (line 874) -- new php_ini_scanned_files (line 875) -- new zend_thread_id (line 876) -- new getmygrgid (line 877) -- new getmyinode (line 878) -- new getlastmod (line 879) -- new getrusage (line 880) -- new cli_get_process_title (line 881) -- new cli_set_process_title (line 882) -- new proc_nice (line 883) -- new memory_get_peak_usage (line 884) -- new memory_get_usage (line 885) -- new memory_reset_peak_usage (line 886) -- new microtime (line 887) -- new gettimeofday (line 888) -- new hrtime (line 889) -- new clock_gettime (line 890) -- new phpversion (line 891) -- new php_sapi_name (line 892) -- new getopt (line 893) -- new php_uname (line 894) -- new phpinfo (line 895) -- new phpcredits (line 896) -- new zend_version (line 897) -- new version_compare (line 898) -- new extension_loaded (line 899) -- new get_loaded_extensions (line 900) -- new get_extension_funcs (line 901) -- new date (line 902) -- new timezone_version_get (line 903) -- new timezone_identifiers_list (line 904) -- new timezone_abbreviations_list (line 905) -- new timezone_name_from_abbr (line 906) -- new timezone_open (line 907) -- new timezone_name_get (line 908) -- new timezone_offset_get (line 909) -- new date_offset_get (line 910) -- new date_format (line 911) -- new date_timestamp_get (line 912) -- new date_timestamp_set (line 913) -- new date_date_set (line 914) -- new date_isodate_set (line 915) -- new date_time_set (line 916) -- new date_timezone_get (line 917) -- new date_timezone_set (line 918) -- new date_get_last_errors (line 919) -- new timezone_location_get (line 920) -- new timezone_transitions_get (line 921) -- new gmdate (line 922) -- new strftime (line 923) -- new gmstrftime (line 924) -- new strptime (line 925) -- new getdate (line 926) -- new gmmktime (line 927) -- new mktime (line 928) -- new strtotime (line 929) -- new checkdate (line 930) -- new date_default_timezone_get (line 931) -- new date_default_timezone_set (line 932) -- new localtime (line 933) -- new localeconv (line 934) -- new idate (line 935) -- new date_sun_info (line 936) -- new date_interval_format (line 937) -- new date_interval_create_from_date_string (line 938) -- new date_create (line 939) -- new date_create_immutable (line 940) -- new date_create_from_format (line 941) -- new date_create_immutable_from_format (line 942) -- new date_parse (line 943) -- new date_parse_from_format (line 944) -- new date_add (line 945) -- new date_sub (line 946) -- new date_modify (line 947) -- new date_diff (line 948) -- new date_sunrise (line 949) -- new date_sunset (line 950) -- new sleep (line 951) -- new set_time_limit (line 952) -- new setlocale (line 953) -- new nl_langinfo (line 954) -- new ignore_user_abort (line 955) -- new connection_aborted (line 956) -- new spl_autoload (line 957) -- new spl_autoload_extensions (line 958) -- new spl_autoload_functions (line 959) -- new spl_autoload_register (line 960) -- new spl_autoload_unregister (line 961) -- new spl_autoload_call (line 962) -- new time_nanosleep (line 963) -- new time_sleep_until (line 964) -- new usleep (line 965) +- new phpc_gc_llvm_registry_count (line 659) +- new phpc_gc_llvm_registry_object_at (line 660) +- new phpc_gc_llvm_registry_prop_count_at (line 661) +- new phpc_gc_native_free_object (line 662) +- new phpc_object_is_constructed_native (line 663) +- new phpc_object_invoke_destructor_native (line 664) +- new phpc_gc_notify_object_freed_native (line 665) +- new phpc_mm_free_native (line 666) +- new phpc_destruct_try_invoke_native (line 667) +- new phpc_object_release_storage_native (line 668) +- new phpc_weakref_null_slot (line 669) +- new phpc_weakref_unset_map_key (line 670) +- new phpc_native_ht_alloc (line 671) +- new phpc_native_ht_set_string_key (line 672) +- new phpc_native_ht_set_string_key_ht (line 673) +- new phpc_native_ht_set_string_at (line 674) +- new phpc_native_ht_set_long_at (line 675) +- new phpc_native_ht_set_null_at (line 676) +- new phpc_native_ht_set_hashtable_at (line 677) +- new phpc_native_ht_set_string_key_long (line 678) +- new phpc_native_ht_set_string_key_double (line 679) +- new phpc_native_ht_set_string_key_bool (line 680) +- new phpc_native_ht_set_string_key_null (line 681) +- new phpc_native_ht_set_double_at (line 682) +- new phpc_native_ht_set_bool_at (line 683) +- new phpc_ob_write_stdout_kernel (line 684) +- new phpc_url_rewriter_apply_kernel (line 685) +- new phpc_rewrite_vars_set_tags_kernel (line 686) +- new phpc_libcrypt_verify (line 687) +- new phpc_argon2_hash (line 688) +- new phpc_argon2_verify (line 689) +- new phpc_stat_mode_kernel (line 690) +- new phpc_access_kernel (line 691) +- new sys_get_temp_dir (line 693) +- new sys_getloadavg (line 694) +- new openlog (line 695) +- new syslog (line 696) +- new closelog (line 697) +- new tempnam (line 698) +- new tmpfile (line 699) +- new getcwd_ (line 700) +- new get_include_path (line 701) +- new set_include_path (line 702) +- new stream_resolve_include_path (line 703) +- new gethostname (line 704) +- new net_get_interfaces (line 705) +- new gethostbynamel (line 706) +- new gethostbyname (line 707) +- new gethostbyaddr (line 708) +- new checkdnsrr (line 709) +- new checkdnsrr (line 710) +- new dns_get_mx (line 711) +- new dns_get_record (line 712) +- new getmxrr (line 713) +- new long2ip (line 714) +- new ip2long (line 715) +- new inet_ntop (line 716) +- new inet_pton (line 717) +- new getprotobyname (line 718) +- new getprotobynumber (line 719) +- new getservbyname (line 720) +- new getservbyport (line 721) +- new chdir_ (line 722) +- new chroot_ (line 723) +- new putenv_ (line 724) +- new ini_set_ (line 725) +- new ini_set_ (line 726) +- new ini_get_ (line 727) +- new ini_get_all (line 728) +- new ini_restore (line 729) +- new ini_parse_quantity (line 730) +- new parse_ini_string (line 731) +- new parse_ini_file (line 732) +- new error_reporting (line 733) +- new error_log (line 734) +- new define_ (line 735) +- new defined_ (line 736) +- new constant_ (line 737) +- new class_constants_ (line 738) +- new get_defined_constants_ (line 739) +- new get_defined_vars_ (line 740) +- new get_declared_interfaces_ (line 742) +- new get_declared_classes_ (line 743) +- new get_declared_traits_ (line 744) +- new get_declared_attributes_ (line 746) +- new get_defined_functions_ (line 748) +- new get_included_files_ (line 749) +- new get_included_files_ (line 750) +- new debug_backtrace (line 751) +- new debug_print_backtrace (line 752) +- new class_exists_ (line 754) +- new class_alias (line 755) +- new create_lazy_ghost (line 758) +- new create_lazy_proxy (line 759) +- new class_has_lazy_object_initializer (line 763) +- new class_has_lazy_object_uninitializer (line 764) +- new enum_exists_ (line 766) +- new unitenum_exists_ (line 767) +- new interface_exists_ (line 768) +- new trait_exists_ (line 769) +- new class_uses_ (line 770) +- new class_uses_recursive (line 771) +- new class_implements_ (line 772) +- new class_parents_ (line 773) +- new function_exists (line 774) +- new is_callable (line 775) +- new call_user_func (line 776) +- new call_user_func_array (line 777) +- new func_get_arg (line 778) +- new func_get_args (line 779) +- new func_num_args (line 780) +- new method_exists_ (line 781) +- new class_meth_exists_ (line 782) +- new class_has_method_ (line 784) +- new class_has_property_ (line 785) +- new class_has_constant_ (line 786) +- new property_exists_ (line 788) +- new attribute_exists_ (line 789) +- new get_object_vars_ (line 790) +- new get_mangled_object_vars_ (line 791) +- new get_object_id (line 792) +- new spl_object_id (line 793) +- new spl_object_hash (line 794) +- new get_class_ (line 795) +- new get_called_class_ (line 796) +- new get_class_vars_ (line 797) +- new get_class_methods_ (line 798) +- new get_parent_class_ (line 799) +- new is_a_ (line 800) +- new is_subclass_of_ (line 801) +- new assert_ (line 802) +- new assert_options (line 803) +- new trigger_error_ (line 804) +- new user_error (line 805) +- new compiler_language_warning_ (line 806) +- new set_error_handler_ (line 807) +- new restore_error_handler_ (line 808) +- new get_error_handler_ (line 810) +- new set_exception_handler (line 812) +- new restore_exception_handler (line 813) +- new get_exception_handler (line 815) +- new error_get_last (line 817) +- new error_clear_last (line 818) +- new exif_tagname (line 819) +- new eval_ (line 820) +- new phpc_deploy_path (line 821) +- new compiler_is_superglobal_name (line 822) +- new __compiler_libcrypt (line 823) +- new __compiler_password_random_bytes (line 824) +- new phpc_match_unhandled_operand_is_object (line 825) +- new phpc_match_unhandled_operand_message (line 826) +- new phpc_match_unhandled_format_scalar (line 827) +- new phpc_clone_with_begin (line 828) +- new phpc_clone_with_end (line 829) +- new phpc_clone_with_reinit (line 830) +- new extract_ (line 831) +- new compact_ (line 832) +- new scandir (line 833) +- new opendir (line 834) +- new dir_ (line 835) +- new readdir (line 836) +- new closedir (line 837) +- new rewinddir (line 838) +- new glob_ (line 839) +- new gzcompress (line 840) +- new gzdecode (line 841) +- new gzdeflate (line 842) +- new gzencode (line 843) +- new gzinflate (line 844) +- new gzuncompress (line 845) +- new gzopen (line 846) +- new gzwrite (line 847) +- new gzputs (line 848) +- new gzread (line 849) +- new gzgetc (line 850) +- new gzgets (line 851) +- new gzseek (line 852) +- new gztell (line 853) +- new gzrewind (line 854) +- new gzeof (line 855) +- new gzclose (line 856) +- new readgzfile (line 857) +- new gzfile (line 858) +- new gzpassthru (line 859) +- new zlib_encode (line 860) +- new zlib_decode (line 861) +- new deflate_init (line 862) +- new deflate_add (line 863) +- new inflate_init (line 864) +- new inflate_add (line 865) +- new inflate_get_status (line 866) +- new inflate_get_read_len (line 867) +- new zlib_get_coding_type (line 868) +- new fnmatch (line 869) +- new time (line 870) +- new getmypid (line 871) +- new getmyuid (line 872) +- new getmygid (line 873) +- new get_current_user (line 874) +- new get_cfg_var (line 875) +- new php_ini_loaded_file (line 876) +- new php_ini_scanned_files (line 877) +- new zend_thread_id (line 878) +- new getmygrgid (line 879) +- new getmyinode (line 880) +- new getlastmod (line 881) +- new getrusage (line 882) +- new cli_get_process_title (line 883) +- new cli_set_process_title (line 884) +- new proc_nice (line 885) +- new memory_get_peak_usage (line 886) +- new memory_get_usage (line 887) +- new memory_reset_peak_usage (line 888) +- new microtime (line 889) +- new gettimeofday (line 890) +- new hrtime (line 891) +- new clock_gettime (line 892) +- new phpversion (line 893) +- new php_sapi_name (line 894) +- new getopt (line 895) +- new php_uname (line 896) +- new phpinfo (line 897) +- new phpcredits (line 898) +- new zend_version (line 899) +- new version_compare (line 900) +- new extension_loaded (line 901) +- new get_loaded_extensions (line 902) +- new get_extension_funcs (line 903) +- new date (line 904) +- new timezone_version_get (line 905) +- new timezone_identifiers_list (line 906) +- new timezone_abbreviations_list (line 907) +- new timezone_name_from_abbr (line 908) +- new timezone_open (line 909) +- new timezone_name_get (line 910) +- new timezone_offset_get (line 911) +- new date_offset_get (line 912) +- new date_format (line 913) +- new date_timestamp_get (line 914) +- new date_timestamp_set (line 915) +- new date_date_set (line 916) +- new date_isodate_set (line 917) +- new date_time_set (line 918) +- new date_timezone_get (line 919) +- new date_timezone_set (line 920) +- new date_get_last_errors (line 921) +- new timezone_location_get (line 922) +- new timezone_transitions_get (line 923) +- new gmdate (line 924) +- new strftime (line 925) +- new gmstrftime (line 926) +- new strptime (line 927) +- new getdate (line 928) +- new gmmktime (line 929) +- new mktime (line 930) +- new strtotime (line 931) +- new checkdate (line 932) +- new date_default_timezone_get (line 933) +- new date_default_timezone_set (line 934) +- new localtime (line 935) +- new localeconv (line 936) +- new idate (line 937) +- new date_sun_info (line 938) +- new date_interval_format (line 939) +- new date_interval_create_from_date_string (line 940) +- new date_create (line 941) +- new date_create_immutable (line 942) +- new date_create_from_format (line 943) +- new date_create_immutable_from_format (line 944) +- new date_parse (line 945) +- new date_parse_from_format (line 946) +- new date_add (line 947) +- new date_sub (line 948) +- new date_modify (line 949) +- new date_diff (line 950) +- new date_sunrise (line 951) +- new date_sunset (line 952) +- new sleep (line 953) +- new set_time_limit (line 954) +- new setlocale (line 955) +- new nl_langinfo (line 956) +- new ignore_user_abort (line 957) +- new connection_aborted (line 958) +- new spl_autoload (line 959) +- new spl_autoload_extensions (line 960) +- new spl_autoload_functions (line 961) +- new spl_autoload_register (line 962) +- new spl_autoload_unregister (line 963) +- new spl_autoload_call (line 964) +- new time_nanosleep (line 965) +- new time_sleep_until (line 966) +- new usleep (line 967) - 6 class method(s) - 1 closure(s) @@ -42288,6 +42304,21 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 2 class method(s) +### `ext/standard/phpc_gc_llvm_registry_count.php` + +**Warnings** (review for bootstrap subset): +- 2 class method(s) + +### `ext/standard/phpc_gc_llvm_registry_object_at.php` + +**Warnings** (review for bootstrap subset): +- 2 class method(s) + +### `ext/standard/phpc_gc_llvm_registry_prop_count_at.php` + +**Warnings** (review for bootstrap subset): +- 2 class method(s) + ### `ext/standard/phpc_gc_native_child_at.php` **Warnings** (review for bootstrap subset): @@ -48118,6 +48149,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - 46 class method(s) - 3 closure(s) +### `lib/AOT/HelperRuntimeCommon.php` + +**Warnings** (review for bootstrap subset): +- 10 class method(s) + ### `lib/AOT/HelperUnitGlobalCtor.php` **Warnings** (review for bootstrap subset): @@ -48430,24 +48466,24 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/Block.php` **Warnings** (review for bootstrap subset): -- new Block (line 621) -- new Variable (line 996) -- new Variable (line 1640) -- new Variable (line 1646) -- new Variable (line 1721) -- new Variable (line 1728) -- new Variable (line 1752) -- new Variable (line 1803) -- new Variable (line 1813) -- new Variable (line 1817) -- new Variable (line 1821) -- new Variable (line 1861) -- new Variable (line 1868) -- new Frame (line 1879) -- new Variable (line 1980) -- new Variable (line 2006) -- new Variable (line 2046) -- 138 class method(s) +- new Block (line 629) +- new Variable (line 1004) +- new Variable (line 1660) +- new Variable (line 1666) +- new Variable (line 1741) +- new Variable (line 1748) +- new Variable (line 1772) +- new Variable (line 1823) +- new Variable (line 1833) +- new Variable (line 1837) +- new Variable (line 1841) +- new Variable (line 1881) +- new Variable (line 1888) +- new Frame (line 1899) +- new Variable (line 2000) +- new Variable (line 2026) +- new Variable (line 2066) +- 140 class method(s) ### `lib/BuiltinByRefParams.php` @@ -48529,8 +48565,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/Cli/PhpcBuild.php` **Warnings** (review for bootstrap subset): -- new Linter (line 97) -- new Linter (line 241) +- new Linter (line 96) +- new Linter (line 240) - 26 class method(s) ### `lib/Cli/PhpcFcgi.php` @@ -48548,6 +48584,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 10 class method(s) +### `lib/Cli/ProcPipeReader.php` + +**Warnings** (review for bootstrap subset): +- 1 class method(s) + ### `lib/CloneWithSyntaxRejector.php` **Warnings** (review for bootstrap subset): @@ -49937,7 +49978,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new Variable (line 32480) - new Variable (line 32539) - new Variable (line 32758) -- new Variable (line 34196) +- new Variable (line 34198) - 599 class method(s) - 26 closure(s) @@ -51132,12 +51173,12 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/Builtin/GcCollectCyclesNativeOpsJit.php` **Warnings** (review for bootstrap subset): -- 14 class method(s) +- 17 class method(s) ### `lib/JIT/Builtin/GcCollectCyclesRuntime.php` **Warnings** (review for bootstrap subset): -- 69 class method(s) +- 72 class method(s) ### `lib/JIT/Builtin/GcStatusRuntime.php` @@ -54714,9 +54755,9 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/Builtin/Type/Value.php` **Warnings** (review for bootstrap subset): -- new StdClass (line 339) -- new StdClass (line 892) -- new StdClass (line 1549) +- new StdClass (line 357) +- new StdClass (line 910) +- new StdClass (line 1567) - 9 class method(s) ### `lib/JIT/Builtin/TypeErrorRaise.php` @@ -54781,6 +54822,12 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 12 class method(s) +### `lib/JIT/Builtin/ValueBoxCopyJit.php` + +**Warnings** (review for bootstrap subset): +- 2 class method(s) +- 1 closure(s) + ### `lib/JIT/Builtin/ValueBoxWriteBoolJit.php` **Warnings** (review for bootstrap subset): @@ -57367,350 +57414,351 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag - new Builtin\VarArg (line 1032) - new Builtin\ErrorHandler (line 1033) - new Scope (line 1059) -- new Call\ExternalMethod (line 1114) -- new Call\DomXmlDocumentCreateFromString (line 1198) -- new Call\DomHtmlDocumentCreateFromString (line 1199) -- new Call\DomXmlDocumentCreateFromFile (line 1200) -- new Call\DomHtmlDocumentCreateFromFile (line 1201) -- new Builtin\IsNullFn (line 1705) -- new Builtin\IsNullFn (line 1706) -- new Call\SplObjectStorageMethod (line 1707) -- new Call\SplObjectStorageMethod (line 1708) -- new Call\SplObjectStorageMethod (line 1709) -- new Call\SplObjectStorageMethod (line 1710) -- new Call\SplObjectStorageMethod (line 1711) -- new Call\SplObjectStorageMethod (line 1712) -- new Call\SplObjectStorageMethod (line 1714) -- new Call\SplObjectStorageMethod (line 1715) -- new Call\SplObjectStorageMethod (line 1717) -- new Call\SplObjectStorageMethod (line 1718) -- new Call\SplObjectStorageMethod (line 1719) -- new Call\SplObjectStorageMethod (line 1721) -- new Call\SplObjectStorageMethod (line 1722) -- new Call\SplObjectStorageMethod (line 1723) -- new Call\SplObjectStorageMethod (line 1724) -- new Call\SplObjectStorageMethod (line 1725) -- new Call\SplObjectStorageMethod (line 1726) -- new Call\SplObjectStorageMethod (line 1727) -- new Call\SplObjectStorageMethod (line 1729) -- new Call\SplObjectStorageMethod (line 1731) -- new Call\SplObjectStorageMethod (line 1732) -- new Call\ArrayIteratorConstruct (line 1737) -- new Call\ArrayIteratorConstruct (line 1738) -- new Call\ArrayIteratorMethod (line 1764) -- new Call\ArrayIteratorMethod (line 1768) -- new Call\ArrayIteratorConstruct (line 1775) -- new Call\ArrayObjectMethod (line 1802) -- new Call\RecursiveIteratorIteratorConstruct (line 1805) -- new Call\RecursiveIteratorIteratorArgcMethod (line 1807) -- new Call\RecursiveIteratorIteratorArgcMethod (line 1808) -- new Call\RecursiveIteratorIteratorArgcMethod (line 1809) -- new Call\LimitIteratorConstruct (line 1815) -- new Call\LimitIteratorMethod (line 1816) -- new Call\LimitIteratorMethod (line 1817) -- new Call\AppendIteratorMethod (line 1818) -- new Call\AppendIteratorMethod (line 1819) -- new Call\RegexIteratorConstruct (line 1820) -- new Call\CallbackFilterIteratorConstruct (line 1821) -- new Call\CachingIteratorConstruct (line 1823) -- new Call\CachingIteratorGetCache (line 1824) -- new Call\CachingIteratorMethod (line 1826) -- new Call\SplHtPosIteratorMethod (line 1834) -- new Call\SplHtPosIteratorMethod (line 1840) -- new Call\EmptyIteratorMethod (line 1852) -- new Call\FilterIteratorMethod (line 1861) -- new Call\ParentIteratorConstruct (line 1869) -- new Call\ParentIteratorArgcMethod (line 1871) -- new Call\ParentIteratorArgcMethod (line 1875) -- new Call\MultipleIteratorMethod (line 1879) -- new Call\MultipleIteratorMethod (line 1880) -- new Call\RecursiveTreeIteratorConstruct (line 1881) -- new Call\DirectoryMethod (line 1885) -- new Call\DirectoryIteratorMethod (line 1912) -- new Call\DirectoryIteratorMethod (line 1927) -- new Call\SplFileObjectMethod (line 1947) -- new Call\DirectoryIteratorMethod (line 1959) -- new Call\SplFileObjectMethod (line 1974) -- new Call\DirectoryIteratorMethod (line 1987) -- new Call\GlobIteratorMethod (line 1999) -- new Call\SplHeapMethod (line 2013) -- new Call\SplPriorityQueueMethod (line 2024) -- new Call\SplDllistMethod (line 2050) -- new Call\SplFixedArrayMethod (line 2064) -- new Call\WeakReferenceCreate (line 2067) -- new Call\WeakReferenceGet (line 2068) -- new Call\SensitiveParameterValueConstruct (line 2069) -- new Call\SensitiveParameterValueGetValue (line 2070) -- new Call\WeakMapMethod (line 2071) -- new Call\WeakMapMethod (line 2072) -- new Call\WeakMapMethod (line 2073) -- new Call\WeakMapMethod (line 2074) -- new Call\WeakMapMethod (line 2075) -- new Call\PhpTokenConstruct (line 2078) -- new Call\PhpTokenTokenize (line 2079) -- new Call\PhpTokenGetTokenName (line 2080) -- new Call\BcMathNumberConstruct (line 2083) -- new Call\BcMathNumberToString (line 2084) -- new Call\BcMathNumberMethod (line 2087) -- new Call\ReflectionClassConstruct (line 2091) -- new Call\ReflectionObjectConstruct (line 2092) -- new Call\ReflectionClassGetName (line 2093) -- new Call\ReflectionObjectGetName (line 2095) -- new Call\ReflectionClassGetShortName (line 2096) -- new Call\ReflectionClassGetNamespaceName (line 2097) -- new Call\ReflectionClassInNamespace (line 2098) -- new Call\ReflectionClassGetAttributes (line 2099) -- new Call\ReflectionClassGetMethod (line 2101) -- new Call\ReflectionClassGetConstructor (line 2103) -- new Call\ReflectionClassGetProperty (line 2104) -- new Call\ReflectionClassGetReflectionConstant (line 2105) -- new Call\ReflectionClassHasMember (line 2107) -- new Call\ReflectionClassHasMember (line 2108) -- new Call\ReflectionClassHasMember (line 2109) -- new Call\ReflectionClassGetConstant (line 2111) -- new Call\ReflectionClassGetConstants (line 2113) -- new Call\ReflectionClassGetReflectionConstants (line 2115) -- new Call\ReflectionClassGetFileName (line 2117) -- new Call\ReflectionClassSourceLocationQuery (line 2120) -- new Call\ReflectionClassSourceLocationQuery (line 2121) -- new Call\ReflectionClassSourceLocationQuery (line 2122) -- new Call\ReflectionClassNameListQuery (line 2124) -- new Call\ReflectionClassNameListQuery (line 2125) -- new Call\ReflectionClassClassMapQuery (line 2127) -- new Call\ReflectionClassClassMapQuery (line 2128) -- new Call\ReflectionClassGetTraitAliases (line 2130) -- new Call\ReflectionClassToString (line 2132) -- new Call\ReflectionClassRelationQuery (line 2134) -- new Call\ReflectionClassRelationQuery (line 2135) -- new Call\ReflectionClassIsFinal (line 2137) -- new Call\ReflectionClassIsInstantiable (line 2139) -- new Call\ReflectionClassIsInstance (line 2141) -- new Call\ReflectionClassIsCloneable (line 2143) -- new Call\ReflectionClassIsAnonymous (line 2145) -- new Call\ReflectionClassKindQuery (line 2147) -- new Call\ReflectionClassKindQuery (line 2148) -- new Call\ReflectionClassKindQuery (line 2149) -- new Call\ReflectionClassKindQuery (line 2150) -- new Call\ReflectionClassKindQuery (line 2152) -- new Call\ReflectionClassKindQuery (line 2153) -- new Call\ReflectionClassKindQuery (line 2154) -- new Call\ReflectionClassIsIterateable (line 2156) -- new Call\ReflectionClassIsIterateable (line 2157) -- new Call\ReflectionClassGetParentClass (line 2159) -- new Call\ReflectionClassGetModifiers (line 2161) -- new Call\ReflectionClassNewInstanceWithoutConstructor (line 2163) -- new Call\ReflectionClassNewInstance (line 2165) -- new Call\ReflectionClassNewInstanceArgs (line 2167) -- new Call\ReflectionClassGetDefaultProperties (line 2169) -- new Call\ReflectionClassGetMethods (line 2171) -- new Call\ReflectionClassGetProperties (line 2173) -- new Call\ReflectionClassGetStaticProperties (line 2175) -- new Call\ReflectionClassGetStaticPropertyValue (line 2177) -- new Call\ReflectionClassSetStaticPropertyValue (line 2179) -- new Call\ReflectionClassGetExtensionName (line 2181) -- new Call\ReflectionClassGetExtension (line 2183) -- new Call\ReflectionClassNewLazyProxy (line 2185) -- new Call\ReflectionClassNewLazyGhost (line 2186) -- new Call\ReflectionPropertyConstruct (line 2189) -- new Call\ReflectionPropertyGetName (line 2190) -- new Call\ReflectionParameterConstruct (line 2191) -- new Call\ReflectionParameterGetName (line 2192) -- new Call\ReflectionParameterGetType (line 2193) -- new Call\ReflectionParameterHasType (line 2194) -- new Call\ReflectionParameterAllowsNull (line 2195) -- new Call\ReflectionParameterIsDefaultValueAvailable (line 2196) -- new Call\ReflectionParameterGetDefaultValue (line 2197) -- new Call\ReflectionPropertyGetAttributes (line 2198) -- new Call\ReflectionPropertyIsFinal (line 2200) -- new Call\ReflectionPropertyIsVirtual (line 2201) -- new Call\ReflectionPropertyGetRawValue (line 2202) -- new Call\ReflectionPropertySetRawValue (line 2203) -- new Call\ReflectionSetAccessible (line 2205) -- new Call\ReflectionPropertyGetValue (line 2206) -- new Call\ReflectionPropertySetValue (line 2207) -- new Call\ReflectionGetDeclaringClass (line 2209) -- new Call\ReflectionMethodConstruct (line 2215) -- new Call\ReflectionMethodGetName (line 2217) -- new Call\ReflectionGetDeclaringClass (line 2219) -- new Call\ReflectionSetAccessible (line 2224) -- new Call\ReflectionMethodInvoke (line 2225) -- new Call\ReflectionMethodIsPublic (line 2227) -- new Call\ReflectionMethodIsStatic (line 2228) -- new Call\ReflectionMethodGetNumberOfParameters (line 2229) -- new Call\ReflectionMethodGetNumberOfRequiredParameters (line 2230) -- new Call\ReflectionClassConstantConstruct (line 2231) -- new Call\ReflectionClassConstantGetName (line 2232) -- new Call\ReflectionPropertyGetMangledName (line 2234) -- new Call\ReflectionConstantConstruct (line 2237) -- new Call\ReflectionConstantGetName (line 2238) -- new Call\ReflectionConstantGetValue (line 2239) -- new Call\ReflectionConstantGetAttributes (line 2242) -- new Call\ReflectionClassConstantGetAttributes (line 2245) -- new Call\ReflectionMethodGetAttributes (line 2246) -- new Call\ReflectionFunctionConstruct (line 2247) -- new Call\ReflectionFunctionGetName (line 2248) -- new Call\ReflectionExtensionConstruct (line 2250) -- new Call\ReflectionExtensionGetName (line 2251) -- new Call\ReflectionExtensionGetVersion (line 2253) -- new Call\ReflectionExtensionGetClassNames (line 2255) -- new Call\ReflectionExtensionGetClasses (line 2257) -- new Call\ReflectionExtensionGetFunctions (line 2259) -- new Call\ReflectionExtensionIsPersistent (line 2261) -- new Call\ReflectionExtensionIsTemporary (line 2262) -- new Call\ReflectionExtensionGetDependencies (line 2264) -- new Call\ReflectionExtensionGetConstants (line 2266) -- new Call\ReflectionExtensionGetINIEntries (line 2268) -- new Call\ReflectionExtensionToString (line 2270) -- new Call\ReflectionExtensionInfo (line 2271) -- new Call\ReflectionFunctionIsVariadic (line 2273) -- new Call\ReflectionFunctionGetNumberOfParameters (line 2275) -- new Call\ReflectionFunctionGetNumberOfRequiredParameters (line 2276) -- new Call\ReflectionFunctionGetParameters (line 2277) -- new Call\ReflectionFunctionGetReturnType (line 2278) -- new Call\ReflectionFunctionHasReturnType (line 2279) -- new Call\ReflectionFunctionIsUserDefined (line 2280) -- new Call\ReflectionFunctionIsInternal (line 2281) -- new Call\ReflectionParameterIsSensitiveParameter (line 2283) -- new Call\ReflectionParameterIsVariadic (line 2285) -- new Call\ReflectionParameterIsOptional (line 2286) -- new Call\ReflectionFunctionGetNamedArguments (line 2288) -- new Call\ReflectionMethodGetNamedArguments (line 2289) -- new Call\ReflectionAttributeGetName (line 2291) -- new Call\ReflectionAttributeGetTarget (line 2292) -- new Call\ReflectionAttributeNewInstance (line 2293) -- new Call\ReflectionEnumConstruct (line 2294) -- new Call\ReflectionEnumGetName (line 2295) -- new Call\ReflectionEnumHasCase (line 2296) -- new Call\ReflectionEnumGetCase (line 2297) -- new Call\ReflectionEnumGetCases (line 2298) -- new Call\ReflectionEnumIsBacked (line 2299) -- new Call\ReflectionEnumGetBackingType (line 2300) -- new Call\ReflectionEnumUnitCaseGetName (line 2301) -- new Call\ReflectionEnumUnitCaseGetName (line 2302) -- new Call\ReflectionEnumUnitCaseGetValue (line 2303) -- new Call\ReflectionNamedTypeGetName (line 2306) -- new Call\ReflectionNamedTypeToString (line 2307) -- new Call\ReflectionUnionTypeToString (line 2308) -- new Call\ExceptionGetMessage (line 2309) -- new Call\ExceptionGetCode (line 2310) -- new Call\ExceptionToString (line 2311) -- new Call\ExceptionGetTrace (line 2312) -- new Call\ExceptionGetTraceAsString (line 2313) -- new Call\ExceptionGetFile (line 2314) -- new Call\ExceptionGetLine (line 2315) -- new Call\ExceptionGetPrevious (line 2316) -- new Call\ExceptionConstruct (line 2340) -- new Call\ExceptionGetTrace (line 2352) -- new Call\ExceptionGetTraceAsString (line 2355) -- new Call\ExceptionGetMessage (line 2358) -- new Call\ExceptionGetCode (line 2361) -- new Call\ExceptionGetFile (line 2364) -- new Call\ExceptionGetLine (line 2367) -- new Call\ExceptionGetPrevious (line 2370) -- new Call\ExceptionGetMessage (line 2374) -- new Call\ExceptionGetCode (line 2375) -- new Call\ExceptionGetTrace (line 2377) -- new Call\ExceptionGetTraceAsString (line 2378) -- new Call\ExceptionGetFile (line 2379) -- new Call\ExceptionGetLine (line 2380) -- new Call\ExceptionGetPrevious (line 2381) -- new Call\DateTimeConstruct (line 2387) -- new Call\DateTimeImmutableConstruct (line 2388) -- new Call\DomDocumentConstruct (line 2390) -- new Call\ZipArchiveConstruct (line 2392) -- new Call\ZipArchiveMethod (line 2450) -- new Call\Sqlite3Method (line 2458) -- new Call\Sqlite3StmtMethod (line 2464) -- new Call\Sqlite3ResultMethod (line 2470) -- new Call\DateTimeZoneConstruct (line 2475) -- new Call\DateIntervalConstruct (line 2476) -- new Call\DateIntervalFormat (line 2477) -- new Call\DatePeriodConstruct (line 2478) -- new Call\DatePeriodCreateFromISO8601String (line 2480) -- new Call\DatePeriodIteratorMethod (line 2482) -- new Call\DatePeriodAccessorMethod (line 2487) -- new Call\DateTimeFormat (line 2489) -- new Call\DateTimeFormat (line 2490) -- new Call\DateTimeCreateFromFormat (line 2492) -- new Call\DateTimeCreateFromFormat (line 2493) -- new Call\DateTimeCreateFromInterface (line 2495) -- new Call\DateTimeCreateFromInterface (line 2496) -- new Call\DateTimeCreateFromImmutable (line 2497) -- new Call\DateTimeImmutableCreateFromMutable (line 2498) -- new Call\DateTimeCreateFromTimestamp (line 2501) -- new Call\DateTimeCreateFromTimestamp (line 2502) -- new Call\DateTimeGetMicrosecond (line 2506) -- new Call\DateTimeGetMicrosecond (line 2507) -- new Call\DateTimeSetMicrosecond (line 2508) -- new Call\DateTimeSetMicrosecond (line 2509) -- new Call\DateIntervalCreateFromDateString (line 2512) -- new Call\DateTimeSetTimezone (line 2514) -- new Call\DateTimeGetTimezone (line 2515) -- new Call\DateTimeGetTimezone (line 2516) -- new Call\DateTimeGetOffset (line 2519) -- new Call\DateTimeGetOffset (line 2520) -- new Call\DateTimeSetTimezone (line 2526) -- new Call\DateTimeGetTimestamp (line 2530) -- new Call\DateTimeGetTimestamp (line 2531) -- new Call\DateTimeSetTimestamp (line 2532) -- new Call\DateTimeSetTimestamp (line 2534) -- new Call\DateTimeSetDate (line 2537) -- new Call\DateTimeSetDate (line 2538) -- new Call\DateTimeSetTime (line 2539) -- new Call\DateTimeSetTime (line 2540) -- new Call\DateTimeSetISODate (line 2541) -- new Call\DateTimeSetISODate (line 2542) -- new Call\DateTimeGetLastErrors (line 2544) -- new Call\DateTimeGetLastErrors (line 2545) -- new Call\DateTimeModify (line 2548) -- new Call\DateTimeModify (line 2549) -- new Call\DateTimeAdd (line 2552) -- new Call\DateTimeAdd (line 2553) -- new Call\DateTimeSub (line 2554) -- new Call\DateTimeSub (line 2555) -- new Call\ProceduralDateAdd (line 2557) -- new Call\ProceduralDateSub (line 2558) -- new Call\DateTimeDiff (line 2560) -- new Call\DateTimeDiff (line 2561) -- new Call\DateTimeZoneGetTransitions (line 2563) -- new Call\DateTimeZoneGetName (line 2565) -- new Call\DateTimeZoneGetLocation (line 2567) -- new Call\DateTimeZoneGetOffset (line 2569) -- new Call\DateTimeZoneListIdentifiers (line 2571) -- new Call\DateTimeZoneListAbbreviations (line 2573) -- new Call\NumberFormatterCreate (line 2585) -- new Call\NumberFormatterFormat (line 2586) -- new Call\IntlDateFormatterCreate (line 2588) -- new Call\IntlDateFormatterFormat (line 2589) -- new Call\CollatorCompare (line 2591) -- new Call\NormalizerNormalize (line 2593) -- new Call\MessageFormatterConstruct (line 2595) -- new Call\MessageFormatterFormat (line 2596) -- new Call\TransliteratorCreate (line 2598) -- new Call\TransliteratorTransliterate (line 2599) -- new Call\FinfoConstruct (line 2601) -- new Call\FinfoFile (line 2602) -- new Call\FinfoBuffer (line 2603) -- new Call\FinfoSetFlags (line 2604) -- new Call\PdoConstruct (line 2606) -- new Call\PdoGetAvailableDrivers (line 2607) -- new Call\PdoQuote (line 2608) -- new Result (line 3140) -- new Result (line 3161) -- new Variable (line 4058) -- new Variable (line 4319) -- new Variable (line 4612) -- new Variable (line 4739) -- new VMVariable (line 4908) -- new VMVariable (line 4924) -- new VMVariable (line 4930) -- new VMVariable (line 4936) -- new VMVariable (line 4947) -- new Variable (line 5011) -- new Variable (line 5031) -- new Variable (line 5076) -- 122 class method(s) -- 31 closure(s) +- new Call\ExternalMethod (line 1122) +- new Call\DomXmlDocumentCreateFromString (line 1206) +- new Call\DomHtmlDocumentCreateFromString (line 1207) +- new Call\DomXmlDocumentCreateFromFile (line 1208) +- new Call\DomHtmlDocumentCreateFromFile (line 1209) +- new ReflectionMethod (line 1308) +- new Builtin\IsNullFn (line 1769) +- new Builtin\IsNullFn (line 1770) +- new Call\SplObjectStorageMethod (line 1771) +- new Call\SplObjectStorageMethod (line 1772) +- new Call\SplObjectStorageMethod (line 1773) +- new Call\SplObjectStorageMethod (line 1774) +- new Call\SplObjectStorageMethod (line 1775) +- new Call\SplObjectStorageMethod (line 1776) +- new Call\SplObjectStorageMethod (line 1778) +- new Call\SplObjectStorageMethod (line 1779) +- new Call\SplObjectStorageMethod (line 1781) +- new Call\SplObjectStorageMethod (line 1782) +- new Call\SplObjectStorageMethod (line 1783) +- new Call\SplObjectStorageMethod (line 1785) +- new Call\SplObjectStorageMethod (line 1786) +- new Call\SplObjectStorageMethod (line 1787) +- new Call\SplObjectStorageMethod (line 1788) +- new Call\SplObjectStorageMethod (line 1789) +- new Call\SplObjectStorageMethod (line 1790) +- new Call\SplObjectStorageMethod (line 1791) +- new Call\SplObjectStorageMethod (line 1793) +- new Call\SplObjectStorageMethod (line 1795) +- new Call\SplObjectStorageMethod (line 1796) +- new Call\ArrayIteratorConstruct (line 1801) +- new Call\ArrayIteratorConstruct (line 1802) +- new Call\ArrayIteratorMethod (line 1828) +- new Call\ArrayIteratorMethod (line 1832) +- new Call\ArrayIteratorConstruct (line 1839) +- new Call\ArrayObjectMethod (line 1866) +- new Call\RecursiveIteratorIteratorConstruct (line 1869) +- new Call\RecursiveIteratorIteratorArgcMethod (line 1871) +- new Call\RecursiveIteratorIteratorArgcMethod (line 1872) +- new Call\RecursiveIteratorIteratorArgcMethod (line 1873) +- new Call\LimitIteratorConstruct (line 1879) +- new Call\LimitIteratorMethod (line 1880) +- new Call\LimitIteratorMethod (line 1881) +- new Call\AppendIteratorMethod (line 1882) +- new Call\AppendIteratorMethod (line 1883) +- new Call\RegexIteratorConstruct (line 1884) +- new Call\CallbackFilterIteratorConstruct (line 1885) +- new Call\CachingIteratorConstruct (line 1887) +- new Call\CachingIteratorGetCache (line 1888) +- new Call\CachingIteratorMethod (line 1890) +- new Call\SplHtPosIteratorMethod (line 1898) +- new Call\SplHtPosIteratorMethod (line 1904) +- new Call\EmptyIteratorMethod (line 1916) +- new Call\FilterIteratorMethod (line 1925) +- new Call\ParentIteratorConstruct (line 1933) +- new Call\ParentIteratorArgcMethod (line 1935) +- new Call\ParentIteratorArgcMethod (line 1939) +- new Call\MultipleIteratorMethod (line 1943) +- new Call\MultipleIteratorMethod (line 1944) +- new Call\RecursiveTreeIteratorConstruct (line 1945) +- new Call\DirectoryMethod (line 1949) +- new Call\DirectoryIteratorMethod (line 1976) +- new Call\DirectoryIteratorMethod (line 1991) +- new Call\SplFileObjectMethod (line 2011) +- new Call\DirectoryIteratorMethod (line 2023) +- new Call\SplFileObjectMethod (line 2038) +- new Call\DirectoryIteratorMethod (line 2051) +- new Call\GlobIteratorMethod (line 2063) +- new Call\SplHeapMethod (line 2077) +- new Call\SplPriorityQueueMethod (line 2088) +- new Call\SplDllistMethod (line 2114) +- new Call\SplFixedArrayMethod (line 2128) +- new Call\WeakReferenceCreate (line 2131) +- new Call\WeakReferenceGet (line 2132) +- new Call\SensitiveParameterValueConstruct (line 2133) +- new Call\SensitiveParameterValueGetValue (line 2134) +- new Call\WeakMapMethod (line 2135) +- new Call\WeakMapMethod (line 2136) +- new Call\WeakMapMethod (line 2137) +- new Call\WeakMapMethod (line 2138) +- new Call\WeakMapMethod (line 2139) +- new Call\PhpTokenConstruct (line 2142) +- new Call\PhpTokenTokenize (line 2143) +- new Call\PhpTokenGetTokenName (line 2144) +- new Call\BcMathNumberConstruct (line 2147) +- new Call\BcMathNumberToString (line 2148) +- new Call\BcMathNumberMethod (line 2151) +- new Call\ReflectionClassConstruct (line 2155) +- new Call\ReflectionObjectConstruct (line 2156) +- new Call\ReflectionClassGetName (line 2157) +- new Call\ReflectionObjectGetName (line 2159) +- new Call\ReflectionClassGetShortName (line 2160) +- new Call\ReflectionClassGetNamespaceName (line 2161) +- new Call\ReflectionClassInNamespace (line 2162) +- new Call\ReflectionClassGetAttributes (line 2163) +- new Call\ReflectionClassGetMethod (line 2165) +- new Call\ReflectionClassGetConstructor (line 2167) +- new Call\ReflectionClassGetProperty (line 2168) +- new Call\ReflectionClassGetReflectionConstant (line 2169) +- new Call\ReflectionClassHasMember (line 2171) +- new Call\ReflectionClassHasMember (line 2172) +- new Call\ReflectionClassHasMember (line 2173) +- new Call\ReflectionClassGetConstant (line 2175) +- new Call\ReflectionClassGetConstants (line 2177) +- new Call\ReflectionClassGetReflectionConstants (line 2179) +- new Call\ReflectionClassGetFileName (line 2181) +- new Call\ReflectionClassSourceLocationQuery (line 2184) +- new Call\ReflectionClassSourceLocationQuery (line 2185) +- new Call\ReflectionClassSourceLocationQuery (line 2186) +- new Call\ReflectionClassNameListQuery (line 2188) +- new Call\ReflectionClassNameListQuery (line 2189) +- new Call\ReflectionClassClassMapQuery (line 2191) +- new Call\ReflectionClassClassMapQuery (line 2192) +- new Call\ReflectionClassGetTraitAliases (line 2194) +- new Call\ReflectionClassToString (line 2196) +- new Call\ReflectionClassRelationQuery (line 2198) +- new Call\ReflectionClassRelationQuery (line 2199) +- new Call\ReflectionClassIsFinal (line 2201) +- new Call\ReflectionClassIsInstantiable (line 2203) +- new Call\ReflectionClassIsInstance (line 2205) +- new Call\ReflectionClassIsCloneable (line 2207) +- new Call\ReflectionClassIsAnonymous (line 2209) +- new Call\ReflectionClassKindQuery (line 2211) +- new Call\ReflectionClassKindQuery (line 2212) +- new Call\ReflectionClassKindQuery (line 2213) +- new Call\ReflectionClassKindQuery (line 2214) +- new Call\ReflectionClassKindQuery (line 2216) +- new Call\ReflectionClassKindQuery (line 2217) +- new Call\ReflectionClassKindQuery (line 2218) +- new Call\ReflectionClassIsIterateable (line 2220) +- new Call\ReflectionClassIsIterateable (line 2221) +- new Call\ReflectionClassGetParentClass (line 2223) +- new Call\ReflectionClassGetModifiers (line 2225) +- new Call\ReflectionClassNewInstanceWithoutConstructor (line 2227) +- new Call\ReflectionClassNewInstance (line 2229) +- new Call\ReflectionClassNewInstanceArgs (line 2231) +- new Call\ReflectionClassGetDefaultProperties (line 2233) +- new Call\ReflectionClassGetMethods (line 2235) +- new Call\ReflectionClassGetProperties (line 2237) +- new Call\ReflectionClassGetStaticProperties (line 2239) +- new Call\ReflectionClassGetStaticPropertyValue (line 2241) +- new Call\ReflectionClassSetStaticPropertyValue (line 2243) +- new Call\ReflectionClassGetExtensionName (line 2245) +- new Call\ReflectionClassGetExtension (line 2247) +- new Call\ReflectionClassNewLazyProxy (line 2249) +- new Call\ReflectionClassNewLazyGhost (line 2250) +- new Call\ReflectionPropertyConstruct (line 2253) +- new Call\ReflectionPropertyGetName (line 2254) +- new Call\ReflectionParameterConstruct (line 2255) +- new Call\ReflectionParameterGetName (line 2256) +- new Call\ReflectionParameterGetType (line 2257) +- new Call\ReflectionParameterHasType (line 2258) +- new Call\ReflectionParameterAllowsNull (line 2259) +- new Call\ReflectionParameterIsDefaultValueAvailable (line 2260) +- new Call\ReflectionParameterGetDefaultValue (line 2261) +- new Call\ReflectionPropertyGetAttributes (line 2262) +- new Call\ReflectionPropertyIsFinal (line 2264) +- new Call\ReflectionPropertyIsVirtual (line 2265) +- new Call\ReflectionPropertyGetRawValue (line 2266) +- new Call\ReflectionPropertySetRawValue (line 2267) +- new Call\ReflectionSetAccessible (line 2269) +- new Call\ReflectionPropertyGetValue (line 2270) +- new Call\ReflectionPropertySetValue (line 2271) +- new Call\ReflectionGetDeclaringClass (line 2273) +- new Call\ReflectionMethodConstruct (line 2279) +- new Call\ReflectionMethodGetName (line 2281) +- new Call\ReflectionGetDeclaringClass (line 2283) +- new Call\ReflectionSetAccessible (line 2288) +- new Call\ReflectionMethodInvoke (line 2289) +- new Call\ReflectionMethodIsPublic (line 2291) +- new Call\ReflectionMethodIsStatic (line 2292) +- new Call\ReflectionMethodGetNumberOfParameters (line 2293) +- new Call\ReflectionMethodGetNumberOfRequiredParameters (line 2294) +- new Call\ReflectionClassConstantConstruct (line 2295) +- new Call\ReflectionClassConstantGetName (line 2296) +- new Call\ReflectionPropertyGetMangledName (line 2298) +- new Call\ReflectionConstantConstruct (line 2301) +- new Call\ReflectionConstantGetName (line 2302) +- new Call\ReflectionConstantGetValue (line 2303) +- new Call\ReflectionConstantGetAttributes (line 2306) +- new Call\ReflectionClassConstantGetAttributes (line 2309) +- new Call\ReflectionMethodGetAttributes (line 2310) +- new Call\ReflectionFunctionConstruct (line 2311) +- new Call\ReflectionFunctionGetName (line 2312) +- new Call\ReflectionExtensionConstruct (line 2314) +- new Call\ReflectionExtensionGetName (line 2315) +- new Call\ReflectionExtensionGetVersion (line 2317) +- new Call\ReflectionExtensionGetClassNames (line 2319) +- new Call\ReflectionExtensionGetClasses (line 2321) +- new Call\ReflectionExtensionGetFunctions (line 2323) +- new Call\ReflectionExtensionIsPersistent (line 2325) +- new Call\ReflectionExtensionIsTemporary (line 2326) +- new Call\ReflectionExtensionGetDependencies (line 2328) +- new Call\ReflectionExtensionGetConstants (line 2330) +- new Call\ReflectionExtensionGetINIEntries (line 2332) +- new Call\ReflectionExtensionToString (line 2334) +- new Call\ReflectionExtensionInfo (line 2335) +- new Call\ReflectionFunctionIsVariadic (line 2337) +- new Call\ReflectionFunctionGetNumberOfParameters (line 2339) +- new Call\ReflectionFunctionGetNumberOfRequiredParameters (line 2340) +- new Call\ReflectionFunctionGetParameters (line 2341) +- new Call\ReflectionFunctionGetReturnType (line 2342) +- new Call\ReflectionFunctionHasReturnType (line 2343) +- new Call\ReflectionFunctionIsUserDefined (line 2344) +- new Call\ReflectionFunctionIsInternal (line 2345) +- new Call\ReflectionParameterIsSensitiveParameter (line 2347) +- new Call\ReflectionParameterIsVariadic (line 2349) +- new Call\ReflectionParameterIsOptional (line 2350) +- new Call\ReflectionFunctionGetNamedArguments (line 2352) +- new Call\ReflectionMethodGetNamedArguments (line 2353) +- new Call\ReflectionAttributeGetName (line 2355) +- new Call\ReflectionAttributeGetTarget (line 2356) +- new Call\ReflectionAttributeNewInstance (line 2357) +- new Call\ReflectionEnumConstruct (line 2358) +- new Call\ReflectionEnumGetName (line 2359) +- new Call\ReflectionEnumHasCase (line 2360) +- new Call\ReflectionEnumGetCase (line 2361) +- new Call\ReflectionEnumGetCases (line 2362) +- new Call\ReflectionEnumIsBacked (line 2363) +- new Call\ReflectionEnumGetBackingType (line 2364) +- new Call\ReflectionEnumUnitCaseGetName (line 2365) +- new Call\ReflectionEnumUnitCaseGetName (line 2366) +- new Call\ReflectionEnumUnitCaseGetValue (line 2367) +- new Call\ReflectionNamedTypeGetName (line 2370) +- new Call\ReflectionNamedTypeToString (line 2371) +- new Call\ReflectionUnionTypeToString (line 2372) +- new Call\ExceptionGetMessage (line 2373) +- new Call\ExceptionGetCode (line 2374) +- new Call\ExceptionToString (line 2375) +- new Call\ExceptionGetTrace (line 2376) +- new Call\ExceptionGetTraceAsString (line 2377) +- new Call\ExceptionGetFile (line 2378) +- new Call\ExceptionGetLine (line 2379) +- new Call\ExceptionGetPrevious (line 2380) +- new Call\ExceptionConstruct (line 2404) +- new Call\ExceptionGetTrace (line 2416) +- new Call\ExceptionGetTraceAsString (line 2419) +- new Call\ExceptionGetMessage (line 2422) +- new Call\ExceptionGetCode (line 2425) +- new Call\ExceptionGetFile (line 2428) +- new Call\ExceptionGetLine (line 2431) +- new Call\ExceptionGetPrevious (line 2434) +- new Call\ExceptionGetMessage (line 2438) +- new Call\ExceptionGetCode (line 2439) +- new Call\ExceptionGetTrace (line 2441) +- new Call\ExceptionGetTraceAsString (line 2442) +- new Call\ExceptionGetFile (line 2443) +- new Call\ExceptionGetLine (line 2444) +- new Call\ExceptionGetPrevious (line 2445) +- new Call\DateTimeConstruct (line 2451) +- new Call\DateTimeImmutableConstruct (line 2452) +- new Call\DomDocumentConstruct (line 2454) +- new Call\ZipArchiveConstruct (line 2456) +- new Call\ZipArchiveMethod (line 2514) +- new Call\Sqlite3Method (line 2522) +- new Call\Sqlite3StmtMethod (line 2528) +- new Call\Sqlite3ResultMethod (line 2534) +- new Call\DateTimeZoneConstruct (line 2539) +- new Call\DateIntervalConstruct (line 2540) +- new Call\DateIntervalFormat (line 2541) +- new Call\DatePeriodConstruct (line 2542) +- new Call\DatePeriodCreateFromISO8601String (line 2544) +- new Call\DatePeriodIteratorMethod (line 2546) +- new Call\DatePeriodAccessorMethod (line 2551) +- new Call\DateTimeFormat (line 2553) +- new Call\DateTimeFormat (line 2554) +- new Call\DateTimeCreateFromFormat (line 2556) +- new Call\DateTimeCreateFromFormat (line 2557) +- new Call\DateTimeCreateFromInterface (line 2559) +- new Call\DateTimeCreateFromInterface (line 2560) +- new Call\DateTimeCreateFromImmutable (line 2561) +- new Call\DateTimeImmutableCreateFromMutable (line 2562) +- new Call\DateTimeCreateFromTimestamp (line 2565) +- new Call\DateTimeCreateFromTimestamp (line 2566) +- new Call\DateTimeGetMicrosecond (line 2570) +- new Call\DateTimeGetMicrosecond (line 2571) +- new Call\DateTimeSetMicrosecond (line 2572) +- new Call\DateTimeSetMicrosecond (line 2573) +- new Call\DateIntervalCreateFromDateString (line 2576) +- new Call\DateTimeSetTimezone (line 2578) +- new Call\DateTimeGetTimezone (line 2579) +- new Call\DateTimeGetTimezone (line 2580) +- new Call\DateTimeGetOffset (line 2583) +- new Call\DateTimeGetOffset (line 2584) +- new Call\DateTimeSetTimezone (line 2590) +- new Call\DateTimeGetTimestamp (line 2594) +- new Call\DateTimeGetTimestamp (line 2595) +- new Call\DateTimeSetTimestamp (line 2596) +- new Call\DateTimeSetTimestamp (line 2598) +- new Call\DateTimeSetDate (line 2601) +- new Call\DateTimeSetDate (line 2602) +- new Call\DateTimeSetTime (line 2603) +- new Call\DateTimeSetTime (line 2604) +- new Call\DateTimeSetISODate (line 2605) +- new Call\DateTimeSetISODate (line 2606) +- new Call\DateTimeGetLastErrors (line 2608) +- new Call\DateTimeGetLastErrors (line 2609) +- new Call\DateTimeModify (line 2612) +- new Call\DateTimeModify (line 2613) +- new Call\DateTimeAdd (line 2616) +- new Call\DateTimeAdd (line 2617) +- new Call\DateTimeSub (line 2618) +- new Call\DateTimeSub (line 2619) +- new Call\ProceduralDateAdd (line 2621) +- new Call\ProceduralDateSub (line 2622) +- new Call\DateTimeDiff (line 2624) +- new Call\DateTimeDiff (line 2625) +- new Call\DateTimeZoneGetTransitions (line 2627) +- new Call\DateTimeZoneGetName (line 2629) +- new Call\DateTimeZoneGetLocation (line 2631) +- new Call\DateTimeZoneGetOffset (line 2633) +- new Call\DateTimeZoneListIdentifiers (line 2635) +- new Call\DateTimeZoneListAbbreviations (line 2637) +- new Call\NumberFormatterCreate (line 2649) +- new Call\NumberFormatterFormat (line 2650) +- new Call\IntlDateFormatterCreate (line 2652) +- new Call\IntlDateFormatterFormat (line 2653) +- new Call\CollatorCompare (line 2655) +- new Call\NormalizerNormalize (line 2657) +- new Call\MessageFormatterConstruct (line 2659) +- new Call\MessageFormatterFormat (line 2660) +- new Call\TransliteratorCreate (line 2662) +- new Call\TransliteratorTransliterate (line 2663) +- new Call\FinfoConstruct (line 2665) +- new Call\FinfoFile (line 2666) +- new Call\FinfoBuffer (line 2667) +- new Call\FinfoSetFlags (line 2668) +- new Call\PdoConstruct (line 2670) +- new Call\PdoGetAvailableDrivers (line 2671) +- new Call\PdoQuote (line 2672) +- new Result (line 3205) +- new Result (line 3226) +- new Variable (line 4210) +- new Variable (line 4471) +- new Variable (line 4764) +- new Variable (line 4891) +- new VMVariable (line 5060) +- new VMVariable (line 5076) +- new VMVariable (line 5082) +- new VMVariable (line 5088) +- new VMVariable (line 5099) +- new Variable (line 5163) +- new Variable (line 5183) +- new Variable (line 5228) +- 127 class method(s) +- 32 closure(s) ### `lib/JIT/DatePeriodForeachSnapshot.php` @@ -58440,8 +58488,10 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - new Variable (line 46) - new Variable (line 54) -- new Variable (line 75) -- 12 class method(s) +- new Variable (line 104) +- new Variable (line 115) +- new Variable (line 160) +- 13 class method(s) ### `lib/JIT/JitLongDiv.php` @@ -58579,7 +58629,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/JitValueBox.php` **Warnings** (review for bootstrap subset): -- 20 class method(s) +- 21 class method(s) ### `lib/JIT/JitValueCompare.php` @@ -58589,10 +58639,10 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/JitValueNumeric.php` **Warnings** (review for bootstrap subset): -- new Variable (line 301) -- new Variable (line 350) -- new Variable (line 445) -- 13 class method(s) +- new Variable (line 314) +- new Variable (line 363) +- new Variable (line 460) +- 17 class method(s) ### `lib/JIT/JitVmHelperLink.php` @@ -59045,7 +59095,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/ScopeVariableAssignedFlags.php` **Warnings** (review for bootstrap subset): -- 4 class method(s) +- 5 class method(s) ### `lib/JIT/ScriptMagic.php` @@ -59231,7 +59281,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/UndefinedVariableHelper.php` **Warnings** (review for bootstrap subset): -- 7 class method(s) +- 8 class method(s) ### `lib/JIT/UnserializeObjectDecodeLlvm.php` @@ -59328,40 +59378,40 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/Variable.php` **Warnings** (review for bootstrap subset): -- new Variable (line 680) -- new Variable (line 718) -- new Variable (line 743) -- new Variable (line 766) -- new Variable (line 831) -- new Variable (line 869) -- new Variable (line 900) -- new Variable (line 947) -- new Variable (line 969) -- new Variable (line 989) -- new self (line 1007) -- new self (line 1018) -- new self (line 1030) -- new self (line 1046) -- new self (line 1053) -- new self (line 1060) +- new Variable (line 690) +- new Variable (line 728) +- new Variable (line 753) +- new Variable (line 776) +- new Variable (line 841) +- new Variable (line 879) +- new Variable (line 910) +- new Variable (line 957) +- new Variable (line 979) +- new Variable (line 999) +- new self (line 1017) +- new self (line 1028) +- new self (line 1040) +- new self (line 1056) +- new self (line 1063) - new self (line 1070) -- new self (line 1086) +- new self (line 1080) - new self (line 1096) -- new self (line 1118) -- new Variable (line 1287) -- new Variable (line 1303) -- new Variable (line 1312) -- new Variable (line 1346) -- new Variable (line 1416) -- new Variable (line 1430) -- new Variable (line 1469) -- new Variable (line 1493) -- new Variable (line 1521) -- new Variable (line 1550) -- new Variable (line 1619) -- new Variable (line 1670) -- new Variable (line 1683) -- new self (line 1757) +- new self (line 1106) +- new self (line 1128) +- new Variable (line 1297) +- new Variable (line 1313) +- new Variable (line 1322) +- new Variable (line 1356) +- new Variable (line 1426) +- new Variable (line 1440) +- new Variable (line 1479) +- new Variable (line 1503) +- new Variable (line 1531) +- new Variable (line 1560) +- new Variable (line 1629) +- new Variable (line 1680) +- new Variable (line 1693) +- new self (line 1767) - 25 class method(s) ### `lib/JIT/VariableFunctionCallHelper.php` @@ -59450,6 +59500,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 12 class method(s) +### `lib/JitVmLoweringPolicy.php` + +**Warnings** (review for bootstrap subset): +- 3 class method(s) + ### `lib/LanguageProfileScope.php` **Warnings** (review for bootstrap subset): @@ -65104,6 +65159,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 57 class method(s) +### `lib/VM/VmValueCopy.php` + +**Warnings** (review for bootstrap subset): +- 3 class method(s) + ### `lib/VM/VmVarFetch.php` **Warnings** (review for bootstrap subset): diff --git a/lib/JIT/Builtin/Type/Value.php b/lib/JIT/Builtin/Type/Value.php index 4fb94f77c35..0ddc63a9704 100644 --- a/lib/JIT/Builtin/Type/Value.php +++ b/lib/JIT/Builtin/Type/Value.php @@ -238,6 +238,23 @@ public function register(): void { + $fntype___cfcd208495d565ef66e7dff9f98764da = $this->context->context->functionType( + $this->context->getTypeFromString('void'), + false , + $this->context->getTypeFromString('__value__*') + , $this->context->getTypeFromString('__value__*') + + ); + $fn___cfcd208495d565ef66e7dff9f98764da = $this->context->module->addFunction('__value__copy', $fntype___cfcd208495d565ef66e7dff9f98764da); + + + + $this->context->registerFunction('__value__copy', $fn___cfcd208495d565ef66e7dff9f98764da); + + + + + } @@ -252,6 +269,7 @@ public function implement(): void { // __value__writeLong deferred — Context::lookupFunction ensureLinked (#36135). // __value__writeNull deferred — Context::lookupFunction ensureLinked (#36124). // __value__writeBool deferred — Context::lookupFunction ensureLinked (#36108). + // __value__copy deferred — Context::lookupFunction ensureLinked (#36193). } public function initialize(): void { diff --git a/lib/JIT/Builtin/Type/Value.pre b/lib/JIT/Builtin/Type/Value.pre index b77c971feec..7b3bed92fe0 100755 --- a/lib/JIT/Builtin/Type/Value.pre +++ b/lib/JIT/Builtin/Type/Value.pre @@ -38,6 +38,8 @@ class Value extends Type { static inline function __value__writeString(__value__*, __string__*): void; static inline function __value__writeNull(__value__*): void; + + static inline function __value__copy(__value__*, __value__*): void; } } @@ -52,6 +54,7 @@ class Value extends Type { // __value__writeLong deferred — Context::lookupFunction ensureLinked (#36135). // __value__writeNull deferred — Context::lookupFunction ensureLinked (#36124). // __value__writeBool deferred — Context::lookupFunction ensureLinked (#36108). + // __value__copy deferred — Context::lookupFunction ensureLinked (#36193). } public function initialize(): void { diff --git a/lib/JIT/Builtin/ValueBoxCopyJit.php b/lib/JIT/Builtin/ValueBoxCopyJit.php new file mode 100644 index 00000000000..fdcb53ca316 --- /dev/null +++ b/lib/JIT/Builtin/ValueBoxCopyJit.php @@ -0,0 +1,41 @@ +module->getNamedFunction('__value__copy'); + if (null !== $probe && $probe->countBasicBlocks() > 0) { + return; + } + $restore = BasicBlockHelper::tryGetInsertBlock($context); + try { + NestedJitCompileScope::run($context, static function () use ($context): void { + self::implement($context); + }); + } finally { + BasicBlockHelper::restoreInsertBlock($context, $restore); + } + } + + public static function implement(Context $context): void + { + VmValueCopy::implement($context); + } +} diff --git a/lib/JIT/Context.php b/lib/JIT/Context.php index 3a6435773c8..ddd406ec33e 100644 --- a/lib/JIT/Context.php +++ b/lib/JIT/Context.php @@ -3662,6 +3662,10 @@ public function lookupFunction(string $name): PHPLLVM\Value\Function_ { if ('__value__writeBool' === $name) { Builtin\ValueBoxWriteBoolJit::ensureLinked($this); } + // Lazy __value__copy — one outlined type-switch per module (#36193). + if ('__value__copy' === $name) { + Builtin\ValueBoxCopyJit::ensureLinked($this); + } if (isset($this->functionScope[$name])) { return $this->functionScope[$name]; } diff --git a/lib/JIT/JitValueBox.php b/lib/JIT/JitValueBox.php index 48e0cd9e7c4..8d512a169e5 100644 --- a/lib/JIT/JitValueBox.php +++ b/lib/JIT/JitValueBox.php @@ -15,8 +15,6 @@ final class JitValueBox { - private static int $copySeq = 0; - public static function alloc(Context $context): Value { BasicBlockHelper::ensureOpenInsertBlock($context, 'value_box_alloc_cont'); @@ -608,166 +606,20 @@ public static function copyFromPointer(Context $context, Value $destSlot, Value self::copyBetweenPointers($context, self::pointer($context, $destSlot), $srcPtr); } + /** + * Copy between two {@see __value__*} pointers — delegates to outlined __value__copy (#36193). + */ private static function copyBetweenPointers(Context $context, Value $destPtr, Value $srcPtr): void { if (!BasicBlockHelper::unsealAndContinue($context)) { BasicBlockHelper::ensureOpenInsertBlockReplacingVoidReturn($context, 'value_copy_cont'); } - $map = $context->structFieldMap['__value__']; - $typeByte = $context->builder->load( - $context->builder->structGep($srcPtr, $map['type']) - ); - $i8 = $context->getTypeFromString('int8'); - // Mask IS_REFCOUNTED — HT slots may store VM TYPE_STRING (4) or JIT (4|0x80). - // Unmasked compare missed VM tags → empty copy → NestedJIT toString strlen=0 (#21921). - $kind = $context->builder->and($typeByte, $i8->constInt(0x7f, false)); - - $tag = 'v'.(string) self::$copySeq++; - $stringBlock = BasicBlockHelper::append($context, 'value_copy_string_'.$tag); - $hashtableBlock = BasicBlockHelper::append($context, 'value_copy_hashtable_'.$tag); - $objectBlock = BasicBlockHelper::append($context, 'value_copy_object_'.$tag); - $longBlock = BasicBlockHelper::append($context, 'value_copy_long_'.$tag); - $doubleBlock = BasicBlockHelper::append($context, 'value_copy_double_'.$tag); - $boolBlock = BasicBlockHelper::append($context, 'value_copy_bool_'.$tag); - $nullBlock = BasicBlockHelper::append($context, 'value_copy_null_'.$tag); - $done = BasicBlockHelper::append($context, 'value_copy_done_'.$tag); - - $isString = $context->builder->icmp( - Builder::INT_EQ, - $kind, - $i8->constInt(Variable::TYPE_STRING & 0x7f, false) - ); - $isHashtable = $context->builder->icmp( - Builder::INT_EQ, - $kind, - $i8->constInt(Variable::TYPE_HASHTABLE & 0x7f, false) - ); - $isObject = $context->builder->icmp( - Builder::INT_EQ, - $kind, - $i8->constInt(Variable::TYPE_OBJECT & 0x7f, false) - ); - $isLong = $context->builder->icmp( - Builder::INT_EQ, - $kind, - $i8->constInt(Variable::TYPE_NATIVE_LONG, false) - ); - $isBool = $context->builder->icmp( - Builder::INT_EQ, - $kind, - $i8->constInt(Variable::TYPE_NATIVE_BOOL, false) - ); - $isDouble = $context->builder->icmp( - Builder::INT_EQ, - $kind, - $i8->constInt(Variable::TYPE_NATIVE_DOUBLE, false) - ); - $isNull = $context->builder->icmp( - Builder::INT_EQ, - $kind, - $i8->constInt(Variable::TYPE_NULL, false) - ); - - $afterString = BasicBlockHelper::append($context, 'value_copy_after_string_'.$tag); - $context->builder->branchIf($isString, $stringBlock, $afterString); - - $context->builder->positionAtEnd($stringBlock); - $str = $context->builder->call( - $context->lookupFunction('__value__readString'), - $srcPtr - ); - self::writeStringToValuePtrByAddref($context, $destPtr, $str); - $context->builder->branch($done); - - $context->builder->positionAtEnd($afterString); - $afterHashtable = BasicBlockHelper::append($context, 'value_copy_after_hashtable_'.$tag); - $context->builder->branchIf($isHashtable, $hashtableBlock, $afterHashtable); - - $context->builder->positionAtEnd($hashtableBlock); - $ht = $context->builder->call( - $context->lookupFunction('__value__readHashtable'), - $srcPtr - ); - $context->refcount->addref($ht); + Builtin\ValueBoxCopyJit::ensureLinked($context); $context->builder->call( - $context->lookupFunction('__value__writeHashtable'), + $context->lookupFunction('__value__copy'), $destPtr, - $ht - ); - $context->builder->branch($done); - - $context->builder->positionAtEnd($afterHashtable); - $afterObject = BasicBlockHelper::append($context, 'value_copy_after_object_'.$tag); - $context->builder->branchIf($isObject, $objectBlock, $afterObject); - - $context->builder->positionAtEnd($objectBlock); - $obj = $context->builder->call( - $context->lookupFunction('__value__readObject'), $srcPtr ); - // writeObject addrefs internally (#4096); do not addref here. - $context->builder->call( - $context->lookupFunction('__value__writeObject'), - $destPtr, - $obj - ); - $context->builder->branch($done); - - $context->builder->positionAtEnd($afterObject); - $afterLong = BasicBlockHelper::append($context, 'value_copy_after_long_'.$tag); - $context->builder->branchIf($isLong, $longBlock, $afterLong); - - $context->builder->positionAtEnd($longBlock); - $context->builder->call( - $context->lookupFunction('__value__writeLong'), - $destPtr, - $context->builder->call($context->lookupFunction('__value__readLong'), $srcPtr) - ); - $context->builder->branch($done); - - $context->builder->positionAtEnd($afterLong); - $afterBool = BasicBlockHelper::append($context, 'value_copy_after_bool_'.$tag); - $context->builder->branchIf($isBool, $boolBlock, $afterBool); - - $context->builder->positionAtEnd($boolBlock); - // __value__readLong has no TYPE_NATIVE_BOOL arm (returns 0) — #21892 / JitZendScalarCast. - $boolByte = self::readBoolByte($context, $srcPtr); - $i32 = $context->getTypeFromString('int32'); - $context->builder->call( - $context->lookupFunction('__value__writeBool'), - $destPtr, - $context->builder->zExt( - $context->builder->icmp( - Builder::INT_NE, - $boolByte, - $context->getTypeFromString('int8')->constInt(0, false) - ), - $i32 - ) - ); - $context->builder->branch($done); - - $context->builder->positionAtEnd($afterBool); - $afterDouble = BasicBlockHelper::append($context, 'value_copy_after_double_'.$tag); - $context->builder->branchIf($isDouble, $doubleBlock, $afterDouble); - - $context->builder->positionAtEnd($doubleBlock); - $context->builder->call( - $context->lookupFunction('__value__writeDouble'), - $destPtr, - $context->builder->call($context->lookupFunction('__value__readDouble'), $srcPtr) - ); - $context->builder->branch($done); - - $context->builder->positionAtEnd($afterDouble); - $context->builder->branchIf($isNull, $nullBlock, $done); - - $context->builder->positionAtEnd($nullBlock); - $context->builder->call($context->lookupFunction('__value__writeNull'), $destPtr); - $context->builder->branch($done); - - $context->builder->positionAtEnd($done); - BasicBlockHelper::branchToFreshContinue($context, 'after_value_copy_'.$tag); } /** diff --git a/lib/VM/VmValueCopy.php b/lib/VM/VmValueCopy.php new file mode 100644 index 00000000000..1ac37fde6b6 --- /dev/null +++ b/lib/VM/VmValueCopy.php @@ -0,0 +1,217 @@ +module->getNamedFunction('__value__copy'); + if (null !== $probe && $probe->countBasicBlocks() > 0) { + $context->registerFunction('__value__copy', $probe); + + return; + } + + $fn = $context->tryGetRegisteredFunction('__value__copy') + ?? $context->module->getNamedFunction('__value__copy'); + if (null === $fn) { + throw new \LogicException('__value__copy shell missing before implement (#36193)'); + } + self::emitCopy($context, $fn); + $context->registerFunction('__value__copy', $fn); + $context->builder->clearInsertionPosition(); + } + + private static function emitCopy(Context $context, LlvmFunction $fn): void + { + $entry = $fn->appendBasicBlock('entry'); + $context->builder->positionAtEnd($entry); + $destPtr = $fn->getParam(0); + $srcPtr = $fn->getParam(1); + + $map = $context->structFieldMap['__value__']; + $typeByte = $context->builder->load( + $context->builder->structGep($srcPtr, $map['type']) + ); + $i8 = $context->getTypeFromString('int8'); + // Mask IS_REFCOUNTED — HT slots may store VM TYPE_STRING (4) or JIT (4|0x80). + $kind = $context->builder->and($typeByte, $i8->constInt(0x7f, false)); + + $stringBlock = $fn->appendBasicBlock('value_copy_string'); + $hashtableBlock = $fn->appendBasicBlock('value_copy_hashtable'); + $objectBlock = $fn->appendBasicBlock('value_copy_object'); + $longBlock = $fn->appendBasicBlock('value_copy_long'); + $doubleBlock = $fn->appendBasicBlock('value_copy_double'); + $boolBlock = $fn->appendBasicBlock('value_copy_bool'); + $nullBlock = $fn->appendBasicBlock('value_copy_null'); + $done = $fn->appendBasicBlock('value_copy_done'); + + $isString = $context->builder->icmp( + Builder::INT_EQ, + $kind, + $i8->constInt(Variable::TYPE_STRING & 0x7f, false) + ); + $isHashtable = $context->builder->icmp( + Builder::INT_EQ, + $kind, + $i8->constInt(Variable::TYPE_HASHTABLE & 0x7f, false) + ); + $isObject = $context->builder->icmp( + Builder::INT_EQ, + $kind, + $i8->constInt(Variable::TYPE_OBJECT & 0x7f, false) + ); + $isLong = $context->builder->icmp( + Builder::INT_EQ, + $kind, + $i8->constInt(Variable::TYPE_NATIVE_LONG, false) + ); + $isBool = $context->builder->icmp( + Builder::INT_EQ, + $kind, + $i8->constInt(Variable::TYPE_NATIVE_BOOL, false) + ); + $isDouble = $context->builder->icmp( + Builder::INT_EQ, + $kind, + $i8->constInt(Variable::TYPE_NATIVE_DOUBLE, false) + ); + $isNull = $context->builder->icmp( + Builder::INT_EQ, + $kind, + $i8->constInt(Variable::TYPE_NULL, false) + ); + + $afterString = $fn->appendBasicBlock('value_copy_after_string'); + $context->builder->branchIf($isString, $stringBlock, $afterString); + + $context->builder->positionAtEnd($stringBlock); + $str = $context->builder->call( + $context->lookupFunction('__value__readString'), + $srcPtr + ); + self::writeStringToValuePtrByAddref($context, $destPtr, $str); + $context->builder->branch($done); + + $context->builder->positionAtEnd($afterString); + $afterHashtable = $fn->appendBasicBlock('value_copy_after_hashtable'); + $context->builder->branchIf($isHashtable, $hashtableBlock, $afterHashtable); + + $context->builder->positionAtEnd($hashtableBlock); + $ht = $context->builder->call( + $context->lookupFunction('__value__readHashtable'), + $srcPtr + ); + $context->refcount->addref($ht); + $context->builder->call( + $context->lookupFunction('__value__writeHashtable'), + $destPtr, + $ht + ); + $context->builder->branch($done); + + $context->builder->positionAtEnd($afterHashtable); + $afterObject = $fn->appendBasicBlock('value_copy_after_object'); + $context->builder->branchIf($isObject, $objectBlock, $afterObject); + + $context->builder->positionAtEnd($objectBlock); + $obj = $context->builder->call( + $context->lookupFunction('__value__readObject'), + $srcPtr + ); + $context->builder->call( + $context->lookupFunction('__value__writeObject'), + $destPtr, + $obj + ); + $context->builder->branch($done); + + $context->builder->positionAtEnd($afterObject); + $afterLong = $fn->appendBasicBlock('value_copy_after_long'); + $context->builder->branchIf($isLong, $longBlock, $afterLong); + + $context->builder->positionAtEnd($longBlock); + $context->builder->call( + $context->lookupFunction('__value__writeLong'), + $destPtr, + $context->builder->call($context->lookupFunction('__value__readLong'), $srcPtr) + ); + $context->builder->branch($done); + + $context->builder->positionAtEnd($afterLong); + $afterBool = $fn->appendBasicBlock('value_copy_after_bool'); + $context->builder->branchIf($isBool, $boolBlock, $afterBool); + + $context->builder->positionAtEnd($boolBlock); + $boolByte = JitValueBox::readBoolByte($context, $srcPtr); + $i32 = $context->getTypeFromString('int32'); + $context->builder->call( + $context->lookupFunction('__value__writeBool'), + $destPtr, + $context->builder->zExt( + $context->builder->icmp( + Builder::INT_NE, + $boolByte, + $i8->constInt(0, false) + ), + $i32 + ) + ); + $context->builder->branch($done); + + $context->builder->positionAtEnd($afterBool); + $afterDouble = $fn->appendBasicBlock('value_copy_after_double'); + $context->builder->branchIf($isDouble, $doubleBlock, $afterDouble); + + $context->builder->positionAtEnd($doubleBlock); + $context->builder->call( + $context->lookupFunction('__value__writeDouble'), + $destPtr, + $context->builder->call($context->lookupFunction('__value__readDouble'), $srcPtr) + ); + $context->builder->branch($done); + + $context->builder->positionAtEnd($afterDouble); + $context->builder->branchIf($isNull, $nullBlock, $done); + + $context->builder->positionAtEnd($nullBlock); + $context->builder->call($context->lookupFunction('__value__writeNull'), $destPtr); + $context->builder->branch($done); + + $context->builder->positionAtEnd($done); + $context->builder->returnVoid(); + } + + /** + * Zend zend_string_copy semantics — addref, not __string__separate (#36192). + */ + private static function writeStringToValuePtrByAddref(Context $context, Value $destPtr, Value $strPtr): void + { + $context->refcount->addref($strPtr); + $context->builder->call( + $context->lookupFunction('__value__writeString'), + $destPtr, + $strPtr + ); + } +} diff --git a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha index 9e8106a4366..9ef02dc7911 100755 --- a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha +++ b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha @@ -1 +1 @@ -f934e92685b0ed40fc398adff707df7b937b185a \ No newline at end of file +f934e92685b0ed40fc398adff707df7b937b185a diff --git a/test/selfhost/compiler_lib_spine_smoke/main.php b/test/selfhost/compiler_lib_spine_smoke/main.php index 0a965f92035..37540238a86 100644 --- a/test/selfhost/compiler_lib_spine_smoke/main.php +++ b/test/selfhost/compiler_lib_spine_smoke/main.php @@ -8158,8 +8158,10 @@ require_once __DIR__.'/../../../ext/dom/JitDomNodeBaseUri.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/DomNodeBaseUriRuntime.php'; require_once __DIR__.'/../../../lib/JIT/Builtin/ValueBoxWriteLongJit.php'; +require_once __DIR__.'/../../../lib/JIT/Builtin/ValueBoxCopyJit.php'; require_once __DIR__.'/../../../lib/JIT/HashTableSpliceKeyedLlvm.php'; require_once __DIR__.'/../../../lib/VM/VmValueBoxWriteLong.php'; +require_once __DIR__.'/../../../lib/VM/VmValueCopy.php'; require_once __DIR__.'/../../../ext/sqlite3/JitSqlite3.php'; require_once __DIR__.'/../../../ext/sqlite3/JitSqlite3Stmt.php'; require_once __DIR__.'/../../../ext/sqlite3/JitSqlite3Result.php'; diff --git a/test/unit/StringCopyOnWriteAotTest.php b/test/unit/StringCopyOnWriteAotTest.php index 190c7953fc8..cde3e2ee19a 100644 --- a/test/unit/StringCopyOnWriteAotTest.php +++ b/test/unit/StringCopyOnWriteAotTest.php @@ -15,7 +15,7 @@ final class StringCopyOnWriteAotTest extends TestCase { public function testValueBoxCopyUsesAddrefNotSeparate(): void { - $src = (string) file_get_contents(dirname(__DIR__, 2).'/lib/JIT/JitValueBox.php'); + $src = (string) file_get_contents(dirname(__DIR__, 2).'/lib/VM/VmValueCopy.php'); $this->assertStringContainsString('writeStringToValuePtrByAddref', $src); $this->assertStringContainsString('$context->refcount->addref($strPtr)', $src); $this->assertStringNotContainsString('lookupFunction(\'__string__separate\')', $src); diff --git a/test/unit/ValueBoxCopyOutlineTest.php b/test/unit/ValueBoxCopyOutlineTest.php new file mode 100644 index 00000000000..c5cc6573ec5 --- /dev/null +++ b/test/unit/ValueBoxCopyOutlineTest.php @@ -0,0 +1,61 @@ +assertStringContainsString('#36193', $src); + $this->assertStringContainsString("lookupFunction('__value__copy')", $src); + $this->assertStringContainsString('ValueBoxCopyJit::ensureLinked', $src); + $this->assertStringNotContainsString('value_copy_string_', $src); + $this->assertStringNotContainsString('copySeq', $src); + } + + public function testContextLookupFunctionLazyLinksValueCopy(): void + { + $context = (string) file_get_contents(dirname(__DIR__, 2).'/lib/JIT/Context.php'); + $this->assertStringContainsString('#36193', $context); + $pos = strpos($context, 'public function lookupFunction'); + $this->assertNotFalse($pos); + $next = strpos($context, 'public function tryGetRegisteredFunction', $pos); + $this->assertNotFalse($next); + $body = substr($context, $pos, $next - $pos); + $this->assertStringContainsString("'__value__copy' === \$name", $body); + $this->assertStringContainsString('ValueBoxCopyJit::ensureLinked', $body); + } + + public function testVmValueCopyHoldsTypeSwitchSsot(): void + { + $vm = (string) file_get_contents(dirname(__DIR__, 2).'/lib/VM/VmValueCopy.php'); + $this->assertStringContainsString('#36193', $vm); + $this->assertStringContainsString('value_copy_string', $vm); + $this->assertStringContainsString('writeStringToValuePtrByAddref', $vm); + $this->assertStringContainsString('$context->refcount->addref($strPtr)', $vm); + $this->assertStringNotContainsString('lookupFunction(\'__string__separate\')', $vm); + } + + public function testValuePreDeclaresCopyShell(): void + { + foreach ([ + dirname(__DIR__, 2).'/lib/JIT/Builtin/Type/Value.php', + dirname(__DIR__, 2).'/lib/JIT/Builtin/Type/Value.pre', + ] as $path) { + $source = (string) file_get_contents($path); + $this->assertStringContainsString('__value__copy', $source, basename($path)); + $this->assertStringContainsString('#36193', $source, basename($path)); + } + } +} From 64a869100a8b453c28a5a0b01eadc36968d114c2 Mon Sep 17 00:00:00 2001 From: PurHur Date: Wed, 2 Sep 2026 06:02:58 +0000 Subject: [PATCH 2/2] Bootstrap: sync spine sidecar stamp after __value__copy spine entries (#36193) Co-authored-by: Cursor --- docs/bootstrap-inventory.md | 50 +++++++++++-------- .../.m3_compiler_lib_sidecar.sha | 2 +- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/docs/bootstrap-inventory.md b/docs/bootstrap-inventory.md index dfbd5203cd9..bf5349ba43b 100644 --- a/docs/bootstrap-inventory.md +++ b/docs/bootstrap-inventory.md @@ -8,11 +8,11 @@ Regenerate: `php script/bootstrap-inventory.php` | Metric | Count | |--------|------:| -| PHP files on vm.php path | 8072 | -| Phase A inventory files (M2 ratio SSOT) | 8072 | +| PHP files on vm.php path | 8073 | +| Phase A inventory files (M2 ratio SSOT) | 8073 | | Phase A ratio-deferred paths | 0 | | Source constructs flagged (blockers) | 0 | -| Source constructs flagged (warnings) | 25673 | +| Source constructs flagged (warnings) | 25674 | ## Compiler CFG gaps (`lib/Compiler.php`) @@ -7065,6 +7065,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag | `lib/JIT/JitLongArithOverflow.php` | 0 | 6 | | `lib/JIT/JitLongDiv.php` | 0 | 5 | | `lib/JIT/JitMemoryUsageArg.php` | 0 | 1 | +| `lib/JIT/JitNativeMethodReturn.php` | 0 | 1 | | `lib/JIT/JitNativeString.php` | 0 | 11 | | `lib/JIT/JitNestedHelperCoerce.php` | 0 | 1 | | `lib/JIT/JitNonNumericStringArithGuard.php` | 0 | 1 | @@ -31613,28 +31614,28 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `ext/standard/JitDateMutation.php` **Warnings** (review for bootstrap subset): -- new ArgumentCountError (line 94) -- new ArgumentCountError (line 358) -- new ArgumentCountError (line 646) -- new JITVariable (line 1214) -- new JITVariable (line 1233) -- new JITVariable (line 1245) -- new JITVariable (line 1449) -- new ArgumentCountError (line 1493) -- new ArgumentCountError (line 1519) -- new ArgumentCountError (line 1650) -- new ArgumentCountError (line 1691) -- new ArgumentCountError (line 1777) -- new ArgumentCountError (line 1823) -- new ArgumentCountError (line 1828) -- new ArgumentCountError (line 1904) -- new ArgumentCountError (line 2179) +- new ArgumentCountError (line 95) +- new ArgumentCountError (line 359) +- new ArgumentCountError (line 647) +- new JITVariable (line 1215) +- new JITVariable (line 1234) +- new JITVariable (line 1246) +- new JITVariable (line 1450) +- new ArgumentCountError (line 1494) +- new ArgumentCountError (line 1520) +- new ArgumentCountError (line 1646) +- new ArgumentCountError (line 1687) +- new ArgumentCountError (line 1773) +- new ArgumentCountError (line 1819) +- new ArgumentCountError (line 1824) +- new ArgumentCountError (line 1900) +- new ArgumentCountError (line 2175) - 66 class method(s) ### `ext/standard/JitDateOffsetGet.php` **Warnings** (review for bootstrap subset): -- new ArgumentCountError (line 26) +- new ArgumentCountError (line 27) - 3 class method(s) ### `ext/standard/JitDateParse.php` @@ -57069,8 +57070,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag ### `lib/JIT/Call/SplObjectStorageMethod.php` **Warnings** (review for bootstrap subset): -- new Variable (line 407) -- new Variable (line 453) +- new Variable (line 403) +- new Variable (line 449) - 12 class method(s) ### `lib/JIT/Call/SplPriorityQueueMethod.php` @@ -58507,6 +58508,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag **Warnings** (review for bootstrap subset): - 6 class method(s) +### `lib/JIT/JitNativeMethodReturn.php` + +**Warnings** (review for bootstrap subset): +- 4 class method(s) + ### `lib/JIT/JitNativeString.php` **Warnings** (review for bootstrap subset): diff --git a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha index 9ef02dc7911..5848e33d748 100755 --- a/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha +++ b/prelinked/bootstrap-gen0/.m3_compiler_lib_sidecar.sha @@ -1 +1 @@ -f934e92685b0ed40fc398adff707df7b937b185a +7eb6eb19aea26dbaef1672dcb44af8595659b7cf \ No newline at end of file