64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
|
// Copyright 2015 the V8 project authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
// Crankshaft changes the stack usage and messes up the binary search for the
|
||
|
// stack depth that causes a stack overflow. The issue only arises without
|
||
|
// regexp optimization, which can happen on pages that create a lot of regexps.
|
||
|
// Flags: --nocrankshaft --noregexp-optimization
|
||
|
|
||
|
// Should not crash with a stack overflow in the regexp compiler, even when the
|
||
|
// JS has used most of the stack.
|
||
|
function use_space_then_do_test(depth) {
|
||
|
try {
|
||
|
// The "+ depth" is to avoid the regexp compilation cache.
|
||
|
var regexp_src = repeat(".(.)", 12) + depth;
|
||
|
use_space(depth, regexp_src);
|
||
|
return true;
|
||
|
} catch (e) {
|
||
|
assertFalse(("" + e).indexOf("tack") == -1); // Check for [Ss]tack.
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function use_space(n, regexp_src) {
|
||
|
if (--n == 0) {
|
||
|
do_test(regexp_src);
|
||
|
return;
|
||
|
}
|
||
|
use_space(n, regexp_src);
|
||
|
}
|
||
|
|
||
|
function repeat(str, n) {
|
||
|
var answer = "";
|
||
|
while (n-- != 0) {
|
||
|
answer += str;
|
||
|
}
|
||
|
return answer;
|
||
|
}
|
||
|
|
||
|
var subject = repeat("y", 200);
|
||
|
|
||
|
function do_test(regexp_src) {
|
||
|
var re = new RegExp(regexp_src);
|
||
|
re.test(subject);
|
||
|
}
|
||
|
|
||
|
function try_different_stack_limits() {
|
||
|
var lower = 100;
|
||
|
var higher = 100000;
|
||
|
while (lower < higher - 1) {
|
||
|
var average = Math.floor((lower + higher) / 2);
|
||
|
if (use_space_then_do_test(average)) {
|
||
|
lower = average;
|
||
|
} else {
|
||
|
higher = average;
|
||
|
}
|
||
|
}
|
||
|
for (var i = lower - 5; i < higher + 5; i++) {
|
||
|
use_space_then_do_test(i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
try_different_stack_limits();
|