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

Side by Side Diff: src/x87/full-codegen-x87.cc

Issue 716973004: X87: ES6: Add support for super in object literals (Closed) Base URL: https://chromium.googlesource.com/external/v8.git@bleeding_edge
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « no previous file | no next file » | 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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X87 7 #if V8_TARGET_ARCH_X87
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 } 1288 }
1289 1289
1290 __ cmp(eax, isolate()->factory()->undefined_value()); 1290 __ cmp(eax, isolate()->factory()->undefined_value());
1291 Label done; 1291 Label done;
1292 __ j(not_equal, &done); 1292 __ j(not_equal, &done);
1293 __ CallRuntime(Runtime::kThrowNonMethodError, 0); 1293 __ CallRuntime(Runtime::kThrowNonMethodError, 0);
1294 __ bind(&done); 1294 __ bind(&done);
1295 } 1295 }
1296 1296
1297 1297
1298 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
1299 int offset) {
1300 if (NeedsHomeObject(initializer)) {
1301 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
1302 __ mov(StoreDescriptor::NameRegister(),
1303 Immediate(isolate()->factory()->home_object_symbol()));
1304 __ mov(StoreDescriptor::ValueRegister(),
1305 Operand(esp, offset * kPointerSize));
1306 CallStoreIC();
1307 }
1308 }
1309
1310
1298 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, 1311 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
1299 TypeofState typeof_state, 1312 TypeofState typeof_state,
1300 Label* slow) { 1313 Label* slow) {
1301 Register context = esi; 1314 Register context = esi;
1302 Register temp = edx; 1315 Register temp = edx;
1303 1316
1304 Scope* s = scope(); 1317 Scope* s = scope();
1305 while (s != NULL) { 1318 while (s != NULL) {
1306 if (s->num_heap_slots() > 0) { 1319 if (s->num_heap_slots() > 0) {
1307 if (s->calls_sloppy_eval()) { 1320 if (s->calls_sloppy_eval()) {
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
1652 // It is safe to use [[Put]] here because the boilerplate already 1665 // It is safe to use [[Put]] here because the boilerplate already
1653 // contains computed properties with an uninitialized value. 1666 // contains computed properties with an uninitialized value.
1654 if (key->value()->IsInternalizedString()) { 1667 if (key->value()->IsInternalizedString()) {
1655 if (property->emit_store()) { 1668 if (property->emit_store()) {
1656 VisitForAccumulatorValue(value); 1669 VisitForAccumulatorValue(value);
1657 DCHECK(StoreDescriptor::ValueRegister().is(eax)); 1670 DCHECK(StoreDescriptor::ValueRegister().is(eax));
1658 __ mov(StoreDescriptor::NameRegister(), Immediate(key->value())); 1671 __ mov(StoreDescriptor::NameRegister(), Immediate(key->value()));
1659 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); 1672 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
1660 CallStoreIC(key->LiteralFeedbackId()); 1673 CallStoreIC(key->LiteralFeedbackId());
1661 PrepareForBailoutForId(key->id(), NO_REGISTERS); 1674 PrepareForBailoutForId(key->id(), NO_REGISTERS);
1675
1676 if (NeedsHomeObject(value)) {
1677 __ mov(StoreDescriptor::ReceiverRegister(), eax);
1678 __ mov(StoreDescriptor::NameRegister(),
1679 Immediate(isolate()->factory()->home_object_symbol()));
1680 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, 0));
1681 CallStoreIC();
1682 }
1662 } else { 1683 } else {
1663 VisitForEffect(value); 1684 VisitForEffect(value);
1664 } 1685 }
1665 break; 1686 break;
1666 } 1687 }
1667 __ push(Operand(esp, 0)); // Duplicate receiver. 1688 __ push(Operand(esp, 0)); // Duplicate receiver.
1668 VisitForStackValue(key); 1689 VisitForStackValue(key);
1669 VisitForStackValue(value); 1690 VisitForStackValue(value);
1670 if (property->emit_store()) { 1691 if (property->emit_store()) {
1692 EmitSetHomeObjectIfNeeded(value, 2);
1671 __ push(Immediate(Smi::FromInt(SLOPPY))); // Strict mode 1693 __ push(Immediate(Smi::FromInt(SLOPPY))); // Strict mode
1672 __ CallRuntime(Runtime::kSetProperty, 4); 1694 __ CallRuntime(Runtime::kSetProperty, 4);
1673 } else { 1695 } else {
1674 __ Drop(3); 1696 __ Drop(3);
1675 } 1697 }
1676 break; 1698 break;
1677 case ObjectLiteral::Property::PROTOTYPE: 1699 case ObjectLiteral::Property::PROTOTYPE:
1678 __ push(Operand(esp, 0)); // Duplicate receiver. 1700 __ push(Operand(esp, 0)); // Duplicate receiver.
1679 VisitForStackValue(value); 1701 VisitForStackValue(value);
1680 if (property->emit_store()) { 1702 if (property->emit_store()) {
(...skipping 12 matching lines...) Expand all
1693 } 1715 }
1694 1716
1695 // Emit code to define accessors, using only a single call to the runtime for 1717 // Emit code to define accessors, using only a single call to the runtime for
1696 // each pair of corresponding getters and setters. 1718 // each pair of corresponding getters and setters.
1697 for (AccessorTable::Iterator it = accessor_table.begin(); 1719 for (AccessorTable::Iterator it = accessor_table.begin();
1698 it != accessor_table.end(); 1720 it != accessor_table.end();
1699 ++it) { 1721 ++it) {
1700 __ push(Operand(esp, 0)); // Duplicate receiver. 1722 __ push(Operand(esp, 0)); // Duplicate receiver.
1701 VisitForStackValue(it->first); 1723 VisitForStackValue(it->first);
1702 EmitAccessor(it->second->getter); 1724 EmitAccessor(it->second->getter);
1725 EmitSetHomeObjectIfNeeded(it->second->getter, 2);
1703 EmitAccessor(it->second->setter); 1726 EmitAccessor(it->second->setter);
1727 EmitSetHomeObjectIfNeeded(it->second->setter, 3);
1704 __ push(Immediate(Smi::FromInt(NONE))); 1728 __ push(Immediate(Smi::FromInt(NONE)));
1705 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); 1729 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
1706 } 1730 }
1707 1731
1708 if (expr->has_function()) { 1732 if (expr->has_function()) {
1709 DCHECK(result_saved); 1733 DCHECK(result_saved);
1710 __ push(Operand(esp, 0)); 1734 __ push(Operand(esp, 0));
1711 __ CallRuntime(Runtime::kToFastProperties, 1); 1735 __ CallRuntime(Runtime::kToFastProperties, 1);
1712 } 1736 }
1713 1737
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
2428 Expression* value = property->value(); 2452 Expression* value = property->value();
2429 DCHECK(key != NULL); 2453 DCHECK(key != NULL);
2430 2454
2431 if (property->is_static()) { 2455 if (property->is_static()) {
2432 __ push(Operand(esp, kPointerSize)); // constructor 2456 __ push(Operand(esp, kPointerSize)); // constructor
2433 } else { 2457 } else {
2434 __ push(Operand(esp, 0)); // prototype 2458 __ push(Operand(esp, 0)); // prototype
2435 } 2459 }
2436 VisitForStackValue(key); 2460 VisitForStackValue(key);
2437 VisitForStackValue(value); 2461 VisitForStackValue(value);
2462 EmitSetHomeObjectIfNeeded(value, 2);
2438 2463
2439 switch (property->kind()) { 2464 switch (property->kind()) {
2440 case ObjectLiteral::Property::CONSTANT: 2465 case ObjectLiteral::Property::CONSTANT:
2441 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 2466 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
2442 case ObjectLiteral::Property::COMPUTED: 2467 case ObjectLiteral::Property::COMPUTED:
2443 case ObjectLiteral::Property::PROTOTYPE: 2468 case ObjectLiteral::Property::PROTOTYPE:
2444 __ CallRuntime(Runtime::kDefineClassMethod, 3); 2469 __ CallRuntime(Runtime::kDefineClassMethod, 3);
2445 break; 2470 break;
2446 2471
2447 case ObjectLiteral::Property::GETTER: 2472 case ObjectLiteral::Property::GETTER:
(...skipping 2756 matching lines...) Expand 10 before | Expand all | Expand 10 after
5204 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), 5229 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(),
5205 Assembler::target_address_at(call_target_address, 5230 Assembler::target_address_at(call_target_address,
5206 unoptimized_code)); 5231 unoptimized_code));
5207 return OSR_AFTER_STACK_CHECK; 5232 return OSR_AFTER_STACK_CHECK;
5208 } 5233 }
5209 5234
5210 5235
5211 } } // namespace v8::internal 5236 } } // namespace v8::internal
5212 5237
5213 #endif // V8_TARGET_ARCH_X87 5238 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698