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

Side by Side Diff: src/frames.cc

Issue 73020: Implemented "no heap access" mode for JSFrame which is used for stack sampling in profiler. (Closed)
Patch Set: Renamings as Soeren suggested Created 11 years, 8 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
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 StackFrameIterator::StackFrameIterator(bool use_top, Address fp, Address sp) 79 StackFrameIterator::StackFrameIterator(bool use_top, Address fp, Address sp)
80 : STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) 80 : STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON)
81 frame_(NULL), handler_(NULL), 81 frame_(NULL), handler_(NULL),
82 thread_(use_top ? Top::GetCurrentThread() : NULL), 82 thread_(use_top ? Top::GetCurrentThread() : NULL),
83 fp_(use_top ? NULL : fp), sp_(sp), 83 fp_(use_top ? NULL : fp), sp_(sp),
84 advance_(use_top ? &StackFrameIterator::AdvanceWithHandler : 84 advance_(use_top ? &StackFrameIterator::AdvanceWithHandler :
85 &StackFrameIterator::AdvanceWithoutHandler) { 85 &StackFrameIterator::AdvanceWithoutHandler) {
86 if (use_top || fp != NULL) { 86 if (use_top || fp != NULL) {
87 Reset(); 87 Reset();
88 } 88 }
89 JavaScriptFrame_.DisableHeapAccess();
89 } 90 }
90 91
91 #undef INITIALIZE_SINGLETON 92 #undef INITIALIZE_SINGLETON
92 93
93 94
94 void StackFrameIterator::AdvanceWithHandler() { 95 void StackFrameIterator::AdvanceWithHandler() {
95 ASSERT(!done()); 96 ASSERT(!done());
96 // Compute the state of the calling frame before restoring 97 // Compute the state of the calling frame before restoring
97 // callee-saved registers and unwinding handlers. This allows the 98 // callee-saved registers and unwinding handlers. This allows the
98 // frame code that computes the caller state to access the top 99 // frame code that computes the caller state to access the top
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 bool SafeStackFrameIterator::CanIterateHandles(StackFrame* frame, 225 bool SafeStackFrameIterator::CanIterateHandles(StackFrame* frame,
225 StackHandler* handler) { 226 StackHandler* handler) {
226 // If StackIterator iterates over StackHandles, verify that 227 // If StackIterator iterates over StackHandles, verify that
227 // StackHandlerIterator can be instantiated (see StackHandlerIterator 228 // StackHandlerIterator can be instantiated (see StackHandlerIterator
228 // constructor.) 229 // constructor.)
229 return !is_valid_top_ || (frame->sp() <= handler->address()); 230 return !is_valid_top_ || (frame->sp() <= handler->address());
230 } 231 }
231 232
232 233
233 bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const { 234 bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const {
234 return IsValidStackAddress(frame->sp()) && IsValidStackAddress(frame->fp()) && 235 return IsValidStackAddress(frame->sp()) && IsValidStackAddress(frame->fp());
235 // JavaScriptFrame uses function shared info to advance, hence it must
236 // point to a valid function object.
237 (!frame->is_java_script() ||
238 reinterpret_cast<JavaScriptFrame*>(frame)->is_at_function());
239 } 236 }
240 237
241 238
242 bool SafeStackFrameIterator::IsValidCaller(StackFrame* frame) { 239 bool SafeStackFrameIterator::IsValidCaller(StackFrame* frame) {
243 StackFrame::State state; 240 StackFrame::State state;
244 if (frame->is_entry() || frame->is_entry_construct()) { 241 if (frame->is_entry() || frame->is_entry_construct()) {
245 // See EntryFrame::GetCallerState. It computes the caller FP address 242 // See EntryFrame::GetCallerState. It computes the caller FP address
246 // and calls ExitFrame::GetStateForFramePointer on it. We need to be 243 // and calls ExitFrame::GetStateForFramePointer on it. We need to be
247 // sure that caller FP address is valid. 244 // sure that caller FP address is valid.
248 Address caller_fp = Memory::Address_at( 245 Address caller_fp = Memory::Address_at(
(...skipping 25 matching lines...) Expand all
274 } 271 }
275 272
276 273
277 // ------------------------------------------------------------------------- 274 // -------------------------------------------------------------------------
278 275
279 276
280 #ifdef ENABLE_LOGGING_AND_PROFILING 277 #ifdef ENABLE_LOGGING_AND_PROFILING
281 SafeStackTraceFrameIterator::SafeStackTraceFrameIterator( 278 SafeStackTraceFrameIterator::SafeStackTraceFrameIterator(
282 Address fp, Address sp, Address low_bound, Address high_bound) : 279 Address fp, Address sp, Address low_bound, Address high_bound) :
283 SafeJavaScriptFrameIterator(fp, sp, low_bound, high_bound) { 280 SafeJavaScriptFrameIterator(fp, sp, low_bound, high_bound) {
284 if (!done() && !frame()->is_at_function()) Advance(); 281 if (!done() && !frame()->is_java_script()) Advance();
285 } 282 }
286 283
287 284
288 void SafeStackTraceFrameIterator::Advance() { 285 void SafeStackTraceFrameIterator::Advance() {
289 while (true) { 286 while (true) {
290 SafeJavaScriptFrameIterator::Advance(); 287 SafeJavaScriptFrameIterator::Advance();
291 if (done()) return; 288 if (done()) return;
292 if (frame()->is_at_function()) return; 289 if (frame()->is_java_script()) return;
293 } 290 }
294 } 291 }
295 #endif 292 #endif
296 293
297 294
298 // ------------------------------------------------------------------------- 295 // -------------------------------------------------------------------------
299 296
300 297
301 void StackHandler::Cook(Code* code) { 298 void StackHandler::Cook(Code* code) {
302 ASSERT(MarkCompactCollector::IsCompacting()); 299 ASSERT(MarkCompactCollector::IsCompacting());
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 reg_code[i++] = r; 731 reg_code[i++] = r;
735 732
736 ASSERT(i == kNumJSCallerSaved); 733 ASSERT(i == kNumJSCallerSaved);
737 } 734 }
738 ASSERT(0 <= n && n < kNumJSCallerSaved); 735 ASSERT(0 <= n && n < kNumJSCallerSaved);
739 return reg_code[n]; 736 return reg_code[n];
740 } 737 }
741 738
742 739
743 } } // namespace v8::internal 740 } } // namespace v8::internal
OLDNEW
« src/frames.h ('K') | « src/frames.h ('k') | src/frames-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698