| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 Add("/* anonymous */"); | 343 Add("/* anonymous */"); |
| 344 } | 344 } |
| 345 } else { | 345 } else { |
| 346 Add("%o", name); | 346 Add("%o", name); |
| 347 } | 347 } |
| 348 } | 348 } |
| 349 | 349 |
| 350 | 350 |
| 351 void StringStream::PrintUsingMap(JSObject* js_object) { | 351 void StringStream::PrintUsingMap(JSObject* js_object) { |
| 352 Map* map = js_object->map(); | 352 Map* map = js_object->map(); |
| 353 if (!HEAP->Contains(map) || | 353 if (!js_object->GetHeap()->Contains(map) || |
| 354 !map->IsHeapObject() || | 354 !map->IsHeapObject() || |
| 355 !map->IsMap()) { | 355 !map->IsMap()) { |
| 356 Add("<Invalid map>\n"); | 356 Add("<Invalid map>\n"); |
| 357 return; | 357 return; |
| 358 } | 358 } |
| 359 int real_size = map->NumberOfOwnDescriptors(); | 359 int real_size = map->NumberOfOwnDescriptors(); |
| 360 DescriptorArray* descs = map->instance_descriptors(); | 360 DescriptorArray* descs = map->instance_descriptors(); |
| 361 for (int i = 0; i < real_size; i++) { | 361 for (int i = 0; i < real_size; i++) { |
| 362 PropertyDetails details = descs->GetDetails(i); | 362 PropertyDetails details = descs->GetDetails(i); |
| 363 if (details.type() == FIELD) { | 363 if (details.type() == FIELD) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 377 Add(": "); | 377 Add(": "); |
| 378 Object* value = js_object->RawFastPropertyAt(descs->GetFieldIndex(i)); | 378 Object* value = js_object->RawFastPropertyAt(descs->GetFieldIndex(i)); |
| 379 Add("%o\n", value); | 379 Add("%o\n", value); |
| 380 } | 380 } |
| 381 } | 381 } |
| 382 } | 382 } |
| 383 } | 383 } |
| 384 | 384 |
| 385 | 385 |
| 386 void StringStream::PrintFixedArray(FixedArray* array, unsigned int limit) { | 386 void StringStream::PrintFixedArray(FixedArray* array, unsigned int limit) { |
| 387 Heap* heap = HEAP; | 387 Heap* heap = array->GetHeap(); |
| 388 for (unsigned int i = 0; i < 10 && i < limit; i++) { | 388 for (unsigned int i = 0; i < 10 && i < limit; i++) { |
| 389 Object* element = array->get(i); | 389 Object* element = array->get(i); |
| 390 if (element != heap->the_hole_value()) { | 390 if (element != heap->the_hole_value()) { |
| 391 for (int len = 1; len < 18; len++) | 391 for (int len = 1; len < 18; len++) |
| 392 Put(' '); | 392 Put(' '); |
| 393 Add("%d: %o\n", i, array->get(i)); | 393 Add("%d: %o\n", i, array->get(i)); |
| 394 } | 394 } |
| 395 } | 395 } |
| 396 if (limit >= 10) { | 396 if (limit >= 10) { |
| 397 Add(" ...\n"); | 397 Add(" ...\n"); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 Add("Security context: %o\n", token); | 484 Add("Security context: %o\n", token); |
| 485 isolate->set_string_stream_current_security_token(token); | 485 isolate->set_string_stream_current_security_token(token); |
| 486 } | 486 } |
| 487 } else { | 487 } else { |
| 488 Add("(Function context is corrupt)\n"); | 488 Add("(Function context is corrupt)\n"); |
| 489 } | 489 } |
| 490 } | 490 } |
| 491 | 491 |
| 492 | 492 |
| 493 void StringStream::PrintFunction(Object* f, Object* receiver, Code** code) { | 493 void StringStream::PrintFunction(Object* f, Object* receiver, Code** code) { |
| 494 if (f->IsHeapObject() && | 494 if (!f->IsHeapObject()) { |
| 495 HEAP->Contains(HeapObject::cast(f)) && | 495 Add("/* warning: 'function' was not a heap object */ "); |
| 496 HEAP->Contains(HeapObject::cast(f)->map()) && | 496 return; |
| 497 HeapObject::cast(f)->map()->IsMap()) { | 497 } |
| 498 if (f->IsJSFunction()) { | 498 Heap* heap = HeapObject::cast(f)->GetHeap(); |
| 499 JSFunction* fun = JSFunction::cast(f); | 499 if (!heap->Contains(HeapObject::cast(f))) { |
| 500 // Common case: on-stack function present and resolved. | 500 Add("/* warning: 'function' was not on the heap */ "); |
| 501 PrintPrototype(fun, receiver); | 501 return; |
| 502 *code = fun->code(); | 502 } |
| 503 } else if (f->IsInternalizedString()) { | 503 if (!heap->Contains(HeapObject::cast(f)->map())) { |
| 504 // Unresolved and megamorphic calls: Instead of the function | 504 Add("/* warning: function's map was not on the heap */ "); |
| 505 // we have the function name on the stack. | 505 return; |
| 506 PrintName(f); | 506 } |
| 507 Add("/* unresolved */ "); | 507 if (!HeapObject::cast(f)->map()->IsMap()) { |
| 508 } else { | 508 Add("/* warning: function's map was not a valid map */ "); |
| 509 // Unless this is the frame of a built-in function, we should always have | 509 return; |
| 510 // the callee function or name on the stack. If we don't, we have a | 510 } |
| 511 // problem or a change of the stack frame layout. | 511 if (f->IsJSFunction()) { |
| 512 Add("%o", f); | 512 JSFunction* fun = JSFunction::cast(f); |
| 513 Add("/* warning: no JSFunction object or function name found */ "); | 513 // Common case: on-stack function present and resolved. |
| 514 } | 514 PrintPrototype(fun, receiver); |
| 515 /* } else if (is_trampoline()) { | 515 *code = fun->code(); |
| 516 Print("trampoline "); | 516 } else if (f->IsInternalizedString()) { |
| 517 */ | 517 // Unresolved and megamorphic calls: Instead of the function |
| 518 // we have the function name on the stack. |
| 519 PrintName(f); |
| 520 Add("/* unresolved */ "); |
| 518 } else { | 521 } else { |
| 519 if (!f->IsHeapObject()) { | 522 // Unless this is the frame of a built-in function, we should always have |
| 520 Add("/* warning: 'function' was not a heap object */ "); | 523 // the callee function or name on the stack. If we don't, we have a |
| 521 return; | 524 // problem or a change of the stack frame layout. |
| 522 } | 525 Add("%o", f); |
| 523 if (!HEAP->Contains(HeapObject::cast(f))) { | 526 Add("/* warning: no JSFunction object or function name found */ "); |
| 524 Add("/* warning: 'function' was not on the heap */ "); | |
| 525 return; | |
| 526 } | |
| 527 if (!HEAP->Contains(HeapObject::cast(f)->map())) { | |
| 528 Add("/* warning: function's map was not on the heap */ "); | |
| 529 return; | |
| 530 } | |
| 531 if (!HeapObject::cast(f)->map()->IsMap()) { | |
| 532 Add("/* warning: function's map was not a valid map */ "); | |
| 533 return; | |
| 534 } | |
| 535 Add("/* warning: Invalid JSFunction object found */ "); | |
| 536 } | 527 } |
| 537 } | 528 } |
| 538 | 529 |
| 539 | 530 |
| 540 void StringStream::PrintPrototype(JSFunction* fun, Object* receiver) { | 531 void StringStream::PrintPrototype(JSFunction* fun, Object* receiver) { |
| 541 Object* name = fun->shared()->name(); | 532 Object* name = fun->shared()->name(); |
| 542 bool print_name = false; | 533 bool print_name = false; |
| 543 Isolate* isolate = fun->GetIsolate(); | 534 Isolate* isolate = fun->GetIsolate(); |
| 544 for (Object* p = receiver; | 535 for (Object* p = receiver; |
| 545 p != isolate->heap()->null_value(); | 536 p != isolate->heap()->null_value(); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 | 583 |
| 593 // Only grow once to the maximum allowable size. | 584 // Only grow once to the maximum allowable size. |
| 594 char* NoAllocationStringAllocator::grow(unsigned* bytes) { | 585 char* NoAllocationStringAllocator::grow(unsigned* bytes) { |
| 595 ASSERT(size_ >= *bytes); | 586 ASSERT(size_ >= *bytes); |
| 596 *bytes = size_; | 587 *bytes = size_; |
| 597 return space_; | 588 return space_; |
| 598 } | 589 } |
| 599 | 590 |
| 600 | 591 |
| 601 } } // namespace v8::internal | 592 } } // namespace v8::internal |
| OLD | NEW |