From 79836df94a315ac75e39d35503bd202a6431d4a4 Mon Sep 17 00:00:00 2001 From: Paul Bissonnette Date: Mon, 12 Feb 2018 09:48:20 -0800 Subject: [PATCH] Add option to disable parameter type compatibility checks Summary: hh_server can already do a more sophisticated version of this check (properly accounting for type aliases, and class co/contra-variance) which the simple string comparison in hhvm can't handle. An audit of hhbbc suggests we don't actually use this particular invariant anywhere, and enforcing it in the same fashion as hack would require changes to the way autoloading is observed when classes are loaded. Since it isn't adding much value add an option to suppress it. Reviewed By: markw65 Differential Revision: D6963404 fbshipit-source-id: 0845057e64ea6cd0331feda3291cd66a64127879 --- hphp/runtime/base/runtime-option.cpp | 4 ++++ hphp/runtime/base/runtime-option.h | 1 + hphp/runtime/vm/class.cpp | 2 ++ hphp/test/quick/impl_abstract_dv_2a.php.opts | 1 + hphp/test/quick/impl_abstract_dv_3a.php.opts | 1 + hphp/test/quick/impl_abstract_dv_as.php.opts | 1 + hphp/test/quick/impl_abstract_dv_ia.php.opts | 1 + hphp/test/quick/impl_abstract_dv_id.php.opts | 1 + hphp/test/quick/impl_abstract_dv_io.php.opts | 1 + hphp/test/quick/impl_abstract_dv_is.php.opts | 1 + hphp/test/quick/impl_abstract_dv_sa.php.opts | 1 + hphp/test/quick/impl_abstract_dv_si.php.opts | 1 + hphp/test/quick/impl_abstract_dv_so.php.opts | 1 + 13 files changed, 17 insertions(+) create mode 100644 hphp/test/quick/impl_abstract_dv_2a.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_3a.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_as.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_ia.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_id.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_io.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_is.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_sa.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_si.php.opts create mode 100644 hphp/test/quick/impl_abstract_dv_so.php.opts diff --git a/hphp/runtime/base/runtime-option.cpp b/hphp/runtime/base/runtime-option.cpp index 48bd6b80557..046c352ec8d 100644 --- a/hphp/runtime/base/runtime-option.cpp +++ b/hphp/runtime/base/runtime-option.cpp @@ -105,6 +105,7 @@ bool RuntimeOption::CheckFlushOnUserClose = true; bool RuntimeOption::EvalAuthoritativeMode = false; bool RuntimeOption::IntsOverflowToInts = false; bool RuntimeOption::AutoprimeGenerators = true; +bool RuntimeOption::CheckParamTypeInvariance = true; uint32_t RuntimeOption::EvalInitialStaticStringTableSize = kDefaultInitialStaticStringTableSize; uint32_t RuntimeOption::EvalInitialNamedEntityTableSize = 30000; @@ -1144,6 +1145,9 @@ void RuntimeOption::Load( Config::Bind(EvalInitialStaticStringTableSize, ini, config, "Eval.InitialStaticStringTableSize", EvalInitialStaticStringTableSize); + Config::Bind(CheckParamTypeInvariance, ini, config, + "Eval.CheckParamTypeInvariance", + !EnableHipHopSyntax); if (EnableHipHopSyntax) { // If EnableHipHopSyntax is true, it forces EnableXHP to true diff --git a/hphp/runtime/base/runtime-option.h b/hphp/runtime/base/runtime-option.h index e95c8029738..94f91604c81 100644 --- a/hphp/runtime/base/runtime-option.h +++ b/hphp/runtime/base/runtime-option.h @@ -398,6 +398,7 @@ struct RuntimeOption { static bool EnableShortTags; static bool EnableAspTags; static bool EnableXHP; + static bool CheckParamTypeInvariance; static bool EnableObjDestructCall; static bool EnableEmitterStats; static bool EnableIntrinsicsExtension; diff --git a/hphp/runtime/vm/class.cpp b/hphp/runtime/vm/class.cpp index 83f77028847..94f51d9ac96 100644 --- a/hphp/runtime/vm/class.cpp +++ b/hphp/runtime/vm/class.cpp @@ -1516,6 +1516,8 @@ inline void raiseIncompat(const PreClass* implementor, static bool checkTypeConstraint(const PreClass* implCls, const Class* iface, TypeConstraint tc, TypeConstraint itc) { + if (!RuntimeOption::CheckParamTypeInvariance) return true; + const StringData* iSelf; const StringData* iParent; if (isTrait(iface)) { diff --git a/hphp/test/quick/impl_abstract_dv_2a.php.opts b/hphp/test/quick/impl_abstract_dv_2a.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_2a.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_3a.php.opts b/hphp/test/quick/impl_abstract_dv_3a.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_3a.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_as.php.opts b/hphp/test/quick/impl_abstract_dv_as.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_as.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_ia.php.opts b/hphp/test/quick/impl_abstract_dv_ia.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_ia.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_id.php.opts b/hphp/test/quick/impl_abstract_dv_id.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_id.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_io.php.opts b/hphp/test/quick/impl_abstract_dv_io.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_io.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_is.php.opts b/hphp/test/quick/impl_abstract_dv_is.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_is.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_sa.php.opts b/hphp/test/quick/impl_abstract_dv_sa.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_sa.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_si.php.opts b/hphp/test/quick/impl_abstract_dv_si.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_si.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 diff --git a/hphp/test/quick/impl_abstract_dv_so.php.opts b/hphp/test/quick/impl_abstract_dv_so.php.opts new file mode 100644 index 00000000000..6abbc7d6cd4 --- /dev/null +++ b/hphp/test/quick/impl_abstract_dv_so.php.opts @@ -0,0 +1 @@ +-vEval.CheckParamTypeInvariance=1 -- 2.11.4.GIT