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

Side by Side Diff: src/hydrogen.cc

Issue 15094018: Create AllocationSite objects, pointed to by AllocationSiteInfo. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Platform ports and perf bugfix Created 7 years, 5 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
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 1558 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 if (!pre_fill_with_holes && length != capacity) { 1569 if (!pre_fill_with_holes && length != capacity) {
1570 // Fill unused capacity with the hole. 1570 // Fill unused capacity with the hole.
1571 BuildFillElementsWithHole(context, to_elements, to_elements_kind, 1571 BuildFillElementsWithHole(context, to_elements, to_elements_kind,
1572 key, capacity); 1572 key, capacity);
1573 } 1573 }
1574 } 1574 }
1575 1575
1576 1576
1577 HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, 1577 HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context,
1578 HValue* boilerplate, 1578 HValue* boilerplate,
1579 HValue* allocation_site,
1579 AllocationSiteMode mode, 1580 AllocationSiteMode mode,
1580 ElementsKind kind, 1581 ElementsKind kind,
1581 int length) { 1582 int length) {
1582 NoObservableSideEffectsScope no_effects(this); 1583 NoObservableSideEffectsScope no_effects(this);
1583 1584
1584 // All sizes here are multiples of kPointerSize. 1585 // All sizes here are multiples of kPointerSize.
1585 int size = JSArray::kSize; 1586 int size = JSArray::kSize;
1586 if (mode == TRACK_ALLOCATION_SITE) { 1587 if (mode == TRACK_ALLOCATION_SITE) {
1587 size += AllocationSiteInfo::kSize; 1588 size += AllocationSiteInfo::kSize;
1588 } 1589 }
(...skipping 16 matching lines...) Expand all
1605 // Copy the JS array part. 1606 // Copy the JS array part.
1606 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { 1607 for (int i = 0; i < JSArray::kSize; i += kPointerSize) {
1607 if ((i != JSArray::kElementsOffset) || (length == 0)) { 1608 if ((i != JSArray::kElementsOffset) || (length == 0)) {
1608 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); 1609 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i);
1609 AddStore(object, access, AddLoad(boilerplate, access)); 1610 AddStore(object, access, AddLoad(boilerplate, access));
1610 } 1611 }
1611 } 1612 }
1612 1613
1613 // Create an allocation site info if requested. 1614 // Create an allocation site info if requested.
1614 if (mode == TRACK_ALLOCATION_SITE) { 1615 if (mode == TRACK_ALLOCATION_SITE) {
1615 BuildCreateAllocationSiteInfo(object, JSArray::kSize, boilerplate); 1616 BuildCreateAllocationSiteInfo(object, JSArray::kSize, allocation_site);
1616 } 1617 }
1617 1618
1618 if (length > 0) { 1619 if (length > 0) {
1619 // Get hold of the elements array of the boilerplate and setup the 1620 // Get hold of the elements array of the boilerplate and setup the
1620 // elements pointer in the resulting object. 1621 // elements pointer in the resulting object.
1621 HValue* boilerplate_elements = AddLoadElements(boilerplate); 1622 HValue* boilerplate_elements = AddLoadElements(boilerplate);
1622 HValue* object_elements = Add<HInnerAllocatedObject>(object, elems_offset); 1623 HValue* object_elements = Add<HInnerAllocatedObject>(object, elems_offset);
1623 AddStore(object, HObjectAccess::ForElementsPointer(), object_elements); 1624 AddStore(object, HObjectAccess::ForElementsPointer(), object_elements);
1624 1625
1625 // Copy the elements array header. 1626 // Copy the elements array header.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1679 if_nil.Deopt(); 1680 if_nil.Deopt();
1680 } 1681 }
1681 } 1682 }
1682 1683
1683 if_nil.CaptureContinuation(continuation); 1684 if_nil.CaptureContinuation(continuation);
1684 } 1685 }
1685 1686
1686 1687
1687 HValue* HGraphBuilder::BuildCreateAllocationSiteInfo(HValue* previous_object, 1688 HValue* HGraphBuilder::BuildCreateAllocationSiteInfo(HValue* previous_object,
1688 int previous_object_size, 1689 int previous_object_size,
1689 HValue* payload) { 1690 HValue* alloc_site) {
Hannes Payer (out of office) 2013/07/03 15:26:45 I think we should assert that alloc_site is not Ha
mvstanton 2013/07/05 07:56:14 good idea, but I'll just check for a NULL pointer
1690 HInnerAllocatedObject* alloc_site = Add<HInnerAllocatedObject>( 1691 HInnerAllocatedObject* alloc_site_info = Add<HInnerAllocatedObject>(
1691 previous_object, previous_object_size); 1692 previous_object, previous_object_size);
1692 Handle<Map> alloc_site_map(isolate()->heap()->allocation_site_info_map()); 1693 Handle<Map> alloc_site_info_map(
1693 AddStoreMapConstant(alloc_site, alloc_site_map); 1694 isolate()->heap()->allocation_site_info_map());
1694 HObjectAccess access = HObjectAccess::ForAllocationSitePayload(); 1695 AddStoreMapConstant(alloc_site_info, alloc_site_info_map);
1695 AddStore(alloc_site, access, payload); 1696 HObjectAccess access = HObjectAccess::ForAllocationSiteInfoSite();
1696 return alloc_site; 1697 AddStore(alloc_site_info, access, alloc_site);
1698 return alloc_site_info;
1697 } 1699 }
1698 1700
1699 1701
1700 HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* context) { 1702 HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* context) {
1701 // Get the global context, then the native context 1703 // Get the global context, then the native context
1702 HInstruction* global_object = Add<HGlobalObject>(context); 1704 HInstruction* global_object = Add<HGlobalObject>(context);
1703 HObjectAccess access = HObjectAccess::ForJSObjectOffset( 1705 HObjectAccess access = HObjectAccess::ForJSObjectOffset(
1704 GlobalObject::kNativeContextOffset); 1706 GlobalObject::kNativeContextOffset);
1705 return AddLoad(global_object, access); 1707 return AddLoad(global_object, access);
1706 } 1708 }
(...skipping 12 matching lines...) Expand all
1719 ElementsKind kind, 1721 ElementsKind kind,
1720 HValue* allocation_site_payload, 1722 HValue* allocation_site_payload,
1721 HValue* constructor_function, 1723 HValue* constructor_function,
1722 AllocationSiteOverrideMode override_mode) : 1724 AllocationSiteOverrideMode override_mode) :
1723 builder_(builder), 1725 builder_(builder),
1724 kind_(kind), 1726 kind_(kind),
1725 allocation_site_payload_(allocation_site_payload), 1727 allocation_site_payload_(allocation_site_payload),
1726 constructor_function_(constructor_function) { 1728 constructor_function_(constructor_function) {
1727 mode_ = override_mode == DISABLE_ALLOCATION_SITES 1729 mode_ = override_mode == DISABLE_ALLOCATION_SITES
1728 ? DONT_TRACK_ALLOCATION_SITE 1730 ? DONT_TRACK_ALLOCATION_SITE
1729 : AllocationSiteInfo::GetMode(kind); 1731 : AllocationSite::GetMode(kind);
1730 } 1732 }
1731 1733
1732 1734
1733 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder, 1735 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder,
1734 ElementsKind kind, 1736 ElementsKind kind,
1735 HValue* constructor_function) : 1737 HValue* constructor_function) :
1736 builder_(builder), 1738 builder_(builder),
1737 kind_(kind), 1739 kind_(kind),
1738 mode_(DONT_TRACK_ALLOCATION_SITE), 1740 mode_(DONT_TRACK_ALLOCATION_SITE),
1739 allocation_site_payload_(NULL), 1741 allocation_site_payload_(NULL),
(...skipping 3686 matching lines...) Expand 10 before | Expand all | Expand 10 after
5426 &data_size, 5428 &data_size,
5427 &pointer_size)) { 5429 &pointer_size)) {
5428 Handle<JSObject> original_boilerplate_object = 5430 Handle<JSObject> original_boilerplate_object =
5429 Handle<JSObject>::cast(original_boilerplate); 5431 Handle<JSObject>::cast(original_boilerplate);
5430 Handle<JSObject> boilerplate_object = 5432 Handle<JSObject> boilerplate_object =
5431 DeepCopy(original_boilerplate_object); 5433 DeepCopy(original_boilerplate_object);
5432 5434
5433 literal = BuildFastLiteral(context, 5435 literal = BuildFastLiteral(context,
5434 boilerplate_object, 5436 boilerplate_object,
5435 original_boilerplate_object, 5437 original_boilerplate_object,
5438 Handle<Object>::null(),
5436 data_size, 5439 data_size,
5437 pointer_size, 5440 pointer_size,
5438 DONT_TRACK_ALLOCATION_SITE); 5441 DONT_TRACK_ALLOCATION_SITE);
5439 } else { 5442 } else {
5440 NoObservableSideEffectsScope no_effects(this); 5443 NoObservableSideEffectsScope no_effects(this);
5441 Handle<FixedArray> closure_literals(closure->literals(), isolate()); 5444 Handle<FixedArray> closure_literals(closure->literals(), isolate());
5442 Handle<FixedArray> constant_properties = expr->constant_properties(); 5445 Handle<FixedArray> constant_properties = expr->constant_properties();
5443 int literal_index = expr->literal_index(); 5446 int literal_index = expr->literal_index();
5444 int flags = expr->fast_elements() 5447 int flags = expr->fast_elements()
5445 ? ObjectLiteral::kFastElements : ObjectLiteral::kNoFlags; 5448 ? ObjectLiteral::kFastElements : ObjectLiteral::kNoFlags;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
5533 5536
5534 void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { 5537 void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
5535 ASSERT(!HasStackOverflow()); 5538 ASSERT(!HasStackOverflow());
5536 ASSERT(current_block() != NULL); 5539 ASSERT(current_block() != NULL);
5537 ASSERT(current_block()->HasPredecessor()); 5540 ASSERT(current_block()->HasPredecessor());
5538 ZoneList<Expression*>* subexprs = expr->values(); 5541 ZoneList<Expression*>* subexprs = expr->values();
5539 int length = subexprs->length(); 5542 int length = subexprs->length();
5540 HValue* context = environment()->LookupContext(); 5543 HValue* context = environment()->LookupContext();
5541 HInstruction* literal; 5544 HInstruction* literal;
5542 5545
5546 Handle<AllocationSite> site;
5543 Handle<FixedArray> literals(environment()->closure()->literals(), isolate()); 5547 Handle<FixedArray> literals(environment()->closure()->literals(), isolate());
5544 Handle<Object> raw_boilerplate(literals->get(expr->literal_index()), 5548 Handle<Object> literals_cell(literals->get(expr->literal_index()),
5545 isolate()); 5549 isolate());
Hannes Payer (out of office) 2013/07/03 15:26:45 indent
5546 5550 Handle<Object> raw_boilerplate;
5547 if (raw_boilerplate->IsUndefined()) { 5551 if (literals_cell->IsUndefined()) {
5548 raw_boilerplate = Runtime::CreateArrayLiteralBoilerplate( 5552 raw_boilerplate = Runtime::CreateArrayLiteralBoilerplate(
5549 isolate(), literals, expr->constant_elements()); 5553 isolate(), literals, expr->constant_elements());
5550 if (raw_boilerplate.is_null()) { 5554 if (raw_boilerplate.is_null()) {
5551 return Bailout("array boilerplate creation failed"); 5555 return Bailout("array boilerplate creation failed");
5552 } 5556 }
5553 literals->set(expr->literal_index(), *raw_boilerplate); 5557
5558 site = isolate()->factory()->NewAllocationSite();
5559
5560 // We'll want to copy any useful information (statistics?) in the
5561 // AllocationSite from the full code gen
Hannes Payer (out of office) 2013/07/03 15:26:45 Is the uncommented code still needed? What about t
mvstanton 2013/07/05 07:56:14 Okay, I went ahead and removed this block, I reali
5562 /*
5563 Handle<FixedArray> fullcode_literals(info()->closure()->literals(), isolate( ));
5564 Handle<Object> fullcode_literals_cell(fullcode_literals->get(expr->literal_i ndex()),
5565 isolate());
5566 if (!fullcode_literals_cell->IsUndefined()) {
5567 Handle<AllocationSite> old_site = Handle<AllocationSite>::cast(fullcode_li terals_cell);
5568 // Extract info...
5569 }
5570 */
5571
5572 site->set_payload(*raw_boilerplate);
5573 literals->set(expr->literal_index(), *site);
5574
5554 if (JSObject::cast(*raw_boilerplate)->elements()->map() == 5575 if (JSObject::cast(*raw_boilerplate)->elements()->map() ==
5555 isolate()->heap()->fixed_cow_array_map()) { 5576 isolate()->heap()->fixed_cow_array_map()) {
5556 isolate()->counters()->cow_arrays_created_runtime()->Increment(); 5577 isolate()->counters()->cow_arrays_created_runtime()->Increment();
5557 } 5578 }
5579 } else {
5580 ASSERT(literals_cell->IsAllocationSite());
5581 site = Handle<AllocationSite>::cast(literals_cell);
5582 raw_boilerplate = Handle<Object>(site->payload(), isolate());
5558 } 5583 }
5559 5584
5585 ASSERT(!raw_boilerplate.is_null());
5586 ASSERT(site->IsLiteralSite());
5587
5560 Handle<JSObject> original_boilerplate_object = 5588 Handle<JSObject> original_boilerplate_object =
5561 Handle<JSObject>::cast(raw_boilerplate); 5589 Handle<JSObject>::cast(raw_boilerplate);
5562 ElementsKind boilerplate_elements_kind = 5590 ElementsKind boilerplate_elements_kind =
5563 Handle<JSObject>::cast(original_boilerplate_object)->GetElementsKind(); 5591 Handle<JSObject>::cast(original_boilerplate_object)->GetElementsKind();
5564 5592
5565 // TODO(mvstanton): This heuristic is only a temporary solution. In the 5593 // TODO(mvstanton): This heuristic is only a temporary solution. In the
5566 // end, we want to quit creating allocation site info after a certain number 5594 // end, we want to quit creating allocation site info after a certain number
5567 // of GCs for a call site. 5595 // of GCs for a call site.
5568 AllocationSiteMode mode = AllocationSiteInfo::GetMode( 5596 AllocationSiteMode mode = AllocationSite::GetMode(
5569 boilerplate_elements_kind); 5597 boilerplate_elements_kind);
5570 5598
5571 // Check whether to use fast or slow deep-copying for boilerplate. 5599 // Check whether to use fast or slow deep-copying for boilerplate.
5572 int data_size = 0; 5600 int data_size = 0;
5573 int pointer_size = 0; 5601 int pointer_size = 0;
5574 int max_properties = kMaxFastLiteralProperties; 5602 int max_properties = kMaxFastLiteralProperties;
5575 if (IsFastLiteral(original_boilerplate_object, 5603 if (IsFastLiteral(original_boilerplate_object,
5576 kMaxFastLiteralDepth, 5604 kMaxFastLiteralDepth,
5577 &max_properties, 5605 &max_properties,
5578 &data_size, 5606 &data_size,
5579 &pointer_size)) { 5607 &pointer_size)) {
5580 if (mode == TRACK_ALLOCATION_SITE) { 5608 if (mode == TRACK_ALLOCATION_SITE) {
5581 pointer_size += AllocationSiteInfo::kSize; 5609 pointer_size += AllocationSiteInfo::kSize;
5582 } 5610 }
5583 5611
5584 Handle<JSObject> boilerplate_object = DeepCopy(original_boilerplate_object); 5612 Handle<JSObject> boilerplate_object = DeepCopy(original_boilerplate_object);
5585 literal = BuildFastLiteral(context, 5613 literal = BuildFastLiteral(context,
5586 boilerplate_object, 5614 boilerplate_object,
5587 original_boilerplate_object, 5615 original_boilerplate_object,
5616 site,
5588 data_size, 5617 data_size,
5589 pointer_size, 5618 pointer_size,
5590 mode); 5619 mode);
5591 } else { 5620 } else {
5592 NoObservableSideEffectsScope no_effects(this); 5621 NoObservableSideEffectsScope no_effects(this);
5593 // Boilerplate already exists and constant elements are never accessed, 5622 // Boilerplate already exists and constant elements are never accessed,
5594 // pass an empty fixed array to the runtime function instead. 5623 // pass an empty fixed array to the runtime function instead.
5595 Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array(); 5624 Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array();
5596 int literal_index = expr->literal_index(); 5625 int literal_index = expr->literal_index();
5597 5626
(...skipping 3816 matching lines...) Expand 10 before | Expand all | Expand 10 after
9414 } else { 9443 } else {
9415 return new(zone()) HThisFunction; 9444 return new(zone()) HThisFunction;
9416 } 9445 }
9417 } 9446 }
9418 9447
9419 9448
9420 HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( 9449 HInstruction* HOptimizedGraphBuilder::BuildFastLiteral(
9421 HValue* context, 9450 HValue* context,
9422 Handle<JSObject> boilerplate_object, 9451 Handle<JSObject> boilerplate_object,
9423 Handle<JSObject> original_boilerplate_object, 9452 Handle<JSObject> original_boilerplate_object,
9453 Handle<Object> allocation_site,
9424 int data_size, 9454 int data_size,
9425 int pointer_size, 9455 int pointer_size,
9426 AllocationSiteMode mode) { 9456 AllocationSiteMode mode) {
9427 NoObservableSideEffectsScope no_effects(this); 9457 NoObservableSideEffectsScope no_effects(this);
9428 9458
9429 HInstruction* target = NULL; 9459 HInstruction* target = NULL;
9430 HInstruction* data_target = NULL; 9460 HInstruction* data_target = NULL;
9431 9461
9432 HAllocate::Flags flags = HAllocate::DefaultFlags(); 9462 HAllocate::Flags flags = HAllocate::DefaultFlags();
9433 9463
(...skipping 17 matching lines...) Expand all
9451 HValue* size_in_bytes = Add<HConstant>(pointer_size); 9481 HValue* size_in_bytes = Add<HConstant>(pointer_size);
9452 target = Add<HAllocate>(context, size_in_bytes, HType::JSObject(), flags); 9482 target = Add<HAllocate>(context, size_in_bytes, HType::JSObject(), flags);
9453 } 9483 }
9454 } else { 9484 } else {
9455 HValue* size_in_bytes = Add<HConstant>(data_size + pointer_size); 9485 HValue* size_in_bytes = Add<HConstant>(data_size + pointer_size);
9456 target = Add<HAllocate>(context, size_in_bytes, HType::JSObject(), flags); 9486 target = Add<HAllocate>(context, size_in_bytes, HType::JSObject(), flags);
9457 } 9487 }
9458 9488
9459 int offset = 0; 9489 int offset = 0;
9460 int data_offset = 0; 9490 int data_offset = 0;
9461 BuildEmitDeepCopy(boilerplate_object, original_boilerplate_object, target, 9491 BuildEmitDeepCopy(boilerplate_object, original_boilerplate_object,
9462 &offset, data_target, &data_offset, mode); 9492 allocation_site, target, &offset, data_target,
9493 &data_offset, mode);
9463 return target; 9494 return target;
9464 } 9495 }
9465 9496
9466 9497
9467 void HOptimizedGraphBuilder::BuildEmitDeepCopy( 9498 void HOptimizedGraphBuilder::BuildEmitDeepCopy(
9468 Handle<JSObject> boilerplate_object, 9499 Handle<JSObject> boilerplate_object,
9469 Handle<JSObject> original_boilerplate_object, 9500 Handle<JSObject> original_boilerplate_object,
9501 Handle<Object> allocation_site_object,
9470 HInstruction* target, 9502 HInstruction* target,
9471 int* offset, 9503 int* offset,
9472 HInstruction* data_target, 9504 HInstruction* data_target,
9473 int* data_offset, 9505 int* data_offset,
9474 AllocationSiteMode mode) { 9506 AllocationSiteMode mode) {
9507 Zone* zone = this->zone();
9508
9509 bool create_allocation_site_info = mode == TRACK_ALLOCATION_SITE &&
9510 boilerplate_object->map()->CanTrackAllocationSite();
9511
9512 // If using allocation sites, then the payload on the site should already
9513 // be filled in as a valid (boilerplate) array.
9514 ASSERT(!create_allocation_site_info ||
9515 AllocationSite::cast(*allocation_site_object)->IsLiteralSite());
9516
9517 HInstruction* allocation_site = NULL;
9518
9519 if (create_allocation_site_info) {
9520 allocation_site = AddInstruction(new(zone) HConstant(
9521 allocation_site_object, Representation::Tagged()));
9522 }
9523
9524 // Only elements backing stores for non-COW arrays need to be copied.
9475 Handle<FixedArrayBase> elements(boilerplate_object->elements()); 9525 Handle<FixedArrayBase> elements(boilerplate_object->elements());
9476 Handle<FixedArrayBase> original_elements( 9526 Handle<FixedArrayBase> original_elements(
9477 original_boilerplate_object->elements()); 9527 original_boilerplate_object->elements());
9478 ElementsKind kind = boilerplate_object->map()->elements_kind(); 9528 ElementsKind kind = boilerplate_object->map()->elements_kind();
9479 9529
9480 int object_offset = *offset; 9530 int object_offset = *offset;
9481 int object_size = boilerplate_object->map()->instance_size(); 9531 int object_size = boilerplate_object->map()->instance_size();
9482 int elements_size = (elements->length() > 0 && 9532 int elements_size = (elements->length() > 0 &&
9483 elements->map() != isolate()->heap()->fixed_cow_array_map()) ? 9533 elements->map() != isolate()->heap()->fixed_cow_array_map()) ?
9484 elements->Size() : 0; 9534 elements->Size() : 0;
(...skipping 25 matching lines...) Expand all
9510 Add<HInnerAllocatedObject>(target, object_offset); 9560 Add<HInnerAllocatedObject>(target, object_offset);
9511 BuildEmitInObjectProperties(boilerplate_object, original_boilerplate_object, 9561 BuildEmitInObjectProperties(boilerplate_object, original_boilerplate_object,
9512 object_properties, target, offset, data_target, data_offset); 9562 object_properties, target, offset, data_target, data_offset);
9513 } 9563 }
9514 9564
9515 // Create allocation site info. 9565 // Create allocation site info.
9516 if (mode == TRACK_ALLOCATION_SITE && 9566 if (mode == TRACK_ALLOCATION_SITE &&
9517 boilerplate_object->map()->CanTrackAllocationSite()) { 9567 boilerplate_object->map()->CanTrackAllocationSite()) {
9518 elements_offset += AllocationSiteInfo::kSize; 9568 elements_offset += AllocationSiteInfo::kSize;
9519 *offset += AllocationSiteInfo::kSize; 9569 *offset += AllocationSiteInfo::kSize;
9520 HInstruction* original_boilerplate = 9570 BuildCreateAllocationSiteInfo(target, JSArray::kSize, allocation_site);
9521 Add<HConstant>(original_boilerplate_object);
9522 BuildCreateAllocationSiteInfo(target, JSArray::kSize, original_boilerplate);
9523 } 9571 }
9524 } 9572 }
9525 9573
9526 9574
9527 HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader( 9575 HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader(
9528 Handle<JSObject> boilerplate_object, 9576 Handle<JSObject> boilerplate_object,
9529 HInstruction* target, 9577 HInstruction* target,
9530 HInstruction* data_target, 9578 HInstruction* data_target,
9531 int object_offset, 9579 int object_offset,
9532 int elements_offset, 9580 int elements_offset,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
9610 9658
9611 if (value->IsJSObject()) { 9659 if (value->IsJSObject()) {
9612 Handle<JSObject> value_object = Handle<JSObject>::cast(value); 9660 Handle<JSObject> value_object = Handle<JSObject>::cast(value);
9613 Handle<JSObject> original_value_object = Handle<JSObject>::cast( 9661 Handle<JSObject> original_value_object = Handle<JSObject>::cast(
9614 Handle<Object>(original_boilerplate_object->InObjectPropertyAt(index), 9662 Handle<Object>(original_boilerplate_object->InObjectPropertyAt(index),
9615 isolate())); 9663 isolate()));
9616 HInstruction* value_instruction = Add<HInnerAllocatedObject>(target, 9664 HInstruction* value_instruction = Add<HInnerAllocatedObject>(target,
9617 *offset); 9665 *offset);
9618 9666
9619 AddStore(object_properties, access, value_instruction); 9667 AddStore(object_properties, access, value_instruction);
9620 9668 BuildEmitDeepCopy(value_object, original_value_object,
9621 BuildEmitDeepCopy(value_object, original_value_object, target, 9669 Handle<Object>::null(), target,
9622 offset, data_target, data_offset, DONT_TRACK_ALLOCATION_SITE); 9670 offset, data_target, data_offset,
9671 DONT_TRACK_ALLOCATION_SITE);
9623 } else { 9672 } else {
9624 Representation representation = details.representation(); 9673 Representation representation = details.representation();
9625 HInstruction* value_instruction = Add<HConstant>(value); 9674 HInstruction* value_instruction = Add<HConstant>(value);
9626 9675
9627 if (representation.IsDouble()) { 9676 if (representation.IsDouble()) {
9628 // Allocate a HeapNumber box and store the value into it. 9677 // Allocate a HeapNumber box and store the value into it.
9629 HInstruction* double_box; 9678 HInstruction* double_box;
9630 if (data_target != NULL) { 9679 if (data_target != NULL) {
9631 double_box = Add<HInnerAllocatedObject>(data_target, *data_offset); 9680 double_box = Add<HInnerAllocatedObject>(data_target, *data_offset);
9632 *data_offset += HeapNumber::kSize; 9681 *data_offset += HeapNumber::kSize;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
9719 for (int i = 0; i < elements_length; i++) { 9768 for (int i = 0; i < elements_length; i++) {
9720 Handle<Object> value(fast_elements->get(i), isolate()); 9769 Handle<Object> value(fast_elements->get(i), isolate());
9721 HValue* key_constant = Add<HConstant>(i); 9770 HValue* key_constant = Add<HConstant>(i);
9722 if (value->IsJSObject()) { 9771 if (value->IsJSObject()) {
9723 Handle<JSObject> value_object = Handle<JSObject>::cast(value); 9772 Handle<JSObject> value_object = Handle<JSObject>::cast(value);
9724 Handle<JSObject> original_value_object = Handle<JSObject>::cast( 9773 Handle<JSObject> original_value_object = Handle<JSObject>::cast(
9725 Handle<Object>(original_fast_elements->get(i), isolate())); 9774 Handle<Object>(original_fast_elements->get(i), isolate()));
9726 HInstruction* value_instruction = Add<HInnerAllocatedObject>(target, 9775 HInstruction* value_instruction = Add<HInnerAllocatedObject>(target,
9727 *offset); 9776 *offset);
9728 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); 9777 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind);
9729 BuildEmitDeepCopy(value_object, original_value_object, target, 9778 BuildEmitDeepCopy(value_object, original_value_object,
9730 offset, data_target, data_offset, DONT_TRACK_ALLOCATION_SITE); 9779 Handle<Object>::null(), target,
9780 offset, data_target, data_offset,
9781 DONT_TRACK_ALLOCATION_SITE);
9731 } else { 9782 } else {
9732 HInstruction* value_instruction = 9783 HInstruction* value_instruction =
9733 Add<HLoadKeyed>(boilerplate_elements, key_constant, 9784 Add<HLoadKeyed>(boilerplate_elements, key_constant,
9734 static_cast<HValue*>(NULL), kind, 9785 static_cast<HValue*>(NULL), kind,
9735 ALLOW_RETURN_HOLE); 9786 ALLOW_RETURN_HOLE);
9736 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); 9787 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind);
9737 } 9788 }
9738 } 9789 }
9739 } 9790 }
9740 9791
(...skipping 1279 matching lines...) Expand 10 before | Expand all | Expand 10 after
11020 if (ShouldProduceTraceOutput()) { 11071 if (ShouldProduceTraceOutput()) {
11021 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 11072 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
11022 } 11073 }
11023 11074
11024 #ifdef DEBUG 11075 #ifdef DEBUG
11025 graph_->Verify(false); // No full verify. 11076 graph_->Verify(false); // No full verify.
11026 #endif 11077 #endif
11027 } 11078 }
11028 11079
11029 } } // namespace v8::internal 11080 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698