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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
418 // slots start after length entry | 418 // slots start after length entry |
419 Object** p0 = StackSlotEntriesAddr(code) + 1; | 419 Object** p0 = StackSlotEntriesAddr(code) + 1; |
420 Object** p = p0; | 420 Object** p = p0; |
421 while (*p != NULL) { | 421 while (*p != NULL) { |
422 if (*p == name) return p - p0; | 422 if (*p == name) return p - p0; |
423 p++; | 423 p++; |
424 } | 424 } |
425 } | 425 } |
426 return -1; | 426 return -1; |
427 } | 427 } |
428 | 428 |
Mads Ager (chromium)
2009/06/22 08:00:18
Remove extra lines.
| |
429 | 429 |
430 | |
431 | |
430 template<class Allocator> | 432 template<class Allocator> |
431 int ScopeInfo<Allocator>::ContextSlotIndex(Code* code, | 433 int ScopeInfo<Allocator>::ContextSlotIndex(Code* code, |
432 String* name, | 434 String* name, |
433 Variable::Mode* mode) { | 435 Variable::Mode* mode) { |
434 ASSERT(name->IsSymbol()); | 436 ASSERT(name->IsSymbol()); |
437 int result = ContextSlotCache::Lookup(code, name, mode); | |
438 if (result != ContextSlotCache::kNotFound) return result; | |
435 if (code->sinfo_size() > 0) { | 439 if (code->sinfo_size() > 0) { |
436 // Loop below depends on the NULL sentinel after the context slot names. | 440 // Loop below depends on the NULL sentinel after the context slot names. |
437 ASSERT(NumberOfContextSlots(code) >= Context::MIN_CONTEXT_SLOTS || | 441 ASSERT(NumberOfContextSlots(code) >= Context::MIN_CONTEXT_SLOTS || |
438 *(ContextEntriesAddr(code) + 1) == NULL); | 442 *(ContextEntriesAddr(code) + 1) == NULL); |
443 | |
439 // slots start after length entry | 444 // slots start after length entry |
440 Object** p0 = ContextEntriesAddr(code) + 1; | 445 Object** p0 = ContextEntriesAddr(code) + 1; |
441 Object** p = p0; | 446 Object** p = p0; |
442 // contexts may have no variable slots (in the presence of eval()). | 447 // contexts may have no variable slots (in the presence of eval()). |
443 while (*p != NULL) { | 448 while (*p != NULL) { |
444 if (*p == name) { | 449 if (*p == name) { |
445 ASSERT(((p - p0) & 1) == 0); | 450 ASSERT(((p - p0) & 1) == 0); |
446 if (mode != NULL) { | 451 int v; |
447 ReadInt(p + 1, reinterpret_cast<int*>(mode)); | 452 ReadInt(p + 1, &v); |
448 } | 453 Variable::Mode mode_value = static_cast<Variable::Mode>(v); |
449 return ((p - p0) >> 1) + Context::MIN_CONTEXT_SLOTS; | 454 if (mode != NULL) *mode = mode_value; |
455 result = ((p - p0) >> 1) + Context::MIN_CONTEXT_SLOTS; | |
456 ContextSlotCache::Update(code, name, mode_value, result); | |
457 return result; | |
450 } | 458 } |
451 p += 2; | 459 p += 2; |
452 } | 460 } |
453 } | 461 } |
462 ContextSlotCache::Update(code, name, Variable::INTERNAL, -1); | |
454 return -1; | 463 return -1; |
455 } | 464 } |
456 | 465 |
457 | 466 |
458 template<class Allocator> | 467 template<class Allocator> |
459 int ScopeInfo<Allocator>::ParameterIndex(Code* code, String* name) { | 468 int ScopeInfo<Allocator>::ParameterIndex(Code* code, String* name) { |
460 ASSERT(name->IsSymbol()); | 469 ASSERT(name->IsSymbol()); |
461 if (code->sinfo_size() > 0) { | 470 if (code->sinfo_size() > 0) { |
462 // We must read parameters from the end since for | 471 // We must read parameters from the end since for |
463 // multiply declared parameters the value of the | 472 // multiply declared parameters the value of the |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
519 int ScopeInfo<Allocator>::NumberOfLocals() const { | 528 int ScopeInfo<Allocator>::NumberOfLocals() const { |
520 int number_of_locals = number_of_stack_slots(); | 529 int number_of_locals = number_of_stack_slots(); |
521 if (number_of_context_slots() > 0) { | 530 if (number_of_context_slots() > 0) { |
522 ASSERT(number_of_context_slots() >= Context::MIN_CONTEXT_SLOTS); | 531 ASSERT(number_of_context_slots() >= Context::MIN_CONTEXT_SLOTS); |
523 number_of_locals += number_of_context_slots() - Context::MIN_CONTEXT_SLOTS; | 532 number_of_locals += number_of_context_slots() - Context::MIN_CONTEXT_SLOTS; |
524 } | 533 } |
525 return number_of_locals; | 534 return number_of_locals; |
526 } | 535 } |
527 | 536 |
528 | 537 |
538 int ContextSlotCache::Hash(Code* code, String* name) { | |
539 // Uses only lower 32 bits if pointers are larger. | |
540 uintptr_t addr_hash = | |
541 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(code)) >> 2; | |
542 return (addr_hash ^ name->Hash()) % kLength; | |
543 } | |
544 | |
545 | |
546 int ContextSlotCache::Lookup(Code* code, | |
547 String* name, | |
548 Variable::Mode* mode) { | |
549 int index = Hash(code, name); | |
550 Key& key = keys_[index]; | |
551 if ((key.code == code) && key.name->Equals(name)) { | |
552 Value result(values_[index]); | |
553 if (mode != NULL) *mode = result.mode(); | |
554 return result.index() + kNotFound; | |
555 } | |
556 return kNotFound; | |
557 } | |
558 | |
559 | |
560 void ContextSlotCache::Update(Code* code, | |
561 String* name, | |
562 Variable::Mode mode, | |
563 int slot_index) { | |
564 String* symbol; | |
565 ASSERT(slot_index > kNotFound); | |
566 if (Heap::LookupSymbolIfExists(name, &symbol)) { | |
567 int index = Hash(code, symbol); | |
568 Key& key = keys_[index]; | |
569 key.code = code; | |
570 key.name = symbol; | |
571 // Please note value only takes a uint as index. | |
572 values_[index] = Value(mode, slot_index - kNotFound).raw(); | |
529 #ifdef DEBUG | 573 #ifdef DEBUG |
574 Check(code, name, mode, slot_index); | |
575 #endif | |
576 } | |
577 } | |
578 | |
579 | |
580 void ContextSlotCache::Clear() { | |
581 for (int index = 0; index < kLength; index++) keys_[index].code = NULL; | |
582 } | |
583 | |
584 | |
585 ContextSlotCache::Key ContextSlotCache::keys_[ContextSlotCache::kLength]; | |
586 | |
587 | |
588 uint32_t ContextSlotCache::values_[ContextSlotCache::kLength]; | |
589 | |
590 | |
591 #ifdef DEBUG | |
592 | |
593 void ContextSlotCache::Check(Code* code, | |
594 String* name, | |
595 Variable::Mode mode, | |
596 int slot_index) { | |
597 String* symbol; | |
598 if (Heap::LookupSymbolIfExists(name, &symbol)) { | |
599 int index = Hash(code, name); | |
600 Key& key = keys_[index]; | |
601 ASSERT(key.code == code); | |
602 ASSERT(key.name->Equals(name)); | |
603 Value result(values_[index]); | |
604 ASSERT(result.mode() == mode); | |
605 ASSERT(result.index() + kNotFound == slot_index); | |
606 } | |
607 } | |
608 | |
609 | |
530 template <class Allocator> | 610 template <class Allocator> |
531 static void PrintList(const char* list_name, | 611 static void PrintList(const char* list_name, |
532 int nof_internal_slots, | 612 int nof_internal_slots, |
533 List<Handle<String>, Allocator>& list) { | 613 List<Handle<String>, Allocator>& list) { |
534 if (list.length() > 0) { | 614 if (list.length() > 0) { |
535 PrintF("\n // %s\n", list_name); | 615 PrintF("\n // %s\n", list_name); |
536 if (nof_internal_slots > 0) { | 616 if (nof_internal_slots > 0) { |
537 PrintF(" %2d - %2d [internal slots]\n", 0 , nof_internal_slots - 1); | 617 PrintF(" %2d - %2d [internal slots]\n", 0 , nof_internal_slots - 1); |
538 } | 618 } |
539 for (int i = 0; i < list.length(); i++) { | 619 for (int i = 0; i < list.length(); i++) { |
(...skipping 23 matching lines...) Expand all Loading... | |
563 } | 643 } |
564 #endif // DEBUG | 644 #endif // DEBUG |
565 | 645 |
566 | 646 |
567 // Make sure the classes get instantiated by the template system. | 647 // Make sure the classes get instantiated by the template system. |
568 template class ScopeInfo<FreeStoreAllocationPolicy>; | 648 template class ScopeInfo<FreeStoreAllocationPolicy>; |
569 template class ScopeInfo<PreallocatedStorage>; | 649 template class ScopeInfo<PreallocatedStorage>; |
570 template class ScopeInfo<ZoneListAllocationPolicy>; | 650 template class ScopeInfo<ZoneListAllocationPolicy>; |
571 | 651 |
572 } } // namespace v8::internal | 652 } } // namespace v8::internal |
OLD | NEW |