diff --git a/builtin-functions/kphp-light/functions.txt b/builtin-functions/kphp-light/functions.txt index 56485df27e..b40dbfd68b 100644 --- a/builtin-functions/kphp-light/functions.txt +++ b/builtin-functions/kphp-light/functions.txt @@ -131,7 +131,7 @@ function sched_yield_sleep($duration ::: float) ::: void; // === Component ================================================================================== -class ComponentQuery { +final class ComponentQuery { private function __construct() ::: \ComponentQuery; } diff --git a/cmake/popular-common.cmake b/cmake/popular-common.cmake index bf42ac2f09..4f7f977ba1 100644 --- a/cmake/popular-common.cmake +++ b/cmake/popular-common.cmake @@ -1,6 +1,8 @@ include_guard(GLOBAL) -set(LIGHT_COMMON_SOURCES crc32_generic.cpp md5.cpp algorithms/simd-int-to-string.cpp) +set(LIGHT_COMMON_SOURCES + crc32_generic.cpp md5.cpp algorithms/simd-int-to-string.cpp + algorithms/murmur-hash.cpp) if(COMPILE_RUNTIME_LIGHT) set(COMMON_SOURCES_FOR_COMP "${LIGHT_COMMON_SOURCES}") diff --git a/common/common.cmake b/common/common.cmake index 0e989f6792..56d5bb74f7 100644 --- a/common/common.cmake +++ b/common/common.cmake @@ -9,6 +9,7 @@ prepend(COMMON_MAIN_SOURCES ${COMMON_DIR}/ sha1.cpp allocators/freelist.cpp + algorithms/murmur-hash.cpp md5.cpp allocators/lockfree-slab.cpp server/main-binlog.cpp diff --git a/compiler/compiler.cmake b/compiler/compiler.cmake index b38ee4b4f4..28509e7354 100644 --- a/compiler/compiler.cmake +++ b/compiler/compiler.cmake @@ -15,6 +15,7 @@ endif() prepend(KPHP_COMPILER_COMMON ${COMMON_DIR}/ dl-utils-lite.cpp + algorithms/murmur-hash.cpp wrappers/fmt_format.cpp termformat/termformat.cpp tl2php/combinator-to-php.cpp diff --git a/compiler/data/class-data.h b/compiler/data/class-data.h index ee274bcc0c..ee2c1885e4 100644 --- a/compiler/data/class-data.h +++ b/compiler/data/class-data.h @@ -3,12 +3,13 @@ // Distributed under the GPL v3 License, see LICENSE.notice.txt #pragma once + #include +#include #include #include "common/algorithms/compare.h" #include "common/algorithms/hashes.h" - #include "compiler/data/class-members.h" #include "compiler/data/class-modifiers.h" #include "compiler/debug.h" @@ -174,8 +175,8 @@ class ClassData : public Lockable { void debugPrint(); - int get_hash() const { - return static_cast(vk::std_hash(name)); + int32_t get_hash() const { + return static_cast(vk::murmur_hash(name.data(), name.size())); } std::string get_subdir() const { diff --git a/runtime-light/stdlib/component/component-api.h b/runtime-light/stdlib/component/component-api.h index 4ab4c941b6..5d0f5c4228 100644 --- a/runtime-light/stdlib/component/component-api.h +++ b/runtime-light/stdlib/component/component-api.h @@ -8,6 +8,7 @@ #include #include +#include "common/algorithms/hashes.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-light/coroutine/task.h" @@ -33,7 +34,8 @@ struct C$ComponentQuery final : public refcountable_php_classes(std::hash{}(get_class())); + std::string_view name_view{C$ComponentQuery::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } ~C$ComponentQuery() { diff --git a/runtime-light/stdlib/job-worker/job-worker.h b/runtime-light/stdlib/job-worker/job-worker.h index 579e68d4ce..a650dad1d0 100644 --- a/runtime-light/stdlib/job-worker/job-worker.h +++ b/runtime-light/stdlib/job-worker/job-worker.h @@ -9,6 +9,7 @@ #include #include +#include "common/algorithms/hashes.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" @@ -19,7 +20,7 @@ namespace job_worker_impl_ { class ToArrayVisitor; -struct SendableBase : virtual abstract_refcountable_php_interface { +struct SendableBase : refcountable_polymorphic_php_classes_virt<> { virtual void accept(ToArrayVisitor & /*unused*/) noexcept {} @@ -58,16 +59,17 @@ struct C$KphpJobWorkerResponse : public job_worker_impl_::SendableBase { // === KphpJobWorkerResponseError ================================================================= -struct C$KphpJobWorkerResponseError : public refcountable_polymorphic_php_classes { +struct C$KphpJobWorkerResponseError : public C$KphpJobWorkerResponse { string error; - int64_t error_code; + int64_t error_code{}; const char *get_class() const noexcept override { return "KphpJobWorkerResponseError"; } int32_t get_hash() const noexcept override { - return static_cast(std::hash{}(get_class())); + std::string_view name_view{C$KphpJobWorkerResponseError::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } size_t virtual_builtin_sizeof() const noexcept override { @@ -83,10 +85,10 @@ inline class_instance f$KphpJobWorkerResponseError return v$this; } -inline string f$KphpJobWorkerResponseError$$getError(class_instance v$this) noexcept { +inline string f$KphpJobWorkerResponseError$$getError(const class_instance &v$this) noexcept { return v$this.get()->error; } -inline int64_t f$KphpJobWorkerResponseError$$getErrorCode(class_instance v$this) noexcept { +inline int64_t f$KphpJobWorkerResponseError$$getErrorCode(const class_instance &v$this) noexcept { return v$this.get()->error_code; } diff --git a/runtime-light/stdlib/rpc/rpc-extra-info.cpp b/runtime-light/stdlib/rpc/rpc-extra-info.cpp index 6ea409f2b3..5b9d88333d 100644 --- a/runtime-light/stdlib/rpc/rpc-extra-info.cpp +++ b/runtime-light/stdlib/rpc/rpc-extra-info.cpp @@ -4,21 +4,10 @@ #include "runtime-light/stdlib/rpc/rpc-extra-info.h" -#include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" -#include "runtime-light/stdlib/rpc/rpc-state.h" - -const char *C$KphpRpcRequestsExtraInfo::get_class() const noexcept { - return R"(KphpRpcRequestsExtraInfo)"; -} +#include +#include -int C$KphpRpcRequestsExtraInfo::get_hash() const noexcept { - return static_cast(vk::std_hash(vk::string_view(C$KphpRpcRequestsExtraInfo::get_class()))); -} - -array f$KphpRpcRequestsExtraInfo$$get(class_instance v$this) noexcept { - return v$this.get()->extra_info_arr; -} +#include "runtime-light/stdlib/rpc/rpc-state.h" Optional f$extract_kphp_rpc_response_extra_info(int64_t query_id) noexcept { auto &extra_info_map{RpcInstanceState::get().rpc_responses_extra_info}; diff --git a/runtime-light/stdlib/rpc/rpc-extra-info.h b/runtime-light/stdlib/rpc/rpc-extra-info.h index 7666ec2ff8..410c4d9aa7 100644 --- a/runtime-light/stdlib/rpc/rpc-extra-info.h +++ b/runtime-light/stdlib/rpc/rpc-extra-info.h @@ -5,8 +5,10 @@ #pragma once #include +#include #include +#include "common/algorithms/hashes.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" @@ -21,10 +23,19 @@ struct C$KphpRpcRequestsExtraInfo final : public refcountable_php_classes extra_info_arr; C$KphpRpcRequestsExtraInfo() = default; - const char *get_class() const noexcept; - int get_hash() const noexcept; + + constexpr const char *get_class() const noexcept { + return R"(KphpRpcRequestsExtraInfo)"; + } + + constexpr int32_t get_hash() const noexcept { + std::string_view name_view{C$KphpRpcRequestsExtraInfo::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); + } }; -array f$KphpRpcRequestsExtraInfo$$get(class_instance v$this) noexcept; +inline array f$KphpRpcRequestsExtraInfo$$get(const class_instance &v$this) noexcept { + return v$this.get()->extra_info_arr; +} Optional f$extract_kphp_rpc_response_extra_info(int64_t query_id) noexcept; diff --git a/runtime-light/stdlib/rpc/rpc-tl-function.h b/runtime-light/stdlib/rpc/rpc-tl-function.h index 272633c8a5..51251f3639 100644 --- a/runtime-light/stdlib/rpc/rpc-tl-function.h +++ b/runtime-light/stdlib/rpc/rpc-tl-function.h @@ -5,10 +5,11 @@ #pragma once #include +#include #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" +#include "runtime-common/core/runtime-core.h" struct tl_func_base; @@ -23,19 +24,21 @@ class InstanceDeepDestroyVisitor; // C$VK$TL$... should match that layout // this interface is implemented by all PHP classes that represent the TL functions (see tl-to-php) -struct C$VK$TL$RpcFunction : abstract_refcountable_php_interface { - virtual const char *get_class() const { +struct C$VK$TL$RpcFunction : refcountable_polymorphic_php_classes_virt<> { + virtual const char *get_class() const noexcept { return "VK\\TL\\RpcFunction"; } - virtual int32_t get_hash() const { - return static_cast(vk::std_hash(vk::string_view(C$VK$TL$RpcFunction::get_class()))); + + virtual int32_t get_hash() const noexcept { + std::string_view name_view{C$VK$TL$RpcFunction::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } - virtual void accept(ToArrayVisitor &) noexcept {} - virtual void accept(CommonMemoryEstimateVisitor &) noexcept {} - virtual void accept(InstanceReferencesCountingVisitor &) noexcept {} - virtual void accept(InstanceDeepCopyVisitor &) noexcept {} - virtual void accept(InstanceDeepDestroyVisitor &) noexcept {} + virtual void accept(ToArrayVisitor & /*unused*/) noexcept {} + virtual void accept(CommonMemoryEstimateVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceReferencesCountingVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceDeepCopyVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceDeepDestroyVisitor & /*unused*/) noexcept {} virtual size_t virtual_builtin_sizeof() const noexcept { return 0; @@ -50,19 +53,20 @@ struct C$VK$TL$RpcFunction : abstract_refcountable_php_interface { // every TL function has a class for the result that implements RpcFunctionReturnResult; // which has ->value of the required type -struct C$VK$TL$RpcFunctionReturnResult : abstract_refcountable_php_interface { - virtual const char *get_class() const { +struct C$VK$TL$RpcFunctionReturnResult : refcountable_polymorphic_php_classes_virt<> { + virtual const char *get_class() const noexcept { return "VK\\TL\\RpcFunctionReturnResult"; } - virtual int32_t get_hash() const { - return static_cast(vk::std_hash(vk::string_view(C$VK$TL$RpcFunctionReturnResult::get_class()))); + virtual int32_t get_hash() const noexcept { + std::string_view name_view{C$VK$TL$RpcFunctionReturnResult::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } - virtual void accept(ToArrayVisitor &) noexcept {} - virtual void accept(CommonMemoryEstimateVisitor &) noexcept {} - virtual void accept(InstanceReferencesCountingVisitor &) noexcept {} - virtual void accept(InstanceDeepCopyVisitor &) noexcept {} - virtual void accept(InstanceDeepDestroyVisitor &) noexcept {} + virtual void accept(ToArrayVisitor & /*unused*/) noexcept {} + virtual void accept(CommonMemoryEstimateVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceReferencesCountingVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceDeepCopyVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceDeepDestroyVisitor & /*unused*/) noexcept {} virtual size_t virtual_builtin_sizeof() const noexcept { return 0; @@ -76,20 +80,21 @@ struct C$VK$TL$RpcFunctionReturnResult : abstract_refcountable_php_interface { // function call response — ReqResult from the TL scheme — is a rpcResponseOk|rpcResponseHeader|rpcResponseError; // if it's rpcResponseOk or rpcResponseHeader, then their bodies can be retrieved by a fetcher that was returned by a store -struct C$VK$TL$RpcResponse : abstract_refcountable_php_interface { +struct C$VK$TL$RpcResponse : refcountable_polymorphic_php_classes_virt<> { using X = class_instance; - virtual void accept(ToArrayVisitor &) noexcept {} - virtual void accept(CommonMemoryEstimateVisitor &) noexcept {} - virtual void accept(InstanceReferencesCountingVisitor &) noexcept {} - virtual void accept(InstanceDeepCopyVisitor &) noexcept {} - virtual void accept(InstanceDeepDestroyVisitor &) noexcept {} + virtual void accept(ToArrayVisitor & /*unused*/) noexcept {} + virtual void accept(CommonMemoryEstimateVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceReferencesCountingVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceDeepCopyVisitor & /*unused*/) noexcept {} + virtual void accept(InstanceDeepDestroyVisitor & /*unused*/) noexcept {} - virtual const char *get_class() const { + virtual const char *get_class() const noexcept { return "VK\\TL\\RpcResponse"; } - virtual int32_t get_hash() const { - return static_cast(vk::std_hash(vk::string_view(C$VK$TL$RpcResponse::get_class()))); + virtual int32_t get_hash() const noexcept { + std::string_view name_view{C$VK$TL$RpcResponse::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } virtual size_t virtual_builtin_sizeof() const noexcept { diff --git a/runtime/datetime/date_interval.h b/runtime/datetime/date_interval.h index 0b2732b841..a86ac5e9f6 100644 --- a/runtime/datetime/date_interval.h +++ b/runtime/datetime/date_interval.h @@ -4,24 +4,29 @@ #pragma once +#include +#include + +#include "common/algorithms/hashes.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" #include "runtime/datetime/timelib_wrapper.h" -struct C$DateInterval: public refcountable_php_classes, private DummyVisitorMethods { +struct C$DateInterval : public refcountable_polymorphic_php_classes_virt<>, private DummyVisitorMethods { using DummyVisitorMethods::accept; timelib_rel_time *rel_time{nullptr}; - const char *get_class() const noexcept { + virtual const char *get_class() const noexcept { return R"(DateInterval)"; } - int get_hash() const noexcept { - return -393296726; + virtual int32_t get_hash() const noexcept { + std::string_view name_view{C$DateInterval::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } - ~C$DateInterval(); + ~C$DateInterval() override; }; class_instance f$DateInterval$$__construct(const class_instance &self, const string &duration) noexcept; diff --git a/runtime/datetime/datetime.h b/runtime/datetime/datetime.h index 33a54a1091..fa67546bf6 100644 --- a/runtime/datetime/datetime.h +++ b/runtime/datetime/datetime.h @@ -4,7 +4,10 @@ #pragma once -#include "runtime-common/core/class-instance/refcountable-php-classes.h" +#include +#include + +#include "common/algorithms/hashes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" #include "runtime/datetime/datetime_interface.h" @@ -13,18 +16,19 @@ struct C$DateInterval; struct C$DateTimeImmutable; -struct C$DateTime : public refcountable_polymorphic_php_classes, private DummyVisitorMethods { +struct C$DateTime : public C$DateTimeInterface, private DummyVisitorMethods { using DummyVisitorMethods::accept; - const char *get_class() const noexcept final { + const char *get_class() const noexcept override { return R"(DateTime)"; } - int get_hash() const noexcept final { - return 2141635158; + int32_t get_hash() const noexcept override { + std::string_view name_view{C$DateTime::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } - ~C$DateTime(); + ~C$DateTime() override; }; extern const string NOW; diff --git a/runtime/datetime/datetime_immutable.h b/runtime/datetime/datetime_immutable.h index 62964ba41c..c519d62b05 100644 --- a/runtime/datetime/datetime_immutable.h +++ b/runtime/datetime/datetime_immutable.h @@ -4,7 +4,10 @@ #pragma once -#include "runtime-common/core/class-instance/refcountable-php-classes.h" +#include +#include + +#include "common/algorithms/hashes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" #include "runtime/datetime/datetime_interface.h" @@ -13,18 +16,19 @@ struct C$DateInterval; struct C$DateTime; -struct C$DateTimeImmutable : public refcountable_polymorphic_php_classes, private DummyVisitorMethods { +struct C$DateTimeImmutable : public C$DateTimeInterface, private DummyVisitorMethods { using DummyVisitorMethods::accept; - const char *get_class() const noexcept final { + const char *get_class() const noexcept override { return R"(DateTimeImmutable)"; } - int get_hash() const noexcept final { - return 1600341038; + int32_t get_hash() const noexcept override { + std::string_view name_view{C$DateTimeImmutable::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } - ~C$DateTimeImmutable(); + ~C$DateTimeImmutable() override; }; extern const string NOW; diff --git a/runtime/datetime/datetime_interface.h b/runtime/datetime/datetime_interface.h index 86ecf365bc..c7d9f4f144 100644 --- a/runtime/datetime/datetime_interface.h +++ b/runtime/datetime/datetime_interface.h @@ -8,7 +8,7 @@ #include "runtime/datetime/timelib_wrapper.h" -struct C$DateTimeInterface : public abstract_refcountable_php_interface { +struct C$DateTimeInterface : public refcountable_polymorphic_php_classes_virt<> { timelib_time *time{nullptr}; virtual const char *get_class() const noexcept = 0; diff --git a/runtime/datetime/datetime_zone.h b/runtime/datetime/datetime_zone.h index 352e5532ae..62ca872ef5 100644 --- a/runtime/datetime/datetime_zone.h +++ b/runtime/datetime/datetime_zone.h @@ -4,22 +4,29 @@ #pragma once +#include +#include + +#include "common/algorithms/hashes.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" -struct C$DateTimeZone : public refcountable_php_classes, private DummyVisitorMethods { +struct C$DateTimeZone : public refcountable_polymorphic_php_classes_virt<>, private DummyVisitorMethods { using DummyVisitorMethods::accept; string timezone; - const char *get_class() const noexcept { + virtual const char *get_class() const noexcept { return R"(DateTimeZone)"; } - int get_hash() const noexcept { - return 219249843; + virtual int32_t get_hash() const noexcept { + std::string_view name_view{C$DateTimeZone::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } + + ~C$DateTimeZone() override = default; }; class_instance f$DateTimeZone$$__construct(const class_instance &self, const string &timezone) noexcept; diff --git a/runtime/exception.h b/runtime/exception.h index 1e5b1469ef..7922be17e3 100644 --- a/runtime/exception.h +++ b/runtime/exception.h @@ -4,10 +4,11 @@ #pragma once +#include +#include #include #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" @@ -23,7 +24,8 @@ struct C$Throwable : public refcountable_polymorphic_php_classes_virt<> { } virtual int32_t get_hash() const noexcept { - return static_cast(vk::std_hash(vk::string_view(get_class()))); + std::string_view name_view{get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } template diff --git a/runtime/ffi.h b/runtime/ffi.h index 6a1eebad50..8ceef66bec 100644 --- a/runtime/ffi.h +++ b/runtime/ffi.h @@ -4,6 +4,10 @@ #pragma once +#include +#include + +#include "common/algorithms/hashes.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" @@ -11,11 +15,15 @@ #include "runtime/allocator.h" template -struct C$FFI$CData: public refcountable_php_classes>, private DummyVisitorMethods { +struct C$FFI$CData final : public refcountable_php_classes>, private DummyVisitorMethods { T c_value; const char *get_class() const noexcept { return "FFI\\CData"; } - int get_hash() const noexcept { return 1945543994; } + + int32_t get_hash() const noexcept { + std::string_view name_view{C$FFI$CData::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); + } using DummyVisitorMethods::accept; }; @@ -99,12 +107,15 @@ struct CDataPtr { }; template -struct CDataRef { +struct CDataRef final { T *c_value; void accept(CommonMemoryEstimateVisitor &visitor __attribute__((unused))) {} const char *get_class() const noexcept { return "FFI\\CDataRef"; } - int get_hash() const noexcept { return -1965114283; } + int32_t get_hash() const noexcept { + std::string_view name_view{CDataRef::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); + } }; // CDataArrayRef is a non-owning pointer to a C array that keeps its length diff --git a/runtime/job-workers/job-interface.h b/runtime/job-workers/job-interface.h index b742a58cd8..aea195d385 100644 --- a/runtime/job-workers/job-interface.h +++ b/runtime/job-workers/job-interface.h @@ -4,9 +4,10 @@ #pragma once -#include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" +#include +#include +#include "common/algorithms/hashes.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime/instance-copy-processor.h" @@ -78,12 +79,13 @@ struct C$KphpJobWorkerResponseError: public refcountable_polymorphic_php_classes string error; int64_t error_code; - const char *get_class() const noexcept { + const char *get_class() const noexcept override { return R"(KphpJobWorkerResponseError)"; } - int get_hash() const noexcept { - return static_cast(vk::std_hash(vk::string_view(C$KphpJobWorkerResponseError::get_class()))); + int32_t get_hash() const noexcept override { + std::string_view name_view{C$KphpJobWorkerResponseError::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } template @@ -92,29 +94,29 @@ struct C$KphpJobWorkerResponseError: public refcountable_polymorphic_php_classes visitor("error_code", error_code); } - void accept(InstanceReferencesCountingVisitor &visitor) noexcept { + void accept(InstanceReferencesCountingVisitor &visitor) noexcept override { return generic_accept(visitor); } - void accept(InstanceDeepCopyVisitor &visitor) noexcept { + void accept(InstanceDeepCopyVisitor &visitor) noexcept override { return generic_accept(visitor); } - void accept(InstanceDeepDestroyVisitor &visitor) noexcept { + void accept(InstanceDeepDestroyVisitor &visitor) noexcept override { return generic_accept(visitor); } - void accept(ToArrayVisitor &visitor) noexcept { + void accept(ToArrayVisitor &visitor) noexcept override { return generic_accept(visitor); } - void accept(CommonMemoryEstimateVisitor &visitor) noexcept; + void accept(CommonMemoryEstimateVisitor &visitor) noexcept override; - size_t virtual_builtin_sizeof() const noexcept { + size_t virtual_builtin_sizeof() const noexcept override { return sizeof(*this); } - C$KphpJobWorkerResponseError* virtual_builtin_clone() const noexcept { + C$KphpJobWorkerResponseError* virtual_builtin_clone() const noexcept override { return new C$KphpJobWorkerResponseError{*this}; } }; diff --git a/runtime/memcache.h b/runtime/memcache.h index 25e3ddc9a6..f17e6b3c3b 100644 --- a/runtime/memcache.h +++ b/runtime/memcache.h @@ -5,9 +5,9 @@ #pragma once #include +#include #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" #include "runtime-common/stdlib/visitors/memory-visitors.h" @@ -51,12 +51,13 @@ class C$McMemcache final : public refcountable_polymorphic_php_classes{}); } - const char *get_class() const final { + const char *get_class() const override { return "McMemcache"; } - int32_t get_hash() const final { - return static_cast(vk::std_hash(vk::string_view(C$McMemcache::get_class()))); + int32_t get_hash() const override { + std::string_view name_view{C$McMemcache::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } virtual C$McMemcache* virtual_builtin_clone() const noexcept { diff --git a/runtime/pdo/pdo.h b/runtime/pdo/pdo.h index 9502212e47..8b84e1cf45 100644 --- a/runtime/pdo/pdo.h +++ b/runtime/pdo/pdo.h @@ -4,16 +4,17 @@ #pragma once +#include #include +#include #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" #include "runtime/pdo/abstract_pdo_driver.h" -struct C$PDO : public refcountable_polymorphic_php_classes, private DummyVisitorMethods { +struct C$PDO : public refcountable_polymorphic_php_classes_virt<>, private DummyVisitorMethods { static constexpr int ATTR_TIMEOUT = 2; std::unique_ptr driver; @@ -26,20 +27,20 @@ struct C$PDO : public refcountable_polymorphic_php_classes(vk::std_hash(vk::string_view(C$PDO::get_class()))); + std::string_view name_view{C$PDO::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } using DummyVisitorMethods::accept; }; class_instance f$PDO$$__construct(class_instance const &v$this, const string &dsn, const Optional &username = {}, - const Optional &password = {}, const Optional> &options= {}) noexcept; + const Optional &password = {}, const Optional> &options = {}) noexcept; struct C$PDOStatement; class_instance f$PDO$$prepare(const class_instance &v$this, const string &query, const array &options = {}) noexcept; - class_instance f$PDO$$query(const class_instance &v$this, const string &query, Optional fetchMode = {}); Optional f$PDO$$exec(const class_instance &v$this, const string &query); diff --git a/runtime/pdo/pdo_statement.h b/runtime/pdo/pdo_statement.h index e3bbaab260..b78f2dc42a 100644 --- a/runtime/pdo/pdo_statement.h +++ b/runtime/pdo/pdo_statement.h @@ -4,27 +4,29 @@ #pragma once +#include #include +#include #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" #include "runtime/pdo/abstract_pdo_statement.h" -struct C$PDOStatement : public refcountable_polymorphic_php_classes, private DummyVisitorMethods { +struct C$PDOStatement : public refcountable_polymorphic_php_classes_virt<>, private DummyVisitorMethods { std::unique_ptr statement; int64_t timeout_sec{-1}; - virtual ~C$PDOStatement() = default; + ~C$PDOStatement() override = default; virtual const char *get_class() const noexcept { return "PDOStatement"; } virtual int32_t get_hash() const noexcept { - return static_cast(vk::std_hash(vk::string_view(C$PDOStatement::get_class()))); + std::string_view name_view{C$PDOStatement::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } using DummyVisitorMethods::accept; diff --git a/runtime/rpc.h b/runtime/rpc.h index 600ba72ce9..8de1af4b72 100644 --- a/runtime/rpc.h +++ b/runtime/rpc.h @@ -4,7 +4,9 @@ #pragma once +#include #include +#include #include "common/algorithms/hashes.h" #include "common/kprintf.h" @@ -134,8 +136,9 @@ struct C$RpcConnection final : public refcountable_php_classes, return R"(RpcConnection)"; } - int get_hash() const noexcept { - return static_cast(vk::std_hash(vk::string_view(C$RpcConnection::get_class()))); + int32_t get_hash() const noexcept { + std::string_view name_view{C$RpcConnection::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } using DummyVisitorMethods::accept; diff --git a/runtime/rpc_extra_info.h b/runtime/rpc_extra_info.h index c64bd8c370..3f288799c0 100644 --- a/runtime/rpc_extra_info.h +++ b/runtime/rpc_extra_info.h @@ -4,16 +4,16 @@ #pragma once -#include #include +#include +#include #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" -using rpc_request_extra_info_t = std::tuple; // tuple(request_size) +using rpc_request_extra_info_t = std::tuple; // tuple(request_size) using rpc_response_extra_info_t = std::tuple; // tuple(response_size, response_time) enum class rpc_response_extra_info_status_t : std::uint8_t { NOT_READY, READY }; @@ -30,8 +30,9 @@ struct C$KphpRpcRequestsExtraInfo final : public refcountable_php_classes(vk::std_hash(vk::string_view(C$KphpRpcRequestsExtraInfo::get_class()))); + int32_t get_hash() const noexcept { + std::string_view name_view{C$KphpRpcRequestsExtraInfo::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } }; diff --git a/runtime/spl/array_iterator.h b/runtime/spl/array_iterator.h index 09aba5d0cf..b92935fd27 100644 --- a/runtime/spl/array_iterator.h +++ b/runtime/spl/array_iterator.h @@ -4,14 +4,16 @@ #pragma once +#include +#include + #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" #include "runtime-common/core/runtime-core.h" #include "runtime-common/stdlib/visitors/dummy-visitor-methods.h" // C$ArrayIterator implements SPL ArrayIterator class. -struct C$ArrayIterator : public refcountable_php_classes, private DummyVisitorMethods { +struct C$ArrayIterator final : public refcountable_php_classes, private DummyVisitorMethods { // we store an array to keep a living reference to it while iterator is valid; // also we may implement rewind() method later if we feel like it array arr; @@ -23,7 +25,8 @@ struct C$ArrayIterator : public refcountable_php_classes, priva } int32_t get_hash() const noexcept { - return static_cast(vk::std_hash(vk::string_view(get_class()))); + std::string_view name_view{C$ArrayIterator::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); } using DummyVisitorMethods::accept; diff --git a/runtime/tl/rpc_function.h b/runtime/tl/rpc_function.h index 31a69d61e4..28d43bec56 100644 --- a/runtime/tl/rpc_function.h +++ b/runtime/tl/rpc_function.h @@ -4,11 +4,13 @@ #pragma once +#include #include +#include #include "common/algorithms/hashes.h" -#include "common/wrappers/string_view.h" #include "runtime-common/core/class-instance/refcountable-php-classes.h" +#include "runtime-common/core/runtime-core.h" struct tl_func_base; @@ -25,7 +27,10 @@ class InstanceDeepDestroyVisitor; // this interface is implemented by all PHP classes that represent the TL functions (see tl-to-php) struct C$VK$TL$RpcFunction : abstract_refcountable_php_interface { virtual const char *get_class() const { return "VK\\TL\\RpcFunction"; } - virtual int32_t get_hash() const { return static_cast(vk::std_hash(vk::string_view(C$VK$TL$RpcFunction::get_class()))); } + virtual int32_t get_hash() const { + std::string_view name_view{C$VK$TL$RpcFunction::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); + } virtual void accept(ToArrayVisitor &) noexcept {} virtual void accept(CommonMemoryEstimateVisitor &) noexcept {} @@ -44,7 +49,10 @@ struct C$VK$TL$RpcFunction : abstract_refcountable_php_interface { // which has ->value of the required type struct C$VK$TL$RpcFunctionReturnResult : abstract_refcountable_php_interface { virtual const char *get_class() const { return "VK\\TL\\RpcFunctionReturnResult"; } - virtual int32_t get_hash() const { return static_cast(vk::std_hash(vk::string_view(C$VK$TL$RpcFunctionReturnResult::get_class()))); } + virtual int32_t get_hash() const { + std::string_view name_view{C$VK$TL$RpcFunctionReturnResult::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); + } virtual void accept(ToArrayVisitor &) noexcept {} virtual void accept(CommonMemoryEstimateVisitor &) noexcept {} @@ -70,7 +78,10 @@ struct C$VK$TL$RpcResponse : abstract_refcountable_php_interface { virtual void accept(InstanceDeepDestroyVisitor &) noexcept {} virtual const char *get_class() const { return "VK\\TL\\RpcResponse"; } - virtual int32_t get_hash() const { return static_cast(vk::std_hash(vk::string_view(C$VK$TL$RpcResponse::get_class()))); } + virtual int32_t get_hash() const { + std::string_view name_view{C$VK$TL$RpcResponse::get_class()}; + return static_cast(vk::murmur_hash(name_view.data(), name_view.size())); + } virtual size_t virtual_builtin_sizeof() const noexcept { return 0; } virtual C$VK$TL$RpcResponse *virtual_builtin_clone() const noexcept { return nullptr; } diff --git a/server/confdata-binlog-events.h b/server/confdata-binlog-events.h index 06cececc6d..b71fe540d5 100644 --- a/server/confdata-binlog-events.h +++ b/server/confdata-binlog-events.h @@ -5,10 +5,10 @@ #pragma once #include "common/type_traits/list_of_types.h" -#include "server/pmemcached-binlog-interface.h" - +#include "common/wrappers/string_view.h" #include "runtime-common/core/runtime-core.h" #include "runtime/memcache.h" +#include "server/pmemcached-binlog-interface.h" namespace impl_ {