| Index: test/mjsunit/debug-evaluate-locals-optimized.js
|
| diff --git a/test/mjsunit/debug-evaluate-locals-optimized.js b/test/mjsunit/debug-evaluate-locals-optimized.js
|
| index c3cd5eb2eb8311d14db0c652b514da049e1fdefb..485f752f5c5b5eadac0cea33b79dd3d5e307dfe1 100644
|
| --- a/test/mjsunit/debug-evaluate-locals-optimized.js
|
| +++ b/test/mjsunit/debug-evaluate-locals-optimized.js
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2008 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -34,6 +34,17 @@ var exception = false;
|
|
|
| var testingConstructCall = false;
|
|
|
| +var expected = [
|
| + { locals: {a0: 1, b0: 2}, args: { names: ["i", "x0", "y0"], values: [0, 3, 4] } },
|
| + { locals: {a1: 3, b1: 4}, args: { names: ["i", "x1", "y1"], values: [1, 5, 6] } },
|
| + { locals: {a2: 5, b2: 6}, args: { names: ["i"], values: [2] } },
|
| + { locals: {a3: 7, b3: 8}, args: { names: ["i", "x3", "y3", "z3"], values: [3, 9, 10, undefined] } },
|
| + { locals: {a4: 9, b4: 10}, args: { names: ["i", "x4", "y4"], values: [4, 11, 12] } }
|
| +];
|
| +
|
| +function arraySum(arr) {
|
| + return arr.reduce(function (a, b) { return a + b; }, 0);
|
| +}
|
|
|
| function listener(event, exec_state, event_data, data) {
|
| try {
|
| @@ -44,42 +55,63 @@ function listener(event, exec_state, event_data, data) {
|
| for (var i = 0; i < exec_state.frameCount(); i++) {
|
| var frame = exec_state.frame(i);
|
| if (i < exec_state.frameCount() - 1) {
|
| - var expected_a = i * 2 + 1;
|
| - var expected_b = i * 2 + 2;
|
| - var expected_x = (i + 1) * 2 + 1;
|
| - var expected_y = (i + 1) * 2 + 2;
|
| -
|
| - // All frames except the bottom one has normal variables a and b.
|
| - var a = ('a' === frame.localName(0)) ? 0 : 1;
|
| - var b = 1 - a;
|
| - assertEquals('a', frame.localName(a));
|
| - assertEquals('b', frame.localName(b));
|
| - assertEquals(expected_a, frame.localValue(a).value());
|
| - assertEquals(expected_b, frame.localValue(b).value());
|
| -
|
| - // All frames except the bottom one has arguments variables x and y.
|
| - assertEquals('x', frame.argumentName(0));
|
| - assertEquals('y', frame.argumentName(1));
|
| - assertEquals(expected_x, frame.argumentValue(0).value());
|
| - assertEquals(expected_y, frame.argumentValue(1).value());
|
| + var expected_args = expected[i].args;
|
| + var expected_locals = expected[i].locals;
|
| +
|
| + // All frames except the bottom one have expected locals.
|
| + var locals = {};
|
| + for (var j = 0; j < frame.localCount(); j++) {
|
| + locals[frame.localName(j)] = frame.localValue(j).value();
|
| + }
|
| + assertPropertiesEqual(expected_locals, locals);
|
| +
|
| + // All frames except the bottom one have expected arguments.
|
| + for (var j = 0; j < expected_args.names.length; j++) {
|
| + assertEquals(expected_args.names[j], frame.argumentName(j));
|
| + assertEquals(expected_args.values[j], frame.argumentValue(j).value());
|
| + }
|
|
|
| // All frames except the bottom one have two scopes.
|
| assertEquals(2, frame.scopeCount());
|
| assertEquals(debug.ScopeType.Local, frame.scope(0).scopeType());
|
| assertEquals(debug.ScopeType.Global, frame.scope(1).scopeType());
|
| - assertEquals(expected_a, frame.scope(0).scopeObject().value()['a']);
|
| - assertEquals(expected_b, frame.scope(0).scopeObject().value()['b']);
|
| - assertEquals(expected_x, frame.scope(0).scopeObject().value()['x']);
|
| - assertEquals(expected_y, frame.scope(0).scopeObject().value()['y']);
|
| +
|
| + Object.keys(expected_locals).forEach(function (name) {
|
| + assertEquals(expected_locals[name], frame.scope(0).scopeObject().value()[name]);
|
| + });
|
| +
|
| + for (var j = 0; j < expected_args.names.length; j++) {
|
| + var arg_name = expected_args.names[j];
|
| + var arg_value = expected_args.values[j];
|
| + assertEquals(arg_value, frame.scope(0).scopeObject().value()[arg_name]);
|
| + }
|
|
|
| // Evaluate in the inlined frame.
|
| - assertEquals(expected_a, frame.evaluate('a').value());
|
| - assertEquals(expected_x, frame.evaluate('x').value());
|
| - assertEquals(expected_x, frame.evaluate('arguments[0]').value());
|
| - assertEquals(expected_a + expected_b + expected_x + expected_y,
|
| - frame.evaluate('a + b + x + y').value());
|
| - assertEquals(expected_x + expected_y,
|
| - frame.evaluate('arguments[0] + arguments[1]').value());
|
| + Object.keys(expected_locals).forEach(function (name) {
|
| + assertEquals(expected_locals[name], frame.evaluate(name).value());
|
| + });
|
| +
|
| + for (var j = 0; j < expected_args.names.length; j++) {
|
| + var arg_name = expected_args.names[j];
|
| + var arg_value = expected_args.values[j];
|
| + assertEquals(arg_value, frame.evaluate(arg_name).value());
|
| + assertEquals(arg_value, frame.evaluate('arguments['+j+']').value());
|
| + }
|
| +
|
| + var expected_args_sum = arraySum(expected_args.values);
|
| + var expected_locals_sum =
|
| + arraySum(Object.keys(expected_locals).
|
| + map(function (k) { return expected_locals[k]; }));
|
| +
|
| + assertEquals(expected_locals_sum + expected_args_sum,
|
| + frame.evaluate(Object.keys(expected_locals).join('+') + ' + ' +
|
| + expected_args.names.join('+')).value());
|
| +
|
| + var arguments_sum = expected_args.names.map(function(_, idx) {
|
| + return "arguments[" + idx + "]";
|
| + }).join('+');
|
| + assertEquals(expected_args_sum,
|
| + frame.evaluate(arguments_sum).value());
|
| } else {
|
| // The bottom frame only have the global scope.
|
| assertEquals(1, frame.scopeCount());
|
| @@ -121,51 +153,53 @@ function listener(event, exec_state, event_data, data) {
|
| listenerComplete = true;
|
| }
|
| } catch (e) {
|
| - exception = e.stack;
|
| + exception = e.toString() + e.stack;
|
| };
|
| };
|
|
|
| -f();f();f();
|
| +for (var i = 0; i < 4; i++) f(expected.length - 1, 11, 12);
|
| %OptimizeFunctionOnNextCall(f);
|
| -f();
|
| +f(expected.length - 1, 11, 12);
|
|
|
| // Add the debug event listener.
|
| Debug.setListener(listener);
|
|
|
| -function h(x, y) {
|
| - var a = 1;
|
| - var b = 2;
|
| +function h(i, x0, y0) {
|
| + var a0 = expected[i].locals.a0;
|
| + var b0 = expected[i].locals.b0;
|
| debugger; // Breakpoint.
|
| -};
|
| -
|
| -function g3(x, y) {
|
| - var a = 3;
|
| - var b = 4;
|
| - h(a, b);
|
| -};
|
| -
|
| -function g2(x, y) {
|
| - var a = 5;
|
| - var b = 6;
|
| - g3(a, b);
|
| -};
|
| -
|
| -function g1(x, y) {
|
| - var a = 7;
|
| - var b = 8;
|
| - g2(a, b);
|
| -};
|
| -
|
| -function f(x, y) {
|
| - var a = 9;
|
| - var b = 10;
|
| - g1(a, b);
|
| -};
|
| +}
|
| +
|
| +function g3(i, x1, y1) {
|
| + var a1 = expected[i].locals.a1;
|
| + var b1 = expected[i].locals.b1;
|
| + h(i - 1, a1, b1);
|
| +}
|
| +
|
| +function g2(i) {
|
| + var a2 = expected[i].locals.a2;
|
| + var b2 = expected[i].locals.b2;
|
| + g3(i - 1, a2, b2);
|
| +}
|
| +
|
| +function g1(i, x3, y3, z3) {
|
| + var a3 = expected[i].locals.a3;
|
| + var b3 = expected[i].locals.b3;
|
| + g2(i - 1, a3, b3);
|
| +}
|
| +
|
| +function f(i, x4, y4) {
|
| + var a4 = expected[i].locals.a4;
|
| + var b4 = expected[i].locals.b4;
|
| + g1(i - 1, a4, b4);
|
| +}
|
|
|
| // Test calling f normally and as a constructor.
|
| -f(11, 12);
|
| +f(expected.length - 1, 11, 12);
|
| +f(expected.length - 1, 11, 12, 0);
|
| testingConstructCall = true;
|
| -new f(11, 12);
|
| +new f(expected.length - 1, 11, 12);
|
| +new f(expected.length - 1, 11, 12, 0);
|
|
|
| // Make sure that the debug event listener vas invoked.
|
| assertFalse(exception, "exception in listener " + exception)
|
|
|