Commit 6803fd9f authored by Yang Guo's avatar Yang Guo Committed by Commit Bot

[debug] extend debug-evaluate to Date, Boolean, global functions.

Also add tests for operators.

BUG=v8:5821

Change-Id: I76cfde94324c7f05de61cb60f26d5168da0a9aa5
Reviewed-on: https://chromium-review.googlesource.com/456500Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Commit-Queue: Yang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#43922}
parent 55d269c7
...@@ -377,6 +377,7 @@ bool BytecodeHasNoSideEffect(interpreter::Bytecode bytecode) { ...@@ -377,6 +377,7 @@ bool BytecodeHasNoSideEffect(interpreter::Bytecode bytecode) {
// Allocations. // Allocations.
case Bytecode::kCreateClosure: case Bytecode::kCreateClosure:
case Bytecode::kCreateUnmappedArguments: case Bytecode::kCreateUnmappedArguments:
case Bytecode::kCreateRestParameter:
// Conversions. // Conversions.
case Bytecode::kToObject: case Bytecode::kToObject:
case Bytecode::kToNumber: case Bytecode::kToNumber:
...@@ -433,6 +434,41 @@ bool BuiltinHasNoSideEffect(Builtins::Name id) { ...@@ -433,6 +434,41 @@ bool BuiltinHasNoSideEffect(Builtins::Name id) {
case Builtins::kArrayForEach: case Builtins::kArrayForEach:
case Builtins::kArrayEvery: case Builtins::kArrayEvery:
case Builtins::kArraySome: case Builtins::kArraySome:
// Boolean bulitins.
case Builtins::kBooleanConstructor:
case Builtins::kBooleanPrototypeToString:
case Builtins::kBooleanPrototypeValueOf:
// Date builtins.
case Builtins::kDateConstructor:
case Builtins::kDateNow:
case Builtins::kDateParse:
case Builtins::kDatePrototypeGetDate:
case Builtins::kDatePrototypeGetDay:
case Builtins::kDatePrototypeGetFullYear:
case Builtins::kDatePrototypeGetHours:
case Builtins::kDatePrototypeGetMilliseconds:
case Builtins::kDatePrototypeGetMinutes:
case Builtins::kDatePrototypeGetMonth:
case Builtins::kDatePrototypeGetSeconds:
case Builtins::kDatePrototypeGetTime:
case Builtins::kDatePrototypeGetTimezoneOffset:
case Builtins::kDatePrototypeGetUTCDate:
case Builtins::kDatePrototypeGetUTCDay:
case Builtins::kDatePrototypeGetUTCFullYear:
case Builtins::kDatePrototypeGetUTCHours:
case Builtins::kDatePrototypeGetUTCMilliseconds:
case Builtins::kDatePrototypeGetUTCMinutes:
case Builtins::kDatePrototypeGetUTCMonth:
case Builtins::kDatePrototypeGetUTCSeconds:
case Builtins::kDatePrototypeGetYear:
case Builtins::kDatePrototypeToDateString:
case Builtins::kDatePrototypeToISOString:
case Builtins::kDatePrototypeToUTCString:
case Builtins::kDatePrototypeToString:
case Builtins::kDatePrototypeToTimeString:
case Builtins::kDatePrototypeToJson:
case Builtins::kDatePrototypeToPrimitive:
case Builtins::kDatePrototypeValueOf:
// Math builtins. // Math builtins.
case Builtins::kMathAbs: case Builtins::kMathAbs:
case Builtins::kMathAcos: case Builtins::kMathAcos:
...@@ -511,6 +547,13 @@ bool BuiltinHasNoSideEffect(Builtins::Name id) { ...@@ -511,6 +547,13 @@ bool BuiltinHasNoSideEffect(Builtins::Name id) {
// JSON builtins. // JSON builtins.
case Builtins::kJsonParse: case Builtins::kJsonParse:
case Builtins::kJsonStringify: case Builtins::kJsonStringify:
// Global function builtins.
case Builtins::kGlobalDecodeURI:
case Builtins::kGlobalDecodeURIComponent:
case Builtins::kGlobalEncodeURI:
case Builtins::kGlobalEncodeURIComponent:
case Builtins::kGlobalEscape:
case Builtins::kGlobalUnescape:
// Error builtins. // Error builtins.
case Builtins::kMakeError: case Builtins::kMakeError:
case Builtins::kMakeTypeError: case Builtins::kMakeTypeError:
......
// Copyright 2017 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: --ignition --turbo
Debug = debug.Debug
var exception = null;
var date = new Date();
function listener(event, exec_state, event_data, data) {
if (event != Debug.DebugEvent.Break) return;
try {
function success(expectation, source) {
var result = exec_state.frame(0).evaluate(source, true).value();
if (expectation !== undefined) assertEquals(expectation, result);
}
function fail(source) {
assertThrows(() => exec_state.frame(0).evaluate(source, true),
EvalError);
}
// Test Date.prototype functions.
success(undefined, `Date()`);
success(undefined, `new Date()`);
success(undefined, `Date.now()`);
success(undefined, `Date.parse(1)`);
for (f of Object.getOwnPropertyNames(Date.prototype)) {
if (typeof Date.prototype[f] === "function") {
if (f.startsWith("set") || f.startsWith("toLocale")) {
fail(`date.${f}(5);`, true);
} else {
success(undefined, `date.${f}();`, true);
}
}
}
// Test Boolean.
success(true, `Boolean(1)`);
success(new Boolean(true), `new Boolean(1)`);
success("true", `true.toString()`);
success(true, `true.valueOf()`);
// Test global functions.
success(1, `parseInt("1")`);
success(1.3, `parseFloat("1.3")`);
success("abc", `decodeURI("abc")`);
success("abc", `encodeURI("abc")`);
success("abc", `decodeURIComponent("abc")`);
success("abc", `encodeURIComponent("abc")`);
success("abc", `escape("abc")`);
success("abc", `unescape("abc")`);
} catch (e) {
exception = e;
print(e, e.stack);
};
};
// Add the debug event listener.
Debug.setListener(listener);
function f() {
debugger;
};
f();
assertNull(exception);
...@@ -24,6 +24,7 @@ function listener(event, exec_state, event_data, data) { ...@@ -24,6 +24,7 @@ function listener(event, exec_state, event_data, data) {
} }
// Test some Object functions. // Test some Object functions.
success({}, `new Object()`);
success({p : 3}, `Object.create({}, { p: { value: 3 } })`); success({p : 3}, `Object.create({}, { p: { value: 3 } })`);
success("[[\"a\",1],[\"b\",2]]", success("[[\"a\",1],[\"b\",2]]",
`JSON.stringify(Object.entries({a:1, b:2}))`); `JSON.stringify(Object.entries({a:1, b:2}))`);
...@@ -58,6 +59,7 @@ function listener(event, exec_state, event_data, data) { ...@@ -58,6 +59,7 @@ function listener(event, exec_state, event_data, data) {
success(3, `(object_with_callbacks).valueOf()`); success(3, `(object_with_callbacks).valueOf()`);
// Test Array functions. // Test Array functions.
success([], `new Array()`);
var function_param = [ var function_param = [
"forEach", "every", "some", "reduce", "reduceRight", "find", "filter", "forEach", "every", "some", "reduce", "reduceRight", "find", "filter",
"map", "findIndex" "map", "findIndex"
...@@ -91,6 +93,7 @@ function listener(event, exec_state, event_data, data) { ...@@ -91,6 +93,7 @@ function listener(event, exec_state, event_data, data) {
} }
// Test Number functions. // Test Number functions.
success(new Number(0), `new Number()`);
for (f of Object.getOwnPropertyNames(Number)) { for (f of Object.getOwnPropertyNames(Number)) {
if (typeof Number[f] === "function") { if (typeof Number[f] === "function") {
success(Number[f](0.5), `Number.${f}(0.5);`); success(Number[f](0.5), `Number.${f}(0.5);`);
...@@ -104,6 +107,7 @@ function listener(event, exec_state, event_data, data) { ...@@ -104,6 +107,7 @@ function listener(event, exec_state, event_data, data) {
} }
// Test String functions. // Test String functions.
success(new String(), `new String()`);
success(" ", "String.fromCodePoint(0x20)"); success(" ", "String.fromCodePoint(0x20)");
success(" ", "String.fromCharCode(0x20)"); success(" ", "String.fromCharCode(0x20)");
for (f of Object.getOwnPropertyNames(String.prototype)) { for (f of Object.getOwnPropertyNames(String.prototype)) {
......
// Copyright 2017 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: --ignition --turbo
Debug = debug.Debug
var exception = null;
var date = new Date();
var T = true;
var F = false;
var one = 1;
var two = 2;
var string = "s";
var array = [1, 2, 3];
function max(...rest) {
return Math.max(...rest);
}
function def(a = 1) {
return a;
}
function d1([a, b = 'b']) {
return a + b;
}
function d2({ x: c, y, z = 'z' } = {x: 'x', y: 'y' }) {
return c + y + z;
}
function listener(event, exec_state, event_data, data) {
if (event != Debug.DebugEvent.Break) return;
try {
function success(expectation, source) {
var result = exec_state.frame(0).evaluate(source, true).value();
if (expectation !== undefined) assertEquals(expectation, result);
}
function fail(source) {
assertThrows(() => exec_state.frame(0).evaluate(source, true),
EvalError);
}
success(false, `Object == {}`);
success(false, `Object === {}`);
success(true, `Object != {}`);
success(true, `Object !== {}`);
success(true, `'s' == string`);
success(true, `'s' === string`);
success(true, `1 < Math.cos(0) * 2`);
success(false, `1 < string`);
success(true, `'a' < string`);
success("s", `string[0]`);
success(0, `[0][0]`);
success(1, `T^F`);
success(0, `T&F`);
success(1, `T|F`);
success(false, `T&&F`);
success(true, `T||F`);
success(false, `T?F:T`);
success(false, `!T`);
success(-2, `~one`);
success(4, `one << two`);
success(1, `two >> one`);
success(1, `two >>> one`);
success(3, `two + one`);
success(2, `two * one`);
success(0.5, `one / two`);
success(0, `(one / two) | 0`);
success(1, `one ** two`);
success(NaN, `string * two`);
success("s2", `string + two`);
success("s2", `string + two`);
fail(`[...array]`);
success(3, `max(...array)`);
fail(`({[string]:1})`);
fail(`[a, b] = [1, 2]`);
success(2, `def(2)`);
success(1, `def()`);
fail(`d1(['a'])`); // Iterator.prototype.next performs stores.
success("XYz", `d2({x:'X', y:'Y'})`);
} catch (e) {
exception = e;
print(e, e.stack);
};
};
// Add the debug event listener.
Debug.setListener(listener);
function f() {
debugger;
};
f();
assertNull(exception);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment