Add function inferred name to FunctionMirror and its json representation.

Review URL: http://codereview.chromium.org/109026

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1871 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
yurys@chromium.org 2009-05-05 18:12:03 +00:00
parent bf63b8f173
commit beb5161b84
5 changed files with 54 additions and 14 deletions

View File

@ -755,6 +755,15 @@ FunctionMirror.prototype.name = function() {
};
/**
* Returns the inferred name of the function.
* @return {string} Name of the function
*/
FunctionMirror.prototype.inferredName = function() {
return %FunctionGetInferredName(this.value_);
};
/**
* Returns the source code for the function.
* @return {string or undefined} The source code for the function. If the
@ -857,6 +866,11 @@ UnresolvedFunctionMirror.prototype.name = function() {
};
UnresolvedFunctionMirror.prototype.inferredName = function() {
return undefined;
};
UnresolvedFunctionMirror.prototype.propertyNames = function(kind, limit) {
return [];
}
@ -1835,6 +1849,10 @@ JSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content,
if (mirror.isFunction()) {
// Add function specific properties.
content.push(MakeJSONPair_('name', StringToJSON_(mirror.name())));
if (!IS_UNDEFINED(mirror.inferredName())) {
content.push(MakeJSONPair_('inferredName',
StringToJSON_(mirror.inferredName())));
}
content.push(MakeJSONPair_('resolved', BooleanToJSON_(mirror.resolved())));
if (mirror.resolved()) {
content.push(MakeJSONPair_('source', StringToJSON_(mirror.source())));

View File

@ -6860,6 +6860,15 @@ static Object* Runtime_FunctionGetAssemblerCode(Arguments args) {
#endif // DEBUG
return Heap::undefined_value();
}
static Object* Runtime_FunctionGetInferredName(Arguments args) {
NoHandleAllocation ha;
ASSERT(args.length() == 1);
CONVERT_CHECKED(JSFunction, f, args[0]);
return f->shared()->inferred_name();
}
#endif // ENABLE_DEBUGGER_SUPPORT

View File

@ -298,7 +298,8 @@ namespace v8 { namespace internal {
F(DebugConstructedBy, 2) \
F(DebugGetPrototype, 1) \
F(SystemBreak, 0) \
F(FunctionGetAssemblerCode, 1)
F(FunctionGetAssemblerCode, 1) \
F(FunctionGetInferredName, 1)
#else
#define RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F)
#endif

View File

@ -32,10 +32,14 @@ function f(x, y) {
a=1;
};
function g() {
var m = function() {
new f(1);
};
function g() {
m();
};
// Get the Debug object exposed from the debug context global object.
Debug = debug.Debug
@ -90,22 +94,26 @@ function listener(event, exec_state, event_data, data) {
// Get the backtrace.
var json;
json = '{"seq":0,"type":"request","command":"backtrace"}'
response = new ParsedResponse(dcp.processDebugJSONRequest(json));
var resp = dcp.processDebugJSONRequest(json);
response = new ParsedResponse(resp);
backtrace = response.body();
assertEquals(0, backtrace.fromFrame);
assertEquals(3, backtrace.toFrame);
assertEquals(3, backtrace.totalFrames);
assertEquals(4, backtrace.toFrame);
assertEquals(4, backtrace.totalFrames);
var frames = backtrace.frames;
assertEquals(3, frames.length);
assertEquals(4, frames.length);
for (var i = 0; i < frames.length; i++) {
assertEquals('frame', frames[i].type);
}
assertEquals(0, frames[0].index);
assertEquals("f", response.lookup(frames[0].func.ref).name);
assertEquals(1, frames[1].index);
assertEquals("g", response.lookup(frames[1].func.ref).name);
assertEquals("", response.lookup(frames[1].func.ref).name);
assertEquals("m", response.lookup(frames[1].func.ref).inferredName);
assertEquals(2, frames[2].index);
assertEquals("", response.lookup(frames[2].func.ref).name);
assertEquals("g", response.lookup(frames[2].func.ref).name);
assertEquals(3, frames[3].index);
assertEquals("", response.lookup(frames[3].func.ref).name);
// Get backtrace with two frames.
json = '{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":1,"toFrame":3}}'
@ -113,16 +121,17 @@ function listener(event, exec_state, event_data, data) {
backtrace = response.body();
assertEquals(1, backtrace.fromFrame);
assertEquals(3, backtrace.toFrame);
assertEquals(3, backtrace.totalFrames);
assertEquals(4, backtrace.totalFrames);
var frames = backtrace.frames;
assertEquals(2, frames.length);
for (var i = 0; i < frames.length; i++) {
assertEquals('frame', frames[i].type);
}
assertEquals(1, frames[0].index);
assertEquals("g", response.lookup(frames[0].func.ref).name);
assertEquals("", response.lookup(frames[0].func.ref).name);
assertEquals("m", response.lookup(frames[0].func.ref).inferredName);
assertEquals(2, frames[1].index);
assertEquals("", response.lookup(frames[1].func.ref).name);
assertEquals("g", response.lookup(frames[1].func.ref).name);
// Get the individual frames.
json = '{"seq":0,"type":"request","command":"frame"}'
@ -158,16 +167,17 @@ function listener(event, exec_state, event_data, data) {
response = new ParsedResponse(dcp.processDebugJSONRequest(json));
frame = response.body();
assertEquals(1, frame.index);
assertEquals("g", response.lookup(frame.func.ref).name);
assertEquals("", response.lookup(frame.func.ref).name);
assertEquals("m", response.lookup(frame.func.ref).inferredName);
assertFalse(frame.constructCall);
assertEquals(35, frame.line);
assertEquals(2, frame.column);
assertEquals(0, frame.arguments.length);
json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":2}}'
json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":3}}'
response = new ParsedResponse(dcp.processDebugJSONRequest(json));
frame = response.body();
assertEquals(2, frame.index);
assertEquals(3, frame.index);
assertEquals("", response.lookup(frame.func.ref).name);
// Source slices for the individual frames (they all refer to this script).

View File

@ -57,6 +57,7 @@ assertEquals('function', mirror.type());
assertFalse(mirror.isPrimitive());
assertEquals("Function", mirror.className());
assertEquals("f", mirror.name());
assertEquals('undefined', typeof mirror.inferredName());
assertFalse(mirror.resolved());
assertEquals(void 0, mirror.source());
assertEquals('undefined', mirror.constructorFunction().type());
@ -75,4 +76,5 @@ assertEquals(mirror.prototypeObject().handle(), fromJSON.prototypeObject.ref, 'U
assertEquals('undefined', refs.lookup(fromJSON.prototypeObject.ref).type, 'Unexpected prototype object type in JSON');
assertFalse(fromJSON.resolved);
assertEquals("f", fromJSON.name);
assertFalse('inferredName' in fromJSON);
assertEquals(void 0, fromJSON.source);