| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index bc7550ed9a63e3a8ff55a6ed815ea4b93d8b9f79..a3be8ba7c448fed9e80bd8539f22b229c4cbb226 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -642,13 +642,17 @@ void Heap::ClearJSFunctionResultCaches() {
|
|
|
| Object* context = global_contexts_list_;
|
| while (!context->IsUndefined()) {
|
| - // Get the caches for this context:
|
| - FixedArray* caches =
|
| - Context::cast(context)->jsfunction_result_caches();
|
| - // Clear the caches:
|
| - int length = caches->length();
|
| - for (int i = 0; i < length; i++) {
|
| - JSFunctionResultCache::cast(caches->get(i))->Clear();
|
| + // Get the caches for this context. GC can happen when the context
|
| + // is not fully initialized, so the caches can be undefined.
|
| + Object* caches_or_undefined =
|
| + Context::cast(context)->get(Context::JSFUNCTION_RESULT_CACHES_INDEX);
|
| + if (!caches_or_undefined->IsUndefined()) {
|
| + FixedArray* caches = FixedArray::cast(caches_or_undefined);
|
| + // Clear the caches:
|
| + int length = caches->length();
|
| + for (int i = 0; i < length; i++) {
|
| + JSFunctionResultCache::cast(caches->get(i))->Clear();
|
| + }
|
| }
|
| // Get the next context:
|
| context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK);
|
| @@ -665,7 +669,13 @@ void Heap::ClearNormalizedMapCaches() {
|
|
|
| Object* context = global_contexts_list_;
|
| while (!context->IsUndefined()) {
|
| - Context::cast(context)->normalized_map_cache()->Clear();
|
| + // GC can happen when the context is not fully initialized,
|
| + // so the cache can be undefined.
|
| + Object* cache =
|
| + Context::cast(context)->get(Context::NORMALIZED_MAP_CACHE_INDEX);
|
| + if (!cache->IsUndefined()) {
|
| + NormalizedMapCache::cast(cache)->Clear();
|
| + }
|
| context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK);
|
| }
|
| }
|
|
|