| OLD | NEW | 
|---|
| 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 82 | 82 | 
| 83 | 83 | 
| 84 char* Isolate::Iterate(ObjectVisitor* v, char* thread_storage) { | 84 char* Isolate::Iterate(ObjectVisitor* v, char* thread_storage) { | 
| 85   ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(thread_storage); | 85   ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(thread_storage); | 
| 86   Iterate(v, thread); | 86   Iterate(v, thread); | 
| 87   return thread_storage + sizeof(ThreadLocalTop); | 87   return thread_storage + sizeof(ThreadLocalTop); | 
| 88 } | 88 } | 
| 89 | 89 | 
| 90 | 90 | 
| 91 void Isolate::IterateThread(ThreadVisitor* v) { | 91 void Isolate::IterateThread(ThreadVisitor* v) { | 
| 92   v->VisitThread(thread_local_top()); | 92   v->VisitThread(this, thread_local_top()); | 
| 93 } | 93 } | 
| 94 | 94 | 
| 95 | 95 | 
| 96 void Isolate::IterateThread(ThreadVisitor* v, char* t) { | 96 void Isolate::IterateThread(ThreadVisitor* v, char* t) { | 
| 97   ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(t); | 97   ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(t); | 
| 98   v->VisitThread(thread); | 98   v->VisitThread(this, thread); | 
| 99 } | 99 } | 
| 100 | 100 | 
| 101 | 101 | 
| 102 void Isolate::Iterate(ObjectVisitor* v, ThreadLocalTop* thread) { | 102 void Isolate::Iterate(ObjectVisitor* v, ThreadLocalTop* thread) { | 
| 103   // Visit the roots from the top for a given thread. | 103   // Visit the roots from the top for a given thread. | 
| 104   Object* pending; | 104   Object* pending; | 
| 105   // The pending exception can sometimes be a failure.  We can't show | 105   // The pending exception can sometimes be a failure.  We can't show | 
| 106   // that to the GC, which only understands objects. | 106   // that to the GC, which only understands objects. | 
| 107   if (thread->pending_exception_->ToObject(&pending)) { | 107   if (thread->pending_exception_->ToObject(&pending)) { | 
| 108     v->VisitPointer(&pending); | 108     v->VisitPointer(&pending); | 
| 109     thread->pending_exception_ = pending;  // In case GC updated it. | 109     thread->pending_exception_ = pending;  // In case GC updated it. | 
| 110   } | 110   } | 
| 111   v->VisitPointer(&(thread->pending_message_obj_)); | 111   v->VisitPointer(&(thread->pending_message_obj_)); | 
| 112   v->VisitPointer(BitCast<Object**>(&(thread->pending_message_script_))); | 112   v->VisitPointer(BitCast<Object**>(&(thread->pending_message_script_))); | 
| 113   v->VisitPointer(BitCast<Object**>(&(thread->context_))); | 113   v->VisitPointer(BitCast<Object**>(&(thread->context_))); | 
| 114   Object* scheduled; | 114   Object* scheduled; | 
| 115   if (thread->scheduled_exception_->ToObject(&scheduled)) { | 115   if (thread->scheduled_exception_->ToObject(&scheduled)) { | 
| 116     v->VisitPointer(&scheduled); | 116     v->VisitPointer(&scheduled); | 
| 117     thread->scheduled_exception_ = scheduled; | 117     thread->scheduled_exception_ = scheduled; | 
| 118   } | 118   } | 
| 119 | 119 | 
| 120   for (v8::TryCatch* block = thread->TryCatchHandler(); | 120   for (v8::TryCatch* block = thread->TryCatchHandler(); | 
| 121        block != NULL; | 121        block != NULL; | 
| 122        block = TRY_CATCH_FROM_ADDRESS(block->next_)) { | 122        block = TRY_CATCH_FROM_ADDRESS(block->next_)) { | 
| 123     v->VisitPointer(BitCast<Object**>(&(block->exception_))); | 123     v->VisitPointer(BitCast<Object**>(&(block->exception_))); | 
| 124     v->VisitPointer(BitCast<Object**>(&(block->message_))); | 124     v->VisitPointer(BitCast<Object**>(&(block->message_))); | 
| 125   } | 125   } | 
| 126 | 126 | 
| 127   // Iterate over pointers on native execution stack. | 127   // Iterate over pointers on native execution stack. | 
| 128   for (StackFrameIterator it(thread); !it.done(); it.Advance()) { | 128   for (StackFrameIterator it(this, thread); !it.done(); it.Advance()) { | 
| 129     it.frame()->Iterate(v); | 129     it.frame()->Iterate(v); | 
| 130   } | 130   } | 
| 131 } | 131 } | 
| 132 | 132 | 
| 133 | 133 | 
| 134 void Isolate::Iterate(ObjectVisitor* v) { | 134 void Isolate::Iterate(ObjectVisitor* v) { | 
| 135   ThreadLocalTop* current_t = thread_local_top(); | 135   ThreadLocalTop* current_t = thread_local_top(); | 
| 136   Iterate(v, current_t); | 136   Iterate(v, current_t); | 
| 137 } | 137 } | 
| 138 | 138 | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 197   Handle<String> script_key = factory()->LookupAsciiSymbol("scriptName"); | 197   Handle<String> script_key = factory()->LookupAsciiSymbol("scriptName"); | 
| 198   Handle<String> name_or_source_url_key = | 198   Handle<String> name_or_source_url_key = | 
| 199       factory()->LookupAsciiSymbol("nameOrSourceURL"); | 199       factory()->LookupAsciiSymbol("nameOrSourceURL"); | 
| 200   Handle<String> script_name_or_source_url_key = | 200   Handle<String> script_name_or_source_url_key = | 
| 201       factory()->LookupAsciiSymbol("scriptNameOrSourceURL"); | 201       factory()->LookupAsciiSymbol("scriptNameOrSourceURL"); | 
| 202   Handle<String> function_key = factory()->LookupAsciiSymbol("functionName"); | 202   Handle<String> function_key = factory()->LookupAsciiSymbol("functionName"); | 
| 203   Handle<String> eval_key = factory()->LookupAsciiSymbol("isEval"); | 203   Handle<String> eval_key = factory()->LookupAsciiSymbol("isEval"); | 
| 204   Handle<String> constructor_key = | 204   Handle<String> constructor_key = | 
| 205       factory()->LookupAsciiSymbol("isConstructor"); | 205       factory()->LookupAsciiSymbol("isConstructor"); | 
| 206 | 206 | 
| 207   StackTraceFrameIterator it; | 207   StackTraceFrameIterator it(this); | 
| 208   int frames_seen = 0; | 208   int frames_seen = 0; | 
| 209   while (!it.done() && (frames_seen < limit)) { | 209   while (!it.done() && (frames_seen < limit)) { | 
| 210     JavaScriptFrame* frame = it.frame(); | 210     JavaScriptFrame* frame = it.frame(); | 
| 211 | 211 | 
| 212     List<FrameSummary> frames(3);  // Max 2 levels of inlining. | 212     List<FrameSummary> frames(3);  // Max 2 levels of inlining. | 
| 213     frame->Summarize(&frames); | 213     frame->Summarize(&frames); | 
| 214     for (int i = frames.length() - 1; i >= 0 && frames_seen < limit; i--) { | 214     for (int i = frames.length() - 1; i >= 0 && frames_seen < limit; i--) { | 
| 215       // Create a JSObject to hold the information for the StackFrame. | 215       // Create a JSObject to hold the information for the StackFrame. | 
| 216       Handle<JSObject> stackFrame = factory()->NewJSObject(object_function()); | 216       Handle<JSObject> stackFrame = factory()->NewJSObject(object_function()); | 
| 217 | 217 | 
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 577 | 577 | 
| 578 Failure* Isolate::PromoteScheduledException() { | 578 Failure* Isolate::PromoteScheduledException() { | 
| 579   MaybeObject* thrown = scheduled_exception(); | 579   MaybeObject* thrown = scheduled_exception(); | 
| 580   clear_scheduled_exception(); | 580   clear_scheduled_exception(); | 
| 581   // Re-throw the exception to avoid getting repeated error reporting. | 581   // Re-throw the exception to avoid getting repeated error reporting. | 
| 582   return ReThrow(thrown); | 582   return ReThrow(thrown); | 
| 583 } | 583 } | 
| 584 | 584 | 
| 585 | 585 | 
| 586 void Isolate::PrintCurrentStackTrace(FILE* out) { | 586 void Isolate::PrintCurrentStackTrace(FILE* out) { | 
| 587   StackTraceFrameIterator it; | 587   StackTraceFrameIterator it(this); | 
| 588   while (!it.done()) { | 588   while (!it.done()) { | 
| 589     HandleScope scope; | 589     HandleScope scope; | 
| 590     // Find code position if recorded in relocation info. | 590     // Find code position if recorded in relocation info. | 
| 591     JavaScriptFrame* frame = it.frame(); | 591     JavaScriptFrame* frame = it.frame(); | 
| 592     int pos = frame->LookupCode(this)->SourcePosition(frame->pc()); | 592     int pos = frame->LookupCode()->SourcePosition(frame->pc()); | 
| 593     Handle<Object> pos_obj(Smi::FromInt(pos)); | 593     Handle<Object> pos_obj(Smi::FromInt(pos)); | 
| 594     // Fetch function and receiver. | 594     // Fetch function and receiver. | 
| 595     Handle<JSFunction> fun(JSFunction::cast(frame->function())); | 595     Handle<JSFunction> fun(JSFunction::cast(frame->function())); | 
| 596     Handle<Object> recv(frame->receiver()); | 596     Handle<Object> recv(frame->receiver()); | 
| 597     // Advance to the next JavaScript frame and determine if the | 597     // Advance to the next JavaScript frame and determine if the | 
| 598     // current frame is the top-level frame. | 598     // current frame is the top-level frame. | 
| 599     it.Advance(); | 599     it.Advance(); | 
| 600     Handle<Object> is_top_level = it.done() | 600     Handle<Object> is_top_level = it.done() | 
| 601         ? factory()->true_value() | 601         ? factory()->true_value() | 
| 602         : factory()->false_value(); | 602         : factory()->false_value(); | 
| 603     // Generate and print stack trace line. | 603     // Generate and print stack trace line. | 
| 604     Handle<String> line = | 604     Handle<String> line = | 
| 605         Execution::GetStackTraceLine(recv, fun, pos_obj, is_top_level); | 605         Execution::GetStackTraceLine(recv, fun, pos_obj, is_top_level); | 
| 606     if (line->length() > 0) { | 606     if (line->length() > 0) { | 
| 607       line->PrintOn(out); | 607       line->PrintOn(out); | 
| 608       fprintf(out, "\n"); | 608       fprintf(out, "\n"); | 
| 609     } | 609     } | 
| 610   } | 610   } | 
| 611 } | 611 } | 
| 612 | 612 | 
| 613 | 613 | 
| 614 void Isolate::ComputeLocation(MessageLocation* target) { | 614 void Isolate::ComputeLocation(MessageLocation* target) { | 
| 615   *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1); | 615   *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1); | 
| 616   StackTraceFrameIterator it; | 616   StackTraceFrameIterator it(this); | 
| 617   if (!it.done()) { | 617   if (!it.done()) { | 
| 618     JavaScriptFrame* frame = it.frame(); | 618     JavaScriptFrame* frame = it.frame(); | 
| 619     JSFunction* fun = JSFunction::cast(frame->function()); | 619     JSFunction* fun = JSFunction::cast(frame->function()); | 
| 620     Object* script = fun->shared()->script(); | 620     Object* script = fun->shared()->script(); | 
| 621     if (script->IsScript() && | 621     if (script->IsScript() && | 
| 622         !(Script::cast(script)->source()->IsUndefined())) { | 622         !(Script::cast(script)->source()->IsUndefined())) { | 
| 623       int pos = frame->LookupCode(this)->SourcePosition(frame->pc()); | 623       int pos = frame->LookupCode()->SourcePosition(frame->pc()); | 
| 624       // Compute the location from the function and the reloc info. | 624       // Compute the location from the function and the reloc info. | 
| 625       Handle<Script> casted_script(Script::cast(script)); | 625       Handle<Script> casted_script(Script::cast(script)); | 
| 626       *target = MessageLocation(casted_script, pos, pos + 1); | 626       *target = MessageLocation(casted_script, pos, pos + 1); | 
| 627     } | 627     } | 
| 628   } | 628   } | 
| 629 } | 629 } | 
| 630 | 630 | 
| 631 | 631 | 
| 632 bool Isolate::ShouldReportException(bool* can_be_caught_externally, | 632 bool Isolate::ShouldReportException(bool* can_be_caught_externally, | 
| 633                                     bool catchable_by_javascript) { | 633                                     bool catchable_by_javascript) { | 
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 971   thread_local_top()->simulator_ = Simulator::current(this); | 971   thread_local_top()->simulator_ = Simulator::current(this); | 
| 972 #endif | 972 #endif | 
| 973 #endif | 973 #endif | 
| 974   if (RuntimeProfiler::IsEnabled() && current_vm_state() == JS) { | 974   if (RuntimeProfiler::IsEnabled() && current_vm_state() == JS) { | 
| 975     RuntimeProfiler::IsolateEnteredJS(this); | 975     RuntimeProfiler::IsolateEnteredJS(this); | 
| 976   } | 976   } | 
| 977   return from + sizeof(ThreadLocalTop); | 977   return from + sizeof(ThreadLocalTop); | 
| 978 } | 978 } | 
| 979 | 979 | 
| 980 } }  // namespace v8::internal | 980 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|