6a7872b7b8
The new node is introduced for literal string addition and calling String.prototype.concat in the typed lowering phase. It later might get optimized away during redundancy elimination, keeping the performance of already existing benchmarks with string addition. In case the operation is about to throw (due to too long string being constructed) we just deoptimize, reusing the interpreter logic for creating the error. Modify relevant mjsunit and unit tests for string concatenation. Bug: v8:7902 Change-Id: Ie97d39534df4480fa8d4fe3ba276d02ed5e750e3 Reviewed-on: https://chromium-review.googlesource.com/1193342 Commit-Queue: Maya Lekova <mslekova@chromium.org> Reviewed-by: Jaroslav Sevcik <jarin@chromium.org> Cr-Commit-Position: refs/heads/master@{#55482}
97 lines
1.6 KiB
JavaScript
97 lines
1.6 KiB
JavaScript
// Copyright 2016 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.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
// Test that string concatenation overflow (going over string max length)
|
|
// is handled gracefully, i.e. an error is thrown
|
|
|
|
var a = "a".repeat(%StringMaxLength());
|
|
|
|
(function() {
|
|
function foo(a, b) {
|
|
try {
|
|
return a + "0123456789012";
|
|
} catch (e) {
|
|
return e;
|
|
}
|
|
}
|
|
|
|
foo("a");
|
|
foo("a");
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo("a");
|
|
assertInstanceof(foo(a), RangeError);
|
|
})();
|
|
|
|
(function() {
|
|
function foo(a, b) {
|
|
try {
|
|
return "0123456789012" + a;
|
|
} catch (e) {
|
|
return e;
|
|
}
|
|
}
|
|
|
|
foo("a");
|
|
foo("a");
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo("a");
|
|
assertInstanceof(foo(a), RangeError);
|
|
})();
|
|
|
|
(function() {
|
|
function foo(a, b) {
|
|
try {
|
|
return "0123456789012".concat(a);
|
|
} catch (e) {
|
|
return e;
|
|
}
|
|
}
|
|
|
|
foo("a");
|
|
foo("a");
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo("a");
|
|
assertInstanceof(foo(a), RangeError);
|
|
})();
|
|
|
|
var obj = {
|
|
toString: function() {
|
|
throw new Error('toString has thrown');
|
|
}
|
|
};
|
|
|
|
(function() {
|
|
function foo(a, b) {
|
|
try {
|
|
return "0123456789012" + obj;
|
|
} catch (e) {
|
|
return e;
|
|
}
|
|
}
|
|
|
|
foo("a");
|
|
foo("a");
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo("a");
|
|
assertInstanceof(foo(a), Error);
|
|
})();
|
|
|
|
(function() {
|
|
function foo(a, b) {
|
|
try {
|
|
return a + 123;
|
|
} catch (e) {
|
|
return e;
|
|
}
|
|
}
|
|
|
|
foo("a");
|
|
foo("a");
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo("a");
|
|
assertInstanceof(foo(a), RangeError);
|
|
})();
|