Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/runtime.cc

Issue 14850006: Use mutable heapnumbers to store doubles in fields. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Ported to ARM and x64 Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/property.h ('k') | src/string-stream.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 4343 matching lines...) Expand 10 before | Expand all | Expand 10 after
4354 !args[0]->IsAccessCheckNeeded() && 4354 !args[0]->IsAccessCheckNeeded() &&
4355 args[1]->IsName()) { 4355 args[1]->IsName()) {
4356 JSObject* receiver = JSObject::cast(args[0]); 4356 JSObject* receiver = JSObject::cast(args[0]);
4357 Name* key = Name::cast(args[1]); 4357 Name* key = Name::cast(args[1]);
4358 if (receiver->HasFastProperties()) { 4358 if (receiver->HasFastProperties()) {
4359 // Attempt to use lookup cache. 4359 // Attempt to use lookup cache.
4360 Map* receiver_map = receiver->map(); 4360 Map* receiver_map = receiver->map();
4361 KeyedLookupCache* keyed_lookup_cache = isolate->keyed_lookup_cache(); 4361 KeyedLookupCache* keyed_lookup_cache = isolate->keyed_lookup_cache();
4362 int offset = keyed_lookup_cache->Lookup(receiver_map, key); 4362 int offset = keyed_lookup_cache->Lookup(receiver_map, key);
4363 if (offset != -1) { 4363 if (offset != -1) {
4364 Object* value = receiver->FastPropertyAt(offset); 4364 // Doubles are not cached, so raw read the value.
4365 Object* value = receiver->RawFastPropertyAt(offset);
4365 return value->IsTheHole() 4366 return value->IsTheHole()
4366 ? isolate->heap()->undefined_value() 4367 ? isolate->heap()->undefined_value()
4367 : value; 4368 : value;
4368 } 4369 }
4369 // Lookup cache miss. Perform lookup and update the cache if 4370 // Lookup cache miss. Perform lookup and update the cache if
4370 // appropriate. 4371 // appropriate.
4371 LookupResult result(isolate); 4372 LookupResult result(isolate);
4372 receiver->LocalLookup(key, &result); 4373 receiver->LocalLookup(key, &result);
4373 if (result.IsField()) { 4374 if (result.IsField()) {
4374 int offset = result.GetFieldIndex().field_index(); 4375 int offset = result.GetFieldIndex().field_index();
4375 keyed_lookup_cache->Update(receiver_map, key, offset); 4376 // Do not track double fields in the keyed lookup cache. Reading
4376 return receiver->FastPropertyAt(offset); 4377 // double values requires boxing.
4378 if (!FLAG_track_double_fields ||
4379 !result.representation().IsDouble()) {
4380 keyed_lookup_cache->Update(receiver_map, key, offset);
4381 }
4382 return receiver->FastPropertyAt(result.representation(), offset);
4377 } 4383 }
4378 } else { 4384 } else {
4379 // Attempt dictionary lookup. 4385 // Attempt dictionary lookup.
4380 NameDictionary* dictionary = receiver->property_dictionary(); 4386 NameDictionary* dictionary = receiver->property_dictionary();
4381 int entry = dictionary->FindEntry(key); 4387 int entry = dictionary->FindEntry(key);
4382 if ((entry != NameDictionary::kNotFound) && 4388 if ((entry != NameDictionary::kNotFound) &&
4383 (dictionary->DetailsAt(entry).type() == NORMAL)) { 4389 (dictionary->DetailsAt(entry).type() == NORMAL)) {
4384 Object* value = dictionary->ValueAt(entry); 4390 Object* value = dictionary->ValueAt(entry);
4385 if (!receiver->IsGlobalObject()) return value; 4391 if (!receiver->IsGlobalObject()) return value;
4386 value = JSGlobalPropertyCell::cast(value)->value(); 4392 value = JSGlobalPropertyCell::cast(value)->value();
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
4542 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 4548 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
4543 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 4549 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
4544 LookupResult lookup(isolate); 4550 LookupResult lookup(isolate);
4545 object->LookupRealNamedProperty(*key, &lookup); 4551 object->LookupRealNamedProperty(*key, &lookup);
4546 if (!lookup.IsFound()) return isolate->heap()->undefined_value(); 4552 if (!lookup.IsFound()) return isolate->heap()->undefined_value();
4547 switch (lookup.type()) { 4553 switch (lookup.type()) {
4548 case NORMAL: 4554 case NORMAL:
4549 return lookup.holder()->GetNormalizedProperty(&lookup); 4555 return lookup.holder()->GetNormalizedProperty(&lookup);
4550 case FIELD: 4556 case FIELD:
4551 return lookup.holder()->FastPropertyAt( 4557 return lookup.holder()->FastPropertyAt(
4558 lookup.representation(),
4552 lookup.GetFieldIndex().field_index()); 4559 lookup.GetFieldIndex().field_index());
4553 case CONSTANT_FUNCTION: 4560 case CONSTANT_FUNCTION:
4554 return lookup.GetConstantFunction(); 4561 return lookup.GetConstantFunction();
4555 case CALLBACKS: 4562 case CALLBACKS:
4556 case HANDLER: 4563 case HANDLER:
4557 case INTERCEPTOR: 4564 case INTERCEPTOR:
4558 case TRANSITION: 4565 case TRANSITION:
4559 return isolate->heap()->undefined_value(); 4566 return isolate->heap()->undefined_value();
4560 case NONEXISTENT: 4567 case NONEXISTENT:
4561 UNREACHABLE(); 4568 UNREACHABLE();
(...skipping 5496 matching lines...) Expand 10 before | Expand all | Expand 10 after
10058 LookupResult* result, 10065 LookupResult* result,
10059 bool* caught_exception) { 10066 bool* caught_exception) {
10060 Object* value; 10067 Object* value;
10061 switch (result->type()) { 10068 switch (result->type()) {
10062 case NORMAL: 10069 case NORMAL:
10063 value = result->holder()->GetNormalizedProperty(result); 10070 value = result->holder()->GetNormalizedProperty(result);
10064 if (value->IsTheHole()) { 10071 if (value->IsTheHole()) {
10065 return heap->undefined_value(); 10072 return heap->undefined_value();
10066 } 10073 }
10067 return value; 10074 return value;
10068 case FIELD: 10075 case FIELD: {
10069 value = 10076 Object* value;
10077 MaybeObject* maybe_value =
10070 JSObject::cast(result->holder())->FastPropertyAt( 10078 JSObject::cast(result->holder())->FastPropertyAt(
10079 result->representation(),
10071 result->GetFieldIndex().field_index()); 10080 result->GetFieldIndex().field_index());
10081 if (!maybe_value->To(&value)) return maybe_value;
10072 if (value->IsTheHole()) { 10082 if (value->IsTheHole()) {
10073 return heap->undefined_value(); 10083 return heap->undefined_value();
10074 } 10084 }
10075 return value; 10085 return value;
10086 }
10076 case CONSTANT_FUNCTION: 10087 case CONSTANT_FUNCTION:
10077 return result->GetConstantFunction(); 10088 return result->GetConstantFunction();
10078 case CALLBACKS: { 10089 case CALLBACKS: {
10079 Object* structure = result->GetCallbackObject(); 10090 Object* structure = result->GetCallbackObject();
10080 if (structure->IsForeign() || structure->IsAccessorInfo()) { 10091 if (structure->IsForeign() || structure->IsAccessorInfo()) {
10081 MaybeObject* maybe_value = result->holder()->GetPropertyWithCallback( 10092 MaybeObject* maybe_value = result->holder()->GetPropertyWithCallback(
10082 receiver, structure, name); 10093 receiver, structure, name);
10083 if (!maybe_value->ToObject(&value)) { 10094 if (!maybe_value->ToObject(&value)) {
10084 if (maybe_value->IsRetryAfterGC()) return maybe_value; 10095 if (maybe_value->IsRetryAfterGC()) return maybe_value;
10085 ASSERT(maybe_value->IsException()); 10096 ASSERT(maybe_value->IsException());
(...skipping 3308 matching lines...) Expand 10 before | Expand all | Expand 10 after
13394 // Handle last resort GC and make sure to allow future allocations 13405 // Handle last resort GC and make sure to allow future allocations
13395 // to grow the heap without causing GCs (if possible). 13406 // to grow the heap without causing GCs (if possible).
13396 isolate->counters()->gc_last_resort_from_js()->Increment(); 13407 isolate->counters()->gc_last_resort_from_js()->Increment();
13397 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 13408 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
13398 "Runtime::PerformGC"); 13409 "Runtime::PerformGC");
13399 } 13410 }
13400 } 13411 }
13401 13412
13402 13413
13403 } } // namespace v8::internal 13414 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/property.h ('k') | src/string-stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698