Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: test/mjsunit/debug-evaluate-locals-optimized-double.js

Issue 9265004: Support inlining at call-sites with mismatched number of arguments. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: finished implementation, extended tests, ported to x64&arm Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2008 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution. 11 // with the distribution.
(...skipping 15 matching lines...) Expand all
27 27
28 // Flags: --expose-debug-as debug --allow-natives-syntax 28 // Flags: --expose-debug-as debug --allow-natives-syntax
29 // Get the Debug object exposed from the debug context global object. 29 // Get the Debug object exposed from the debug context global object.
30 Debug = debug.Debug 30 Debug = debug.Debug
31 31
32 var listenerComplete = false; 32 var listenerComplete = false;
33 var exception = false; 33 var exception = false;
34 34
35 var testingConstructCall = false; 35 var testingConstructCall = false;
36 36
37 var input = [
38 {a: 1, b: 2},
39 {a: 3, b: 4},
40 {a: 5, b: 6},
41 {a: 7, b: 8},
42 {a: 9, b: 10}
43 ];
44
45 var expected = [
46 { locals: {a0: 1.01, b0: 2.02}, args: { names: ["i", "x0", "y0"], values: [0, 3.03, 4.04] } },
47 { locals: {a1: 3.03, b1: 4.04}, args: { names: ["i", "x1", "y1"], values: [1, 5.05, 6.06] } },
48 { locals: {a2: 5.05, b2: 6.06}, args: { names: ["i"], values: [2] } },
49 { locals: {a3: 7.07, b3: 8.08}, args: { names: ["i", "x3", "y3", "z3"],
50 values: [3, 9.09, 10.10, undefined] } },
51 { locals: {a4: 9.09, b4: 10.10}, args: { names: ["i", "x4", "y4"], values: [4, 11.11, 12.12] } }
52 ];
53
54 function arraySum(arr) {
55 return arr.reduce(function (a, b) { return a + b; }, 0);
56 }
37 57
38 function listener(event, exec_state, event_data, data) { 58 function listener(event, exec_state, event_data, data) {
39 try { 59 try {
40 if (event == Debug.DebugEvent.Break) 60 if (event == Debug.DebugEvent.Break)
41 { 61 {
42 assertEquals(6, exec_state.frameCount()); 62 assertEquals(6, exec_state.frameCount());
43 63
44 for (var i = 0; i < exec_state.frameCount(); i++) { 64 for (var i = 0; i < exec_state.frameCount(); i++) {
45 var frame = exec_state.frame(i); 65 var frame = exec_state.frame(i);
46 if (i < exec_state.frameCount() - 1) { 66 if (i < exec_state.frameCount() - 1) {
47 var expected_a = i * 2 + 1 + (i * 2 + 1) / 100; 67 var expected_args = expected[i].args;
48 var expected_b = i * 2 + 2 + (i * 2 + 2) / 100; 68 var expected_locals = expected[i].locals;
49 var expected_x = (i + 1) * 2 + 1 + ((i + 1) * 2 + 1) / 100;
50 var expected_y = (i + 1) * 2 + 2 + ((i + 1) * 2 + 2) / 100;
51 69
52 // All frames except the bottom one has normal variables a and b. 70 // All frames except the bottom one have expected locals.
53 var a = ('a' === frame.localName(0)) ? 0 : 1; 71 var locals = {};
54 var b = 1 - a; 72 for (var j = 0; j < frame.localCount(); j++) {
55 assertEquals('a', frame.localName(a)); 73 locals[frame.localName(j)] = frame.localValue(j).value();
56 assertEquals('b', frame.localName(b)); 74 }
57 assertEquals(expected_a, frame.localValue(a).value()); 75 assertPropertiesEqual(expected_locals, locals);
58 assertEquals(expected_b, frame.localValue(b).value());
59 76
60 // All frames except the bottom one has arguments variables x and y. 77 // All frames except the bottom one have expected arguments.
61 assertEquals('x', frame.argumentName(0)); 78 for (var j = 0; j < expected_args.names.length; j++) {
62 assertEquals('y', frame.argumentName(1)); 79 assertEquals(expected_args.names[j], frame.argumentName(j));
63 assertEquals(expected_x, frame.argumentValue(0).value()); 80 assertEquals(expected_args.values[j], frame.argumentValue(j).value() );
64 assertEquals(expected_y, frame.argumentValue(1).value()); 81 }
65 82
66 // All frames except the bottom one have two scopes. 83 // All frames except the bottom one have two scopes.
67 assertEquals(2, frame.scopeCount()); 84 assertEquals(2, frame.scopeCount());
68 assertEquals(debug.ScopeType.Local, frame.scope(0).scopeType()); 85 assertEquals(debug.ScopeType.Local, frame.scope(0).scopeType());
69 assertEquals(debug.ScopeType.Global, frame.scope(1).scopeType()); 86 assertEquals(debug.ScopeType.Global, frame.scope(1).scopeType());
70 assertEquals(expected_a, frame.scope(0).scopeObject().value()['a']); 87
71 assertEquals(expected_b, frame.scope(0).scopeObject().value()['b']); 88 Object.keys(expected_locals).forEach(function (name) {
72 assertEquals(expected_x, frame.scope(0).scopeObject().value()['x']); 89 assertEquals(expected_locals[name], frame.scope(0).scopeObject().val ue()[name]);
73 assertEquals(expected_y, frame.scope(0).scopeObject().value()['y']); 90 });
91
92 for (var j = 0; j < expected_args.names.length; j++) {
93 var arg_name = expected_args.names[j];
94 var arg_value = expected_args.values[j];
95 assertEquals(arg_value, frame.scope(0).scopeObject().value()[arg_nam e]);
96 }
74 97
75 // Evaluate in the inlined frame. 98 // Evaluate in the inlined frame.
76 assertEquals(expected_a, frame.evaluate('a').value()); 99 Object.keys(expected_locals).forEach(function (name) {
77 assertEquals(expected_x, frame.evaluate('x').value()); 100 assertEquals(expected_locals[name], frame.evaluate(name).value());
78 assertEquals(expected_x, frame.evaluate('arguments[0]').value()); 101 });
79 assertEquals(expected_a + expected_b + expected_x + expected_y, 102
80 frame.evaluate('a + b + x + y').value()); 103 for (var j = 0; j < expected_args.names.length; j++) {
81 assertEquals(expected_x + expected_y, 104 var arg_name = expected_args.names[j];
82 frame.evaluate('arguments[0] + arguments[1]').value()); 105 var arg_value = expected_args.values[j];
106 assertEquals(arg_value, frame.evaluate(arg_name).value());
107 assertEquals(arg_value, frame.evaluate('arguments['+j+']').value());
108 }
109
110 var expected_args_sum = arraySum(expected_args.values);
111 var expected_locals_sum =
112 arraySum(Object.keys(expected_locals).
113 map(function (k) { return expected_locals[k]; }));
114
115 assertEquals(expected_locals_sum + expected_args_sum,
116 frame.evaluate(Object.keys(expected_locals).join('+') + ' + ' +
117 expected_args.names.join('+')).value());
118
119 var arguments_sum = expected_args.names.map(function(_, idx) {
120 return "arguments[" + idx + "]";
121 }).join('+');
122 assertEquals(expected_args_sum,
123 frame.evaluate(arguments_sum).value());
83 } else { 124 } else {
84 // The bottom frame only have the global scope. 125 // The bottom frame only have the global scope.
85 assertEquals(1, frame.scopeCount()); 126 assertEquals(1, frame.scopeCount());
86 assertEquals(debug.ScopeType.Global, frame.scope(0).scopeType()); 127 assertEquals(debug.ScopeType.Global, frame.scope(0).scopeType());
87 } 128 }
88 129
89 // Check the frame function. 130 // Check the frame function.
90 switch (i) { 131 switch (i) {
91 case 0: assertEquals(h, frame.func().value()); break; 132 case 0: assertEquals(h, frame.func().value()); break;
92 case 1: assertEquals(g3, frame.func().value()); break; 133 case 1: assertEquals(g3, frame.func().value()); break;
(...skipping 21 matching lines...) Expand all
114 assertFalse(frame.isOptimizedFrame()); 155 assertFalse(frame.isOptimizedFrame());
115 assertFalse(frame.isInlinedFrame()); 156 assertFalse(frame.isInlinedFrame());
116 } 157 }
117 } 158 }
118 } 159 }
119 160
120 // Indicate that all was processed. 161 // Indicate that all was processed.
121 listenerComplete = true; 162 listenerComplete = true;
122 } 163 }
123 } catch (e) { 164 } catch (e) {
124 exception = e 165 exception = e.toString() + e.stack;
125 }; 166 };
126 }; 167 };
127 168
128 f();f();f(); 169 for (var i = 0; i < 4; i++) f(input.length - 1, 11.11, 12.12);
129 %OptimizeFunctionOnNextCall(f); 170 %OptimizeFunctionOnNextCall(f);
130 f(); 171 f(input.length - 1, 11.11, 12.12);
131 172
132 // Add the debug event listener. 173 // Add the debug event listener.
133 Debug.setListener(listener); 174 Debug.setListener(listener);
134 175
135 function h(x, y) { 176 function h(i, x0, y0) {
136 var a = 1; 177 var a0 = input[i].a;
137 var b = 2; 178 var b0 = input[i].b;
138 a = a + a / 100; 179 a0 = a0 + a0 / 100;
139 b = b + b / 100; 180 b0 = b0 + b0 / 100;
140 debugger; // Breakpoint. 181 debugger; // Breakpoint.
141 }; 182 };
142 183
143 function g3(x, y) { 184 function g3(i, x1, y1) {
144 var a = 3; 185 var a1 = input[i].a;
145 var b = 4; 186 var b1 = input[i].b;
146 a = a + a / 100; 187 a1 = a1 + a1 / 100;
147 b = b + b / 100; 188 b1 = b1 + b1 / 100;
148 h(a, b); 189 h(i - 1, a1, b1);
149 return a+b; 190 return a1+b1;
150 }; 191 };
151 192
152 function g2(x, y) { 193 function g2(i) {
153 var a = 5; 194 var a2 = input[i].a;
154 var b = 6; 195 var b2 = input[i].b;
155 a = a + a / 100; 196 a2 = a2 + a2 / 100;
156 b = b + b / 100; 197 b2 = b2 + b2 / 100;
157 g3(a, b); 198 g3(i - 1, a2, b2);
158 }; 199 };
159 200
160 function g1(x, y) { 201 function g1(i, x3, y3, z3) {
161 var a = 7; 202 var a3 = input[i].a;
162 var b = 8; 203 var b3 = input[i].b;
163 a = a + a / 100; 204 a3 = a3 + a3 / 100;
164 b = b + b / 100; 205 b3 = b3 + b3 / 100;
165 g2(a, b); 206 g2(i - 1, a3, b3);
166 }; 207 };
167 208
168 function f(x, y) { 209 function f(i, x4, y4) {
169 var a = 9; 210 var a4 = input[i].a;
170 var b = 10; 211 var b4 = input[i].b;
171 a = a + a / 100; 212 a4 = a4 + a4 / 100;
172 b = b + b / 100; 213 b4 = b4 + b4 / 100;
173 g1(a, b); 214 g1(i - 1, a4, b4);
174 }; 215 };
175 216
176 // Test calling f normally and as a constructor. 217 // Test calling f normally and as a constructor.
177 f(11.11, 12.12); 218 f(input.length - 1, 11.11, 12.12);
219 f(input.length - 1, 11.11, 12.12, "");
178 testingConstructCall = true; 220 testingConstructCall = true;
179 new f(11.11, 12.12); 221 new f(input.length - 1, 11.11, 12.12);
222 new f(input.length - 1, 11.11, 12.12, "");
180 223
181 // Make sure that the debug event listener vas invoked. 224 // Make sure that the debug event listener vas invoked.
182 assertFalse(exception, "exception in listener " + exception) 225 assertFalse(exception, "exception in listener " + exception)
183 assertTrue(listenerComplete); 226 assertTrue(listenerComplete);
184 227
185 Debug.setListener(null); 228 Debug.setListener(null);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698