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 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 int entry = from->FindEntry(i + from_start); | 476 int entry = from->FindEntry(i + from_start); |
477 if (entry != SeededNumberDictionary::kNotFound) { | 477 if (entry != SeededNumberDictionary::kNotFound) { |
478 to->set(i + to_start, from->ValueAt(entry)->Number()); | 478 to->set(i + to_start, from->ValueAt(entry)->Number()); |
479 } else { | 479 } else { |
480 to->set_the_hole(i + to_start); | 480 to->set_the_hole(i + to_start); |
481 } | 481 } |
482 } | 482 } |
483 } | 483 } |
484 | 484 |
485 | 485 |
486 static void TraceTopFrame() { | 486 static void TraceTopFrame(Isolate* isolate) { |
487 StackFrameIterator it; | 487 StackFrameIterator it(isolate); |
488 if (it.done()) { | 488 if (it.done()) { |
489 PrintF("unknown location (no JavaScript frames present)"); | 489 PrintF("unknown location (no JavaScript frames present)"); |
490 return; | 490 return; |
491 } | 491 } |
492 StackFrame* raw_frame = it.frame(); | 492 StackFrame* raw_frame = it.frame(); |
493 if (raw_frame->is_internal()) { | 493 if (raw_frame->is_internal()) { |
494 Isolate* isolate = Isolate::Current(); | 494 Isolate* isolate = Isolate::Current(); |
495 Code* apply_builtin = isolate->builtins()->builtin( | 495 Code* apply_builtin = isolate->builtins()->builtin( |
496 Builtins::kFunctionApply); | 496 Builtins::kFunctionApply); |
497 if (raw_frame->unchecked_code() == apply_builtin) { | 497 if (raw_frame->unchecked_code() == apply_builtin) { |
498 PrintF("apply from "); | 498 PrintF("apply from "); |
499 it.Advance(); | 499 it.Advance(); |
500 raw_frame = it.frame(); | 500 raw_frame = it.frame(); |
501 } | 501 } |
502 } | 502 } |
503 JavaScriptFrame::PrintTop(stdout, false, true); | 503 JavaScriptFrame::PrintTop(isolate, stdout, false, true); |
504 } | 504 } |
505 | 505 |
506 | 506 |
507 void CheckArrayAbuse(JSObject* obj, const char* op, uint32_t key, | 507 void CheckArrayAbuse(JSObject* obj, const char* op, uint32_t key, |
508 bool allow_appending) { | 508 bool allow_appending) { |
509 Object* raw_length = NULL; | 509 Object* raw_length = NULL; |
510 const char* elements_type = "array"; | 510 const char* elements_type = "array"; |
511 if (obj->IsJSArray()) { | 511 if (obj->IsJSArray()) { |
512 JSArray* array = JSArray::cast(obj); | 512 JSArray* array = JSArray::cast(obj); |
513 raw_length = array->length(); | 513 raw_length = array->length(); |
514 } else { | 514 } else { |
515 raw_length = Smi::FromInt(obj->elements()->length()); | 515 raw_length = Smi::FromInt(obj->elements()->length()); |
516 elements_type = "object"; | 516 elements_type = "object"; |
517 } | 517 } |
518 | 518 |
519 if (raw_length->IsNumber()) { | 519 if (raw_length->IsNumber()) { |
520 double n = raw_length->Number(); | 520 double n = raw_length->Number(); |
521 if (FastI2D(FastD2UI(n)) == n) { | 521 if (FastI2D(FastD2UI(n)) == n) { |
522 int32_t int32_length = DoubleToInt32(n); | 522 int32_t int32_length = DoubleToInt32(n); |
523 uint32_t compare_length = static_cast<uint32_t>(int32_length); | 523 uint32_t compare_length = static_cast<uint32_t>(int32_length); |
524 if (allow_appending) compare_length++; | 524 if (allow_appending) compare_length++; |
525 if (key >= compare_length) { | 525 if (key >= compare_length) { |
526 PrintF("[OOB %s %s (%s length = %d, element accessed = %d) in ", | 526 PrintF("[OOB %s %s (%s length = %d, element accessed = %d) in ", |
527 elements_type, op, elements_type, | 527 elements_type, op, elements_type, |
528 static_cast<int>(int32_length), | 528 static_cast<int>(int32_length), |
529 static_cast<int>(key)); | 529 static_cast<int>(key)); |
530 TraceTopFrame(); | 530 TraceTopFrame(obj->GetIsolate()); |
531 PrintF("]\n"); | 531 PrintF("]\n"); |
532 } | 532 } |
533 } else { | 533 } else { |
534 PrintF("[%s elements length not integer value in ", elements_type); | 534 PrintF("[%s elements length not integer value in ", elements_type); |
535 TraceTopFrame(); | 535 TraceTopFrame(obj->GetIsolate()); |
536 PrintF("]\n"); | 536 PrintF("]\n"); |
537 } | 537 } |
538 } else { | 538 } else { |
539 PrintF("[%s elements length not a number in ", elements_type); | 539 PrintF("[%s elements length not a number in ", elements_type); |
540 TraceTopFrame(); | 540 TraceTopFrame(obj->GetIsolate()); |
541 PrintF("]\n"); | 541 PrintF("]\n"); |
542 } | 542 } |
543 } | 543 } |
544 | 544 |
545 | 545 |
546 // Base class for element handler implementations. Contains the | 546 // Base class for element handler implementations. Contains the |
547 // the common logic for objects with different ElementsKinds. | 547 // the common logic for objects with different ElementsKinds. |
548 // Subclasses must specialize method for which the element | 548 // Subclasses must specialize method for which the element |
549 // implementation differs from the base class implementation. | 549 // implementation differs from the base class implementation. |
550 // | 550 // |
(...skipping 1416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1967 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; | 1967 if (!maybe_obj->To(&new_backing_store)) return maybe_obj; |
1968 new_backing_store->set(0, length); | 1968 new_backing_store->set(0, length); |
1969 { MaybeObject* result = array->SetContent(new_backing_store); | 1969 { MaybeObject* result = array->SetContent(new_backing_store); |
1970 if (result->IsFailure()) return result; | 1970 if (result->IsFailure()) return result; |
1971 } | 1971 } |
1972 return array; | 1972 return array; |
1973 } | 1973 } |
1974 | 1974 |
1975 | 1975 |
1976 } } // namespace v8::internal | 1976 } } // namespace v8::internal |
OLD | NEW |