diff --git a/common.gypi b/common.gypi index 6699826d269568..c77038c3cee21b 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.13', + 'v8_embedder_string': '-node.14', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/interpreter/bytecode-generator.cc b/deps/v8/src/interpreter/bytecode-generator.cc index 001ebfd0cf5b86..750ce0e0a22141 100644 --- a/deps/v8/src/interpreter/bytecode-generator.cc +++ b/deps/v8/src/interpreter/bytecode-generator.cc @@ -1889,17 +1889,28 @@ bool IsSwitchOptimizable(SwitchStatement* stmt, SwitchInfo* info) { } // GCC also jump-table optimizes switch statements with 6 cases or more. - if (!(static_cast(info->covered_cases.size()) >= - FLAG_switch_table_min_cases && - IsSpreadAcceptable(info->MaxCase() - info->MinCase(), - cases->length()))) { - // Invariant- covered_cases has all cases and only cases that will go in the - // jump table. - info->covered_cases.clear(); - return false; - } else { - return true; - } + if (static_cast(info->covered_cases.size()) >= + FLAG_switch_table_min_cases) { + // Due to case spread will be used as the size of jump-table, + // we need to check if it doesn't overflow by casting its + // min and max bounds to int64_t, and calculate if the difference is less + // than or equal to INT_MAX. + int64_t min = static_cast(info->MinCase()); + int64_t max = static_cast(info->MaxCase()); + int64_t spread = max - min + 1; + + DCHECK_GT(spread, 0); + + // Check if casted spread is acceptable and doesn't overflow. + if (spread <= INT_MAX && + IsSpreadAcceptable(static_cast(spread), cases->length())) { + return true; + } + } + // Invariant- covered_cases has all cases and only cases that will go in the + // jump table. + info->covered_cases.clear(); + return false; } } // namespace