mirror of https://github.com/lukechilds/node.git
Ryan Dahl
15 years ago
36 changed files with 2142 additions and 237 deletions
@ -0,0 +1,163 @@ |
|||||
|
// Copyright 2010 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:
|
||||
|
//
|
||||
|
// * Redistributions of source code must retain the above copyright
|
||||
|
// notice, this list of conditions and the following disclaimer.
|
||||
|
// * Redistributions in binary form must reproduce the above
|
||||
|
// copyright notice, this list of conditions and the following
|
||||
|
// disclaimer in the documentation and/or other materials provided
|
||||
|
// with the distribution.
|
||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||
|
// contributors may be used to endorse or promote products derived
|
||||
|
// from this software without specific prior written permission.
|
||||
|
//
|
||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
|
||||
|
// Flags: --expose-debug-as debug
|
||||
|
// Get the Debug object exposed from the debug context global object.
|
||||
|
Debug = debug.Debug |
||||
|
|
||||
|
|
||||
|
function ParsedResponse(json) { |
||||
|
this.response_ = eval('(' + json + ')'); |
||||
|
this.refs_ = []; |
||||
|
if (this.response_.refs) { |
||||
|
for (var i = 0; i < this.response_.refs.length; i++) { |
||||
|
this.refs_[this.response_.refs[i].handle] = this.response_.refs[i]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
ParsedResponse.prototype.response = function() { |
||||
|
return this.response_; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
ParsedResponse.prototype.body = function() { |
||||
|
return this.response_.body; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
ParsedResponse.prototype.running = function() { |
||||
|
return this.response_.running; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
ParsedResponse.prototype.lookup = function(handle) { |
||||
|
return this.refs_[handle]; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
listener_complete = false; |
||||
|
exception = false; |
||||
|
break_count = 0; |
||||
|
expected_return_value = 0; |
||||
|
debugger_source_position = 0; |
||||
|
|
||||
|
// Listener which expects to do four steps to reach returning from the function.
|
||||
|
function listener(event, exec_state, event_data, data) { |
||||
|
try { |
||||
|
if (event == Debug.DebugEvent.Break) |
||||
|
{ |
||||
|
break_count++; |
||||
|
if (break_count < 4) { |
||||
|
assertFalse(exec_state.frame(0).isAtReturn()) |
||||
|
switch (break_count) { |
||||
|
case 1: |
||||
|
// Collect the position of the debugger statement.
|
||||
|
debugger_source_position = exec_state.frame(0).sourcePosition(); |
||||
|
break; |
||||
|
case 2: |
||||
|
// Position now at the if statement.
|
||||
|
assertEquals(debugger_source_position + 10, |
||||
|
exec_state.frame(0).sourcePosition()); |
||||
|
break; |
||||
|
case 3: |
||||
|
// Position now at either of the returns.
|
||||
|
if (expected_return_value == 1) { |
||||
|
assertEquals(debugger_source_position + 19, |
||||
|
exec_state.frame(0).sourcePosition()); |
||||
|
} else { |
||||
|
assertEquals(debugger_source_position + 38, |
||||
|
exec_state.frame(0).sourcePosition()); |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
fail("Unexpected"); |
||||
|
} |
||||
|
exec_state.prepareStep(Debug.StepAction.StepIn, 1); |
||||
|
} else { |
||||
|
// Position at the end of the function.
|
||||
|
assertEquals(debugger_source_position + 51, |
||||
|
exec_state.frame(0).sourcePosition()); |
||||
|
|
||||
|
// Just about to return from the function.
|
||||
|
assertTrue(exec_state.frame(0).isAtReturn()) |
||||
|
assertEquals(expected_return_value, |
||||
|
exec_state.frame(0).returnValue().value()); |
||||
|
|
||||
|
// Check the same using the JSON commands.
|
||||
|
var dcp = exec_state.debugCommandProcessor(false); |
||||
|
var request = '{"seq":0,"type":"request","command":"backtrace"}'; |
||||
|
var resp = dcp.processDebugJSONRequest(request); |
||||
|
response = new ParsedResponse(resp); |
||||
|
frames = response.body().frames; |
||||
|
assertTrue(frames[0].atReturn); |
||||
|
assertEquals(expected_return_value, |
||||
|
response.lookup(frames[0].returnValue.ref).value); |
||||
|
|
||||
|
listener_complete = true; |
||||
|
} |
||||
|
} |
||||
|
} catch (e) { |
||||
|
exception = e |
||||
|
}; |
||||
|
}; |
||||
|
|
||||
|
// Add the debug event listener.
|
||||
|
Debug.setListener(listener); |
||||
|
|
||||
|
// Four steps from the debugger statement in this function will position us at
|
||||
|
// the function return.
|
||||
|
// 0 1 2 3 4 5
|
||||
|
// 0123456789012345678901234567890123456789012345678901
|
||||
|
|
||||
|
function f(x) {debugger; if (x) { return 1; } else { return 2; } }; |
||||
|
|
||||
|
// Call f expecting different return values.
|
||||
|
break_count = 0; |
||||
|
expected_return_value = 2; |
||||
|
listener_complete = false; |
||||
|
f(); |
||||
|
assertFalse(exception, "exception in listener") |
||||
|
assertTrue(listener_complete); |
||||
|
assertEquals(4, break_count); |
||||
|
|
||||
|
break_count = 0; |
||||
|
expected_return_value = 1; |
||||
|
listener_complete = false; |
||||
|
f(true); |
||||
|
assertFalse(exception, "exception in listener") |
||||
|
assertTrue(listener_complete); |
||||
|
assertEquals(4, break_count); |
||||
|
|
||||
|
break_count = 0; |
||||
|
expected_return_value = 2; |
||||
|
listener_complete = false; |
||||
|
f(false); |
||||
|
assertFalse(exception, "exception in listener") |
||||
|
assertTrue(listener_complete); |
||||
|
assertEquals(4, break_count); |
@ -0,0 +1,96 @@ |
|||||
|
// Copyright 2010 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:
|
||||
|
//
|
||||
|
// * Redistributions of source code must retain the above copyright
|
||||
|
// notice, this list of conditions and the following disclaimer.
|
||||
|
// * Redistributions in binary form must reproduce the above
|
||||
|
// copyright notice, this list of conditions and the following
|
||||
|
// disclaimer in the documentation and/or other materials provided
|
||||
|
// with the distribution.
|
||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||
|
// contributors may be used to endorse or promote products derived
|
||||
|
// from this software without specific prior written permission.
|
||||
|
//
|
||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
|
// 'AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
|
||||
|
// A test for keyed call ICs with a mix of smi and string keys.
|
||||
|
|
||||
|
function testOne(receiver, key, result) { |
||||
|
for(var i = 0; i != 10; i++ ) { |
||||
|
assertEquals(result, receiver[key]()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function testMany(receiver, keys, results) { |
||||
|
for (var i = 0; i != 10; i++) { |
||||
|
for (var k = 0; k != keys.length; k++) { |
||||
|
assertEquals(results[k], receiver[keys[k]]()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
var toStringNonSymbol = 'to'; |
||||
|
toStringNonSymbol += 'String'; |
||||
|
|
||||
|
function TypeOfThis() { return typeof this; } |
||||
|
|
||||
|
Number.prototype.square = function() { return this * this; } |
||||
|
Number.prototype.power4 = function() { return this.square().square(); } |
||||
|
|
||||
|
Number.prototype.type = TypeOfThis; |
||||
|
String.prototype.type = TypeOfThis; |
||||
|
Boolean.prototype.type = TypeOfThis; |
||||
|
|
||||
|
// Use a non-symbol key to force inline cache to generic case.
|
||||
|
testOne(0, toStringNonSymbol, '0'); |
||||
|
|
||||
|
testOne(1, 'toString', '1'); |
||||
|
testOne('1', 'toString', '1'); |
||||
|
testOne(1.0, 'toString', '1'); |
||||
|
|
||||
|
testOne(1, 'type', 'object'); |
||||
|
testOne(2.3, 'type', 'object'); |
||||
|
testOne('x', 'type', 'object'); |
||||
|
testOne(true, 'type', 'object'); |
||||
|
testOne(false, 'type', 'object'); |
||||
|
|
||||
|
testOne(2, 'square', 4); |
||||
|
testOne(2, 'power4', 16); |
||||
|
|
||||
|
function zero () { return 0; } |
||||
|
function one () { return 1; } |
||||
|
function two () { return 2; } |
||||
|
|
||||
|
var fixed_array = [zero, one, two]; |
||||
|
|
||||
|
var dict_array = [ zero, one, two ]; |
||||
|
dict_array[100000] = 1; |
||||
|
|
||||
|
var fast_prop = { zero: zero, one: one, two: two }; |
||||
|
|
||||
|
var normal_prop = { zero: zero, one: one, two: two }; |
||||
|
normal_prop.x = 0; |
||||
|
delete normal_prop.x; |
||||
|
|
||||
|
var first3num = [0, 1, 2]; |
||||
|
var first3str = ['zero', 'one', 'two']; |
||||
|
|
||||
|
// Use a non-symbol key to force inline cache to generic case.
|
||||
|
testMany('123', [toStringNonSymbol, 'charAt', 'charCodeAt'], ['123', '1', 49]); |
||||
|
|
||||
|
testMany(fixed_array, first3num, first3num); |
||||
|
testMany(dict_array, first3num, first3num); |
||||
|
testMany(fast_prop, first3str, first3num); |
||||
|
testMany(normal_prop, first3str, first3num); |
Loading…
Reference in new issue