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

Side by Side Diff: src/runtime.cc

Issue 8345039: Make builtin functions be skipped in stack traces. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed review comments. Created 9 years, 2 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
« no previous file with comments | « src/messages.js ('k') | test/mjsunit/stack-traces.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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
(...skipping 2098 matching lines...) Expand 10 before | Expand all | Expand 10 after
2109 RUNTIME_ASSERT(code->IsJSFunction()); 2109 RUNTIME_ASSERT(code->IsJSFunction());
2110 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); 2110 Handle<JSFunction> fun = Handle<JSFunction>::cast(code);
2111 Handle<SharedFunctionInfo> shared(fun->shared()); 2111 Handle<SharedFunctionInfo> shared(fun->shared());
2112 2112
2113 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) { 2113 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) {
2114 return Failure::Exception(); 2114 return Failure::Exception();
2115 } 2115 }
2116 // Since we don't store the source for this we should never 2116 // Since we don't store the source for this we should never
2117 // optimize this. 2117 // optimize this.
2118 shared->code()->set_optimizable(false); 2118 shared->code()->set_optimizable(false);
2119
2120 // Set the code, scope info, formal parameter count, 2119 // Set the code, scope info, formal parameter count,
2121 // and the length of the target function. 2120 // and the length of the target function.
2122 target->shared()->set_code(shared->code()); 2121 target->shared()->set_code(shared->code());
2123 target->ReplaceCode(shared->code()); 2122 target->ReplaceCode(shared->code());
2124 target->shared()->set_scope_info(shared->scope_info()); 2123 target->shared()->set_scope_info(shared->scope_info());
2125 target->shared()->set_length(shared->length()); 2124 target->shared()->set_length(shared->length());
2126 target->shared()->set_formal_parameter_count( 2125 target->shared()->set_formal_parameter_count(
2127 shared->formal_parameter_count()); 2126 shared->formal_parameter_count());
2128 // Set the source code of the target function to undefined. 2127 // Set the source code of the target function to undefined.
2129 // SetCode is only used for built-in constructors like String, 2128 // SetCode is only used for built-in constructors like String,
(...skipping 10787 matching lines...) Expand 10 before | Expand all | Expand 10 after
12917 // Determines whether the given stack frame should be displayed in 12916 // Determines whether the given stack frame should be displayed in
12918 // a stack trace. The caller is the error constructor that asked 12917 // a stack trace. The caller is the error constructor that asked
12919 // for the stack trace to be collected. The first time a construct 12918 // for the stack trace to be collected. The first time a construct
12920 // call to this function is encountered it is skipped. The seen_caller 12919 // call to this function is encountered it is skipped. The seen_caller
12921 // in/out parameter is used to remember if the caller has been seen 12920 // in/out parameter is used to remember if the caller has been seen
12922 // yet. 12921 // yet.
12923 static bool ShowFrameInStackTrace(StackFrame* raw_frame, 12922 static bool ShowFrameInStackTrace(StackFrame* raw_frame,
12924 Object* caller, 12923 Object* caller,
12925 bool* seen_caller) { 12924 bool* seen_caller) {
12926 // Only display JS frames. 12925 // Only display JS frames.
12927 if (!raw_frame->is_java_script()) 12926 if (!raw_frame->is_java_script()) {
12928 return false; 12927 return false;
12928 }
12929 JavaScriptFrame* frame = JavaScriptFrame::cast(raw_frame); 12929 JavaScriptFrame* frame = JavaScriptFrame::cast(raw_frame);
12930 Object* raw_fun = frame->function(); 12930 Object* raw_fun = frame->function();
12931 // Not sure when this can happen but skip it just in case. 12931 // Not sure when this can happen but skip it just in case.
12932 if (!raw_fun->IsJSFunction()) 12932 if (!raw_fun->IsJSFunction()) {
12933 return false; 12933 return false;
12934 }
12934 if ((raw_fun == caller) && !(*seen_caller)) { 12935 if ((raw_fun == caller) && !(*seen_caller)) {
12935 *seen_caller = true; 12936 *seen_caller = true;
12936 return false; 12937 return false;
12937 } 12938 }
12938 // Skip all frames until we've seen the caller. 12939 // Skip all frames until we've seen the caller.
12939 if (!(*seen_caller)) return false; 12940 if (!(*seen_caller)) return false;
12940 // Also, skip the most obvious builtin calls. We recognize builtins 12941 // Also, skip non-visible built-in functions and any call with the builtins
12941 // as (1) functions called with the builtins object as the receiver and 12942 // object as receiver, so as to not reveal either the builtins object or
12942 // as (2) functions from native scripts called with undefined as the 12943 // an internal function.
12943 // receiver (direct calls to helper functions in the builtins 12944 // The --builtins-in-stack-traces command line flag allows including
12944 // code). Some builtin calls (such as Number.ADD which is invoked 12945 // internal call sites in the stack trace for debugging purposes.
12945 // using 'call') are very difficult to recognize so we're leaving 12946 if (!FLAG_builtins_in_stack_traces) {
12946 // them in for now. 12947 JSFunction* fun = JSFunction::cast(raw_fun);
12947 if (frame->receiver()->IsJSBuiltinsObject()) { 12948 if (frame->receiver()->IsJSBuiltinsObject() ||
12948 return false; 12949 (fun->IsBuiltin() && !fun->shared()->native())) {
12949 } 12950 return false;
12950 JSFunction* fun = JSFunction::cast(raw_fun); 12951 }
12951 Object* raw_script = fun->shared()->script();
12952 if (frame->receiver()->IsUndefined() && raw_script->IsScript()) {
12953 int script_type = Script::cast(raw_script)->type()->value();
12954 return script_type != Script::TYPE_NATIVE;
12955 } 12952 }
12956 return true; 12953 return true;
12957 } 12954 }
12958 12955
12959 12956
12960 // Collect the raw data for a stack trace. Returns an array of 4 12957 // Collect the raw data for a stack trace. Returns an array of 4
12961 // element segments each containing a receiver, function, code and 12958 // element segments each containing a receiver, function, code and
12962 // native code offset. 12959 // native code offset.
12963 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectStackTrace) { 12960 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectStackTrace) {
12964 ASSERT_EQ(args.length(), 2); 12961 ASSERT_EQ(args.length(), 2);
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
13345 } else { 13342 } else {
13346 // Handle last resort GC and make sure to allow future allocations 13343 // Handle last resort GC and make sure to allow future allocations
13347 // to grow the heap without causing GCs (if possible). 13344 // to grow the heap without causing GCs (if possible).
13348 isolate->counters()->gc_last_resort_from_js()->Increment(); 13345 isolate->counters()->gc_last_resort_from_js()->Increment();
13349 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); 13346 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
13350 } 13347 }
13351 } 13348 }
13352 13349
13353 13350
13354 } } // namespace v8::internal 13351 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/messages.js ('k') | test/mjsunit/stack-traces.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698