OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 7245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7256 } else { | 7256 } else { |
7257 map()->set_non_instance_prototype(false); | 7257 map()->set_non_instance_prototype(false); |
7258 } | 7258 } |
7259 | 7259 |
7260 return SetInstancePrototype(construct_prototype); | 7260 return SetInstancePrototype(construct_prototype); |
7261 } | 7261 } |
7262 | 7262 |
7263 | 7263 |
7264 Object* JSFunction::RemovePrototype() { | 7264 Object* JSFunction::RemovePrototype() { |
7265 Context* global_context = context()->global_context(); | 7265 Context* global_context = context()->global_context(); |
7266 Map* no_prototype_map = shared()->strict_mode() | 7266 Map* no_prototype_map = shared()->is_classic_mode() |
7267 ? global_context->strict_mode_function_without_prototype_map() | 7267 ? global_context->function_without_prototype_map() |
7268 : global_context->function_without_prototype_map(); | 7268 : global_context->strict_mode_function_without_prototype_map(); |
7269 | 7269 |
7270 if (map() == no_prototype_map) { | 7270 if (map() == no_prototype_map) { |
7271 // Be idempotent. | 7271 // Be idempotent. |
7272 return this; | 7272 return this; |
7273 } | 7273 } |
7274 | 7274 |
7275 ASSERT(!shared()->strict_mode() || | 7275 ASSERT(shared()->is_classic_mode() || |
7276 map() == global_context->strict_mode_function_map()); | 7276 map() == global_context->strict_mode_function_map()); |
7277 ASSERT(shared()->strict_mode() || map() == global_context->function_map()); | 7277 ASSERT(!shared()->is_classic_mode() || |
7278 map() == global_context->function_map()); | |
rossberg
2011/11/09 12:15:29
Nit: These two assertions could be a single
map()
| |
7278 | 7279 |
7279 set_map(no_prototype_map); | 7280 set_map(no_prototype_map); |
7280 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value()); | 7281 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value()); |
7281 return this; | 7282 return this; |
7282 } | 7283 } |
7283 | 7284 |
7284 | 7285 |
7285 Object* JSFunction::SetInstanceClassName(String* name) { | 7286 Object* JSFunction::SetInstanceClassName(String* name) { |
7286 shared()->set_instance_class_name(name); | 7287 shared()->set_instance_class_name(name); |
7287 return this; | 7288 return this; |
(...skipping 3207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10495 String* string_; | 10496 String* string_; |
10496 uint32_t hash_; | 10497 uint32_t hash_; |
10497 }; | 10498 }; |
10498 | 10499 |
10499 | 10500 |
10500 // StringSharedKeys are used as keys in the eval cache. | 10501 // StringSharedKeys are used as keys in the eval cache. |
10501 class StringSharedKey : public HashTableKey { | 10502 class StringSharedKey : public HashTableKey { |
10502 public: | 10503 public: |
10503 StringSharedKey(String* source, | 10504 StringSharedKey(String* source, |
10504 SharedFunctionInfo* shared, | 10505 SharedFunctionInfo* shared, |
10505 StrictModeFlag strict_mode) | 10506 LanguageMode language_mode) |
10506 : source_(source), | 10507 : source_(source), |
10507 shared_(shared), | 10508 shared_(shared), |
10508 strict_mode_(strict_mode) { } | 10509 language_mode_(language_mode) { } |
10509 | 10510 |
10510 bool IsMatch(Object* other) { | 10511 bool IsMatch(Object* other) { |
10511 if (!other->IsFixedArray()) return false; | 10512 if (!other->IsFixedArray()) return false; |
10512 FixedArray* pair = FixedArray::cast(other); | 10513 FixedArray* pair = FixedArray::cast(other); |
10513 SharedFunctionInfo* shared = SharedFunctionInfo::cast(pair->get(0)); | 10514 SharedFunctionInfo* shared = SharedFunctionInfo::cast(pair->get(0)); |
10514 if (shared != shared_) return false; | 10515 if (shared != shared_) return false; |
10515 int strict_unchecked = Smi::cast(pair->get(2))->value(); | 10516 int language_unchecked = Smi::cast(pair->get(2))->value(); |
10516 ASSERT(strict_unchecked == kStrictMode || | 10517 LanguageMode language_mode = static_cast<LanguageMode>(language_unchecked); |
10517 strict_unchecked == kNonStrictMode); | 10518 if (language_mode != language_mode_) return false; |
10518 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(strict_unchecked); | |
10519 if (strict_mode != strict_mode_) return false; | |
10520 String* source = String::cast(pair->get(1)); | 10519 String* source = String::cast(pair->get(1)); |
10521 return source->Equals(source_); | 10520 return source->Equals(source_); |
10522 } | 10521 } |
10523 | 10522 |
10524 static uint32_t StringSharedHashHelper(String* source, | 10523 static uint32_t StringSharedHashHelper(String* source, |
10525 SharedFunctionInfo* shared, | 10524 SharedFunctionInfo* shared, |
10526 StrictModeFlag strict_mode) { | 10525 LanguageMode language_mode) { |
10527 uint32_t hash = source->Hash(); | 10526 uint32_t hash = source->Hash(); |
10528 if (shared->HasSourceCode()) { | 10527 if (shared->HasSourceCode()) { |
10529 // Instead of using the SharedFunctionInfo pointer in the hash | 10528 // Instead of using the SharedFunctionInfo pointer in the hash |
10530 // code computation, we use a combination of the hash of the | 10529 // code computation, we use a combination of the hash of the |
10531 // script source code and the start and end positions. We do | 10530 // script source code and the start and end positions. We do |
10532 // this to ensure that the cache entries can survive garbage | 10531 // this to ensure that the cache entries can survive garbage |
10533 // collection. | 10532 // collection. |
10534 Script* script = Script::cast(shared->script()); | 10533 Script* script = Script::cast(shared->script()); |
10535 hash ^= String::cast(script->source())->Hash(); | 10534 hash ^= String::cast(script->source())->Hash(); |
10536 if (strict_mode == kStrictMode) hash ^= 0x8000; | 10535 if (language_mode == STRICT_MODE) hash ^= 0x8000; |
10536 if (language_mode == EXTENDED_MODE) hash ^= 0x0080; | |
10537 hash += shared->start_position(); | 10537 hash += shared->start_position(); |
10538 } | 10538 } |
10539 return hash; | 10539 return hash; |
10540 } | 10540 } |
10541 | 10541 |
10542 uint32_t Hash() { | 10542 uint32_t Hash() { |
10543 return StringSharedHashHelper(source_, shared_, strict_mode_); | 10543 return StringSharedHashHelper(source_, shared_, language_mode_); |
10544 } | 10544 } |
10545 | 10545 |
10546 uint32_t HashForObject(Object* obj) { | 10546 uint32_t HashForObject(Object* obj) { |
10547 FixedArray* pair = FixedArray::cast(obj); | 10547 FixedArray* pair = FixedArray::cast(obj); |
10548 SharedFunctionInfo* shared = SharedFunctionInfo::cast(pair->get(0)); | 10548 SharedFunctionInfo* shared = SharedFunctionInfo::cast(pair->get(0)); |
10549 String* source = String::cast(pair->get(1)); | 10549 String* source = String::cast(pair->get(1)); |
10550 int strict_unchecked = Smi::cast(pair->get(2))->value(); | 10550 int language_unchecked = Smi::cast(pair->get(2))->value(); |
10551 ASSERT(strict_unchecked == kStrictMode || | 10551 ASSERT(language_unchecked == CLASSIC_MODE || |
10552 strict_unchecked == kNonStrictMode); | 10552 language_unchecked == STRICT_MODE || |
10553 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(strict_unchecked); | 10553 language_unchecked == EXTENDED_MODE); |
10554 return StringSharedHashHelper(source, shared, strict_mode); | 10554 LanguageMode language_mode = static_cast<LanguageMode>(language_unchecked); |
10555 return StringSharedHashHelper(source, shared, language_mode); | |
10555 } | 10556 } |
10556 | 10557 |
10557 MUST_USE_RESULT MaybeObject* AsObject() { | 10558 MUST_USE_RESULT MaybeObject* AsObject() { |
10558 Object* obj; | 10559 Object* obj; |
10559 { MaybeObject* maybe_obj = source_->GetHeap()->AllocateFixedArray(3); | 10560 { MaybeObject* maybe_obj = source_->GetHeap()->AllocateFixedArray(3); |
10560 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 10561 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
10561 } | 10562 } |
10562 FixedArray* pair = FixedArray::cast(obj); | 10563 FixedArray* pair = FixedArray::cast(obj); |
10563 pair->set(0, shared_); | 10564 pair->set(0, shared_); |
10564 pair->set(1, source_); | 10565 pair->set(1, source_); |
10565 pair->set(2, Smi::FromInt(strict_mode_)); | 10566 pair->set(2, Smi::FromInt(language_mode_)); |
10566 return pair; | 10567 return pair; |
10567 } | 10568 } |
10568 | 10569 |
10569 private: | 10570 private: |
10570 String* source_; | 10571 String* source_; |
10571 SharedFunctionInfo* shared_; | 10572 SharedFunctionInfo* shared_; |
10572 StrictModeFlag strict_mode_; | 10573 LanguageMode language_mode_; |
10573 }; | 10574 }; |
10574 | 10575 |
10575 | 10576 |
10576 // RegExpKey carries the source and flags of a regular expression as key. | 10577 // RegExpKey carries the source and flags of a regular expression as key. |
10577 class RegExpKey : public HashTableKey { | 10578 class RegExpKey : public HashTableKey { |
10578 public: | 10579 public: |
10579 RegExpKey(String* string, JSRegExp::Flags flags) | 10580 RegExpKey(String* string, JSRegExp::Flags flags) |
10580 : string_(string), | 10581 : string_(string), |
10581 flags_(Smi::FromInt(flags.value())) { } | 10582 flags_(Smi::FromInt(flags.value())) { } |
10582 | 10583 |
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11717 Object* CompilationCacheTable::Lookup(String* src) { | 11718 Object* CompilationCacheTable::Lookup(String* src) { |
11718 StringKey key(src); | 11719 StringKey key(src); |
11719 int entry = FindEntry(&key); | 11720 int entry = FindEntry(&key); |
11720 if (entry == kNotFound) return GetHeap()->undefined_value(); | 11721 if (entry == kNotFound) return GetHeap()->undefined_value(); |
11721 return get(EntryToIndex(entry) + 1); | 11722 return get(EntryToIndex(entry) + 1); |
11722 } | 11723 } |
11723 | 11724 |
11724 | 11725 |
11725 Object* CompilationCacheTable::LookupEval(String* src, | 11726 Object* CompilationCacheTable::LookupEval(String* src, |
11726 Context* context, | 11727 Context* context, |
11727 StrictModeFlag strict_mode) { | 11728 LanguageMode language_mode) { |
11728 StringSharedKey key(src, context->closure()->shared(), strict_mode); | 11729 StringSharedKey key(src, context->closure()->shared(), language_mode); |
11729 int entry = FindEntry(&key); | 11730 int entry = FindEntry(&key); |
11730 if (entry == kNotFound) return GetHeap()->undefined_value(); | 11731 if (entry == kNotFound) return GetHeap()->undefined_value(); |
11731 return get(EntryToIndex(entry) + 1); | 11732 return get(EntryToIndex(entry) + 1); |
11732 } | 11733 } |
11733 | 11734 |
11734 | 11735 |
11735 Object* CompilationCacheTable::LookupRegExp(String* src, | 11736 Object* CompilationCacheTable::LookupRegExp(String* src, |
11736 JSRegExp::Flags flags) { | 11737 JSRegExp::Flags flags) { |
11737 RegExpKey key(src, flags); | 11738 RegExpKey key(src, flags); |
11738 int entry = FindEntry(&key); | 11739 int entry = FindEntry(&key); |
(...skipping 17 matching lines...) Expand all Loading... | |
11756 cache->ElementAdded(); | 11757 cache->ElementAdded(); |
11757 return cache; | 11758 return cache; |
11758 } | 11759 } |
11759 | 11760 |
11760 | 11761 |
11761 MaybeObject* CompilationCacheTable::PutEval(String* src, | 11762 MaybeObject* CompilationCacheTable::PutEval(String* src, |
11762 Context* context, | 11763 Context* context, |
11763 SharedFunctionInfo* value) { | 11764 SharedFunctionInfo* value) { |
11764 StringSharedKey key(src, | 11765 StringSharedKey key(src, |
11765 context->closure()->shared(), | 11766 context->closure()->shared(), |
11766 value->strict_mode_flag()); | 11767 value->language_mode()); |
11767 Object* obj; | 11768 Object* obj; |
11768 { MaybeObject* maybe_obj = EnsureCapacity(1, &key); | 11769 { MaybeObject* maybe_obj = EnsureCapacity(1, &key); |
11769 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 11770 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
11770 } | 11771 } |
11771 | 11772 |
11772 CompilationCacheTable* cache = | 11773 CompilationCacheTable* cache = |
11773 reinterpret_cast<CompilationCacheTable*>(obj); | 11774 reinterpret_cast<CompilationCacheTable*>(obj); |
11774 int entry = cache->FindInsertionEntry(key.Hash()); | 11775 int entry = cache->FindInsertionEntry(key.Hash()); |
11775 | 11776 |
11776 Object* k; | 11777 Object* k; |
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12750 if (break_point_objects()->IsUndefined()) return 0; | 12751 if (break_point_objects()->IsUndefined()) return 0; |
12751 // Single break point. | 12752 // Single break point. |
12752 if (!break_point_objects()->IsFixedArray()) return 1; | 12753 if (!break_point_objects()->IsFixedArray()) return 1; |
12753 // Multiple break points. | 12754 // Multiple break points. |
12754 return FixedArray::cast(break_point_objects())->length(); | 12755 return FixedArray::cast(break_point_objects())->length(); |
12755 } | 12756 } |
12756 #endif // ENABLE_DEBUGGER_SUPPORT | 12757 #endif // ENABLE_DEBUGGER_SUPPORT |
12757 | 12758 |
12758 | 12759 |
12759 } } // namespace v8::internal | 12760 } } // namespace v8::internal |
OLD | NEW |