Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 36a8e5c2aabc360e74cb58a40acd35fb6f4ed151..76fbb296c2b78b7297bbdfbe8beabe5079cc9cfb 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -7982,20 +7982,28 @@ class StringKey : public HashTableKey { |
// StringSharedKeys are used as keys in the eval cache. |
class StringSharedKey : public HashTableKey { |
public: |
- StringSharedKey(String* source, SharedFunctionInfo* shared) |
- : source_(source), shared_(shared) { } |
+ StringSharedKey(String* source, |
+ SharedFunctionInfo* shared, |
+ StrictModeFlag strict_mode) |
+ : source_(source), |
+ shared_(shared), |
+ strict_mode_(strict_mode) { } |
bool IsMatch(Object* other) { |
if (!other->IsFixedArray()) return false; |
FixedArray* pair = FixedArray::cast(other); |
SharedFunctionInfo* shared = SharedFunctionInfo::cast(pair->get(0)); |
if (shared != shared_) return false; |
+ StrictModeFlag strict_mode = static_cast<StrictModeFlag>( |
+ Smi::cast(pair->get(2))->value()); |
+ if (strict_mode != strict_mode_) return false; |
String* source = String::cast(pair->get(1)); |
return source->Equals(source_); |
} |
static uint32_t StringSharedHashHelper(String* source, |
- SharedFunctionInfo* shared) { |
+ SharedFunctionInfo* shared, |
+ StrictModeFlag strict_mode) { |
uint32_t hash = source->Hash(); |
if (shared->HasSourceCode()) { |
// Instead of using the SharedFunctionInfo pointer in the hash |
@@ -8005,36 +8013,41 @@ class StringSharedKey : public HashTableKey { |
// collection. |
Script* script = Script::cast(shared->script()); |
hash ^= String::cast(script->source())->Hash(); |
+ if (strict_mode == kStrictMode) hash ^= 0x8000; |
hash += shared->start_position(); |
} |
return hash; |
} |
uint32_t Hash() { |
- return StringSharedHashHelper(source_, shared_); |
+ return StringSharedHashHelper(source_, shared_, strict_mode_); |
} |
uint32_t HashForObject(Object* obj) { |
FixedArray* pair = FixedArray::cast(obj); |
SharedFunctionInfo* shared = SharedFunctionInfo::cast(pair->get(0)); |
String* source = String::cast(pair->get(1)); |
- return StringSharedHashHelper(source, shared); |
+ StrictModeFlag strict_mode = static_cast<StrictModeFlag>( |
+ Smi::cast(pair->get(2))->value()); |
+ return StringSharedHashHelper(source, shared, strict_mode); |
} |
MUST_USE_RESULT MaybeObject* AsObject() { |
Object* obj; |
- { MaybeObject* maybe_obj = Heap::AllocateFixedArray(2); |
+ { MaybeObject* maybe_obj = Heap::AllocateFixedArray(3); |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
} |
FixedArray* pair = FixedArray::cast(obj); |
pair->set(0, shared_); |
pair->set(1, source_); |
+ pair->set(2, Smi::FromInt(strict_mode_)); |
return pair; |
} |
private: |
String* source_; |
SharedFunctionInfo* shared_; |
+ StrictModeFlag strict_mode_; |
}; |
@@ -8993,8 +9006,10 @@ Object* CompilationCacheTable::Lookup(String* src) { |
} |
-Object* CompilationCacheTable::LookupEval(String* src, Context* context) { |
- StringSharedKey key(src, context->closure()->shared()); |
+Object* CompilationCacheTable::LookupEval(String* src, |
+ Context* context, |
+ StrictModeFlag strict_mode) { |
+ StringSharedKey key(src, context->closure()->shared(), strict_mode); |
int entry = FindEntry(&key); |
if (entry == kNotFound) return Heap::undefined_value(); |
return get(EntryToIndex(entry) + 1); |
@@ -9029,8 +9044,10 @@ MaybeObject* CompilationCacheTable::Put(String* src, Object* value) { |
MaybeObject* CompilationCacheTable::PutEval(String* src, |
Context* context, |
- Object* value) { |
- StringSharedKey key(src, context->closure()->shared()); |
+ SharedFunctionInfo* value) { |
+ StringSharedKey key(src, |
+ context->closure()->shared(), |
+ value->strict_mode() ? kStrictMode : kNonStrictMode); |
Object* obj; |
{ MaybeObject* maybe_obj = EnsureCapacity(1, &key); |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |