OLD | NEW |
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 #if V8_TARGET_ARCH_IA32 | 5 #if V8_TARGET_ARCH_IA32 |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/compiler.h" | 10 #include "src/compiler.h" |
(...skipping 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1173 __ CallStub(&stub); | 1173 __ CallStub(&stub); |
1174 } else { | 1174 } else { |
1175 __ push(Immediate(info)); | 1175 __ push(Immediate(info)); |
1176 __ CallRuntime( | 1176 __ CallRuntime( |
1177 pretenure ? Runtime::kNewClosure_Tenured : Runtime::kNewClosure, 1); | 1177 pretenure ? Runtime::kNewClosure_Tenured : Runtime::kNewClosure, 1); |
1178 } | 1178 } |
1179 context()->Plug(eax); | 1179 context()->Plug(eax); |
1180 } | 1180 } |
1181 | 1181 |
1182 | 1182 |
1183 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, | 1183 void FullCodeGenerator::EmitSetHomeObject(Expression* initializer, int offset, |
1184 int offset, | 1184 FeedbackVectorICSlot slot) { |
1185 FeedbackVectorICSlot slot) { | 1185 DCHECK(NeedsHomeObject(initializer)); |
1186 if (NeedsHomeObject(initializer)) { | 1186 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
1187 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1187 __ mov(StoreDescriptor::NameRegister(), |
1188 __ mov(StoreDescriptor::NameRegister(), | 1188 Immediate(isolate()->factory()->home_object_symbol())); |
1189 Immediate(isolate()->factory()->home_object_symbol())); | 1189 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); |
1190 __ mov(StoreDescriptor::ValueRegister(), | 1190 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
1191 Operand(esp, offset * kPointerSize)); | 1191 CallStoreIC(); |
1192 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | |
1193 CallStoreIC(); | |
1194 } | |
1195 } | 1192 } |
1196 | 1193 |
1197 | 1194 |
| 1195 void FullCodeGenerator::EmitSetHomeObjectAccumulator( |
| 1196 Expression* initializer, int offset, FeedbackVectorICSlot slot) { |
| 1197 DCHECK(NeedsHomeObject(initializer)); |
| 1198 __ mov(StoreDescriptor::ReceiverRegister(), eax); |
| 1199 __ mov(StoreDescriptor::NameRegister(), |
| 1200 Immediate(isolate()->factory()->home_object_symbol())); |
| 1201 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, offset * kPointerSize)); |
| 1202 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
| 1203 CallStoreIC(); |
| 1204 } |
| 1205 |
| 1206 |
1198 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, | 1207 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
1199 TypeofMode typeof_mode, | 1208 TypeofMode typeof_mode, |
1200 Label* slow) { | 1209 Label* slow) { |
1201 Register context = esi; | 1210 Register context = esi; |
1202 Register temp = edx; | 1211 Register temp = edx; |
1203 | 1212 |
1204 Scope* s = scope(); | 1213 Scope* s = scope(); |
1205 while (s != NULL) { | 1214 while (s != NULL) { |
1206 if (s->num_heap_slots() > 0) { | 1215 if (s->num_heap_slots() > 0) { |
1207 if (s->calls_sloppy_eval()) { | 1216 if (s->calls_sloppy_eval()) { |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1456 __ mov(FieldOperand(eax, i + kPointerSize), ecx); | 1465 __ mov(FieldOperand(eax, i + kPointerSize), ecx); |
1457 } | 1466 } |
1458 if ((size % (2 * kPointerSize)) != 0) { | 1467 if ((size % (2 * kPointerSize)) != 0) { |
1459 __ mov(edx, FieldOperand(ebx, size - kPointerSize)); | 1468 __ mov(edx, FieldOperand(ebx, size - kPointerSize)); |
1460 __ mov(FieldOperand(eax, size - kPointerSize), edx); | 1469 __ mov(FieldOperand(eax, size - kPointerSize), edx); |
1461 } | 1470 } |
1462 context()->Plug(eax); | 1471 context()->Plug(eax); |
1463 } | 1472 } |
1464 | 1473 |
1465 | 1474 |
1466 void FullCodeGenerator::EmitAccessor(Expression* expression) { | 1475 void FullCodeGenerator::EmitAccessor(ObjectLiteralProperty* property) { |
| 1476 Expression* expression = (property == NULL) ? NULL : property->value(); |
1467 if (expression == NULL) { | 1477 if (expression == NULL) { |
1468 __ push(Immediate(isolate()->factory()->null_value())); | 1478 __ push(Immediate(isolate()->factory()->null_value())); |
1469 } else { | 1479 } else { |
1470 VisitForStackValue(expression); | 1480 VisitForStackValue(expression); |
| 1481 if (NeedsHomeObject(expression)) { |
| 1482 DCHECK(property->kind() == ObjectLiteral::Property::GETTER || |
| 1483 property->kind() == ObjectLiteral::Property::SETTER); |
| 1484 int offset = property->kind() == ObjectLiteral::Property::GETTER ? 2 : 3; |
| 1485 EmitSetHomeObject(expression, offset, property->GetSlot()); |
| 1486 } |
1471 } | 1487 } |
1472 } | 1488 } |
1473 | 1489 |
1474 | 1490 |
1475 void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { | 1491 void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
1476 Comment cmnt(masm_, "[ ObjectLiteral"); | 1492 Comment cmnt(masm_, "[ ObjectLiteral"); |
1477 | 1493 |
1478 Handle<FixedArray> constant_properties = expr->constant_properties(); | 1494 Handle<FixedArray> constant_properties = expr->constant_properties(); |
1479 int flags = expr->ComputeFlags(); | 1495 int flags = expr->ComputeFlags(); |
1480 // If any of the keys would store to the elements array, then we shouldn't | 1496 // If any of the keys would store to the elements array, then we shouldn't |
(...skipping 15 matching lines...) Expand all Loading... |
1496 __ CallStub(&stub); | 1512 __ CallStub(&stub); |
1497 } | 1513 } |
1498 PrepareForBailoutForId(expr->CreateLiteralId(), TOS_REG); | 1514 PrepareForBailoutForId(expr->CreateLiteralId(), TOS_REG); |
1499 | 1515 |
1500 // If result_saved is true the result is on top of the stack. If | 1516 // If result_saved is true the result is on top of the stack. If |
1501 // result_saved is false the result is in eax. | 1517 // result_saved is false the result is in eax. |
1502 bool result_saved = false; | 1518 bool result_saved = false; |
1503 | 1519 |
1504 AccessorTable accessor_table(zone()); | 1520 AccessorTable accessor_table(zone()); |
1505 int property_index = 0; | 1521 int property_index = 0; |
1506 // store_slot_index points to the vector IC slot for the next store IC used. | |
1507 // ObjectLiteral::ComputeFeedbackRequirements controls the allocation of slots | |
1508 // and must be updated if the number of store ICs emitted here changes. | |
1509 int store_slot_index = 0; | |
1510 for (; property_index < expr->properties()->length(); property_index++) { | 1522 for (; property_index < expr->properties()->length(); property_index++) { |
1511 ObjectLiteral::Property* property = expr->properties()->at(property_index); | 1523 ObjectLiteral::Property* property = expr->properties()->at(property_index); |
1512 if (property->is_computed_name()) break; | 1524 if (property->is_computed_name()) break; |
1513 if (property->IsCompileTimeValue()) continue; | 1525 if (property->IsCompileTimeValue()) continue; |
1514 | 1526 |
1515 Literal* key = property->key()->AsLiteral(); | 1527 Literal* key = property->key()->AsLiteral(); |
1516 Expression* value = property->value(); | 1528 Expression* value = property->value(); |
1517 if (!result_saved) { | 1529 if (!result_saved) { |
1518 __ push(eax); // Save result on the stack | 1530 __ push(eax); // Save result on the stack |
1519 result_saved = true; | 1531 result_saved = true; |
1520 } | 1532 } |
1521 switch (property->kind()) { | 1533 switch (property->kind()) { |
1522 case ObjectLiteral::Property::CONSTANT: | 1534 case ObjectLiteral::Property::CONSTANT: |
1523 UNREACHABLE(); | 1535 UNREACHABLE(); |
1524 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1536 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
1525 DCHECK(!CompileTimeValue::IsCompileTimeValue(value)); | 1537 DCHECK(!CompileTimeValue::IsCompileTimeValue(value)); |
1526 // Fall through. | 1538 // Fall through. |
1527 case ObjectLiteral::Property::COMPUTED: | 1539 case ObjectLiteral::Property::COMPUTED: |
1528 // It is safe to use [[Put]] here because the boilerplate already | 1540 // It is safe to use [[Put]] here because the boilerplate already |
1529 // contains computed properties with an uninitialized value. | 1541 // contains computed properties with an uninitialized value. |
1530 if (key->value()->IsInternalizedString()) { | 1542 if (key->value()->IsInternalizedString()) { |
1531 if (property->emit_store()) { | 1543 if (property->emit_store()) { |
1532 VisitForAccumulatorValue(value); | 1544 VisitForAccumulatorValue(value); |
1533 DCHECK(StoreDescriptor::ValueRegister().is(eax)); | 1545 DCHECK(StoreDescriptor::ValueRegister().is(eax)); |
1534 __ mov(StoreDescriptor::NameRegister(), Immediate(key->value())); | 1546 __ mov(StoreDescriptor::NameRegister(), Immediate(key->value())); |
1535 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); | 1547 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
1536 if (FLAG_vector_stores) { | 1548 if (FLAG_vector_stores) { |
1537 EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++)); | 1549 EmitLoadStoreICSlot(property->GetSlot(0)); |
1538 CallStoreIC(); | 1550 CallStoreIC(); |
1539 } else { | 1551 } else { |
1540 CallStoreIC(key->LiteralFeedbackId()); | 1552 CallStoreIC(key->LiteralFeedbackId()); |
1541 } | 1553 } |
1542 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1554 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
1543 | |
1544 if (NeedsHomeObject(value)) { | 1555 if (NeedsHomeObject(value)) { |
1545 __ mov(StoreDescriptor::ReceiverRegister(), eax); | 1556 EmitSetHomeObjectAccumulator(value, 0, property->GetSlot(1)); |
1546 __ mov(StoreDescriptor::NameRegister(), | |
1547 Immediate(isolate()->factory()->home_object_symbol())); | |
1548 __ mov(StoreDescriptor::ValueRegister(), Operand(esp, 0)); | |
1549 if (FLAG_vector_stores) { | |
1550 EmitLoadStoreICSlot(expr->GetNthSlot(store_slot_index++)); | |
1551 } | |
1552 CallStoreIC(); | |
1553 } | 1557 } |
1554 } else { | 1558 } else { |
1555 VisitForEffect(value); | 1559 VisitForEffect(value); |
1556 } | 1560 } |
1557 break; | 1561 break; |
1558 } | 1562 } |
1559 __ push(Operand(esp, 0)); // Duplicate receiver. | 1563 __ push(Operand(esp, 0)); // Duplicate receiver. |
1560 VisitForStackValue(key); | 1564 VisitForStackValue(key); |
1561 VisitForStackValue(value); | 1565 VisitForStackValue(value); |
1562 if (property->emit_store()) { | 1566 if (property->emit_store()) { |
1563 EmitSetHomeObjectIfNeeded( | 1567 if (NeedsHomeObject(value)) { |
1564 value, 2, expr->SlotForHomeObject(value, &store_slot_index)); | 1568 EmitSetHomeObject(value, 2, property->GetSlot()); |
| 1569 } |
1565 __ push(Immediate(Smi::FromInt(SLOPPY))); // Language mode | 1570 __ push(Immediate(Smi::FromInt(SLOPPY))); // Language mode |
1566 __ CallRuntime(Runtime::kSetProperty, 4); | 1571 __ CallRuntime(Runtime::kSetProperty, 4); |
1567 } else { | 1572 } else { |
1568 __ Drop(3); | 1573 __ Drop(3); |
1569 } | 1574 } |
1570 break; | 1575 break; |
1571 case ObjectLiteral::Property::PROTOTYPE: | 1576 case ObjectLiteral::Property::PROTOTYPE: |
1572 __ push(Operand(esp, 0)); // Duplicate receiver. | 1577 __ push(Operand(esp, 0)); // Duplicate receiver. |
1573 VisitForStackValue(value); | 1578 VisitForStackValue(value); |
1574 DCHECK(property->emit_store()); | 1579 DCHECK(property->emit_store()); |
1575 __ CallRuntime(Runtime::kInternalSetPrototype, 2); | 1580 __ CallRuntime(Runtime::kInternalSetPrototype, 2); |
1576 break; | 1581 break; |
1577 case ObjectLiteral::Property::GETTER: | 1582 case ObjectLiteral::Property::GETTER: |
1578 if (property->emit_store()) { | 1583 if (property->emit_store()) { |
1579 accessor_table.lookup(key)->second->getter = value; | 1584 accessor_table.lookup(key)->second->getter = property; |
1580 } | 1585 } |
1581 break; | 1586 break; |
1582 case ObjectLiteral::Property::SETTER: | 1587 case ObjectLiteral::Property::SETTER: |
1583 if (property->emit_store()) { | 1588 if (property->emit_store()) { |
1584 accessor_table.lookup(key)->second->setter = value; | 1589 accessor_table.lookup(key)->second->setter = property; |
1585 } | 1590 } |
1586 break; | 1591 break; |
1587 } | 1592 } |
1588 } | 1593 } |
1589 | 1594 |
1590 // Emit code to define accessors, using only a single call to the runtime for | 1595 // Emit code to define accessors, using only a single call to the runtime for |
1591 // each pair of corresponding getters and setters. | 1596 // each pair of corresponding getters and setters. |
1592 for (AccessorTable::Iterator it = accessor_table.begin(); | 1597 for (AccessorTable::Iterator it = accessor_table.begin(); |
1593 it != accessor_table.end(); | 1598 it != accessor_table.end(); |
1594 ++it) { | 1599 ++it) { |
1595 __ push(Operand(esp, 0)); // Duplicate receiver. | 1600 __ push(Operand(esp, 0)); // Duplicate receiver. |
1596 VisitForStackValue(it->first); | 1601 VisitForStackValue(it->first); |
| 1602 |
1597 EmitAccessor(it->second->getter); | 1603 EmitAccessor(it->second->getter); |
1598 EmitSetHomeObjectIfNeeded( | |
1599 it->second->getter, 2, | |
1600 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); | |
1601 | |
1602 EmitAccessor(it->second->setter); | 1604 EmitAccessor(it->second->setter); |
1603 EmitSetHomeObjectIfNeeded( | |
1604 it->second->setter, 3, | |
1605 expr->SlotForHomeObject(it->second->setter, &store_slot_index)); | |
1606 | 1605 |
1607 __ push(Immediate(Smi::FromInt(NONE))); | 1606 __ push(Immediate(Smi::FromInt(NONE))); |
1608 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); | 1607 __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
1609 } | 1608 } |
1610 | 1609 |
1611 // Object literals have two parts. The "static" part on the left contains no | 1610 // Object literals have two parts. The "static" part on the left contains no |
1612 // computed property names, and so we can compute its map ahead of time; see | 1611 // computed property names, and so we can compute its map ahead of time; see |
1613 // runtime.cc::CreateObjectLiteralBoilerplate. The second "dynamic" part | 1612 // runtime.cc::CreateObjectLiteralBoilerplate. The second "dynamic" part |
1614 // starts with the first computed property name, and continues with all | 1613 // starts with the first computed property name, and continues with all |
1615 // properties to its right. All the code from above initializes the static | 1614 // properties to its right. All the code from above initializes the static |
(...skipping 13 matching lines...) Expand all Loading... |
1629 __ push(Operand(esp, 0)); // Duplicate receiver. | 1628 __ push(Operand(esp, 0)); // Duplicate receiver. |
1630 | 1629 |
1631 if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { | 1630 if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { |
1632 DCHECK(!property->is_computed_name()); | 1631 DCHECK(!property->is_computed_name()); |
1633 VisitForStackValue(value); | 1632 VisitForStackValue(value); |
1634 DCHECK(property->emit_store()); | 1633 DCHECK(property->emit_store()); |
1635 __ CallRuntime(Runtime::kInternalSetPrototype, 2); | 1634 __ CallRuntime(Runtime::kInternalSetPrototype, 2); |
1636 } else { | 1635 } else { |
1637 EmitPropertyKey(property, expr->GetIdForProperty(property_index)); | 1636 EmitPropertyKey(property, expr->GetIdForProperty(property_index)); |
1638 VisitForStackValue(value); | 1637 VisitForStackValue(value); |
1639 EmitSetHomeObjectIfNeeded( | 1638 if (NeedsHomeObject(value)) { |
1640 value, 2, expr->SlotForHomeObject(value, &store_slot_index)); | 1639 EmitSetHomeObject(value, 2, property->GetSlot()); |
| 1640 } |
1641 | 1641 |
1642 switch (property->kind()) { | 1642 switch (property->kind()) { |
1643 case ObjectLiteral::Property::CONSTANT: | 1643 case ObjectLiteral::Property::CONSTANT: |
1644 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1644 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
1645 case ObjectLiteral::Property::COMPUTED: | 1645 case ObjectLiteral::Property::COMPUTED: |
1646 if (property->emit_store()) { | 1646 if (property->emit_store()) { |
1647 __ push(Immediate(Smi::FromInt(NONE))); | 1647 __ push(Immediate(Smi::FromInt(NONE))); |
1648 __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); | 1648 __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); |
1649 } else { | 1649 } else { |
1650 __ Drop(3); | 1650 __ Drop(3); |
(...skipping 21 matching lines...) Expand all Loading... |
1672 DCHECK(result_saved); | 1672 DCHECK(result_saved); |
1673 __ push(Operand(esp, 0)); | 1673 __ push(Operand(esp, 0)); |
1674 __ CallRuntime(Runtime::kToFastProperties, 1); | 1674 __ CallRuntime(Runtime::kToFastProperties, 1); |
1675 } | 1675 } |
1676 | 1676 |
1677 if (result_saved) { | 1677 if (result_saved) { |
1678 context()->PlugTOS(); | 1678 context()->PlugTOS(); |
1679 } else { | 1679 } else { |
1680 context()->Plug(eax); | 1680 context()->Plug(eax); |
1681 } | 1681 } |
1682 | |
1683 // Verify that compilation exactly consumed the number of store ic slots that | |
1684 // the ObjectLiteral node had to offer. | |
1685 DCHECK(!FLAG_vector_stores || store_slot_index == expr->slot_count()); | |
1686 } | 1682 } |
1687 | 1683 |
1688 | 1684 |
1689 void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { | 1685 void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { |
1690 Comment cmnt(masm_, "[ ArrayLiteral"); | 1686 Comment cmnt(masm_, "[ ArrayLiteral"); |
1691 | 1687 |
1692 expr->BuildConstantElements(isolate()); | 1688 expr->BuildConstantElements(isolate()); |
1693 Handle<FixedArray> constant_elements = expr->constant_elements(); | 1689 Handle<FixedArray> constant_elements = expr->constant_elements(); |
1694 bool has_constant_fast_elements = | 1690 bool has_constant_fast_elements = |
1695 IsFastObjectElementsKind(expr->constant_elements_kind()); | 1691 IsFastObjectElementsKind(expr->constant_elements_kind()); |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2346 break; | 2342 break; |
2347 default: | 2343 default: |
2348 UNREACHABLE(); | 2344 UNREACHABLE(); |
2349 } | 2345 } |
2350 | 2346 |
2351 __ bind(&done); | 2347 __ bind(&done); |
2352 context()->Plug(eax); | 2348 context()->Plug(eax); |
2353 } | 2349 } |
2354 | 2350 |
2355 | 2351 |
2356 void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit, | 2352 void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { |
2357 int* used_store_slots) { | |
2358 // Constructor is in eax. | 2353 // Constructor is in eax. |
2359 DCHECK(lit != NULL); | 2354 DCHECK(lit != NULL); |
2360 __ push(eax); | 2355 __ push(eax); |
2361 | 2356 |
2362 // No access check is needed here since the constructor is created by the | 2357 // No access check is needed here since the constructor is created by the |
2363 // class literal. | 2358 // class literal. |
2364 Register scratch = ebx; | 2359 Register scratch = ebx; |
2365 __ mov(scratch, FieldOperand(eax, JSFunction::kPrototypeOrInitialMapOffset)); | 2360 __ mov(scratch, FieldOperand(eax, JSFunction::kPrototypeOrInitialMapOffset)); |
2366 __ Push(scratch); | 2361 __ Push(scratch); |
2367 | 2362 |
(...skipping 11 matching lines...) Expand all Loading... |
2379 // The static prototype property is read only. We handle the non computed | 2374 // The static prototype property is read only. We handle the non computed |
2380 // property name case in the parser. Since this is the only case where we | 2375 // property name case in the parser. Since this is the only case where we |
2381 // need to check for an own read only property we special case this so we do | 2376 // need to check for an own read only property we special case this so we do |
2382 // not need to do this for every property. | 2377 // not need to do this for every property. |
2383 if (property->is_static() && property->is_computed_name()) { | 2378 if (property->is_static() && property->is_computed_name()) { |
2384 __ CallRuntime(Runtime::kThrowIfStaticPrototype, 1); | 2379 __ CallRuntime(Runtime::kThrowIfStaticPrototype, 1); |
2385 __ push(eax); | 2380 __ push(eax); |
2386 } | 2381 } |
2387 | 2382 |
2388 VisitForStackValue(value); | 2383 VisitForStackValue(value); |
2389 EmitSetHomeObjectIfNeeded(value, 2, | 2384 if (NeedsHomeObject(value)) { |
2390 lit->SlotForHomeObject(value, used_store_slots)); | 2385 EmitSetHomeObject(value, 2, property->GetSlot()); |
| 2386 } |
2391 | 2387 |
2392 switch (property->kind()) { | 2388 switch (property->kind()) { |
2393 case ObjectLiteral::Property::CONSTANT: | 2389 case ObjectLiteral::Property::CONSTANT: |
2394 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 2390 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
2395 case ObjectLiteral::Property::PROTOTYPE: | 2391 case ObjectLiteral::Property::PROTOTYPE: |
2396 UNREACHABLE(); | 2392 UNREACHABLE(); |
2397 case ObjectLiteral::Property::COMPUTED: | 2393 case ObjectLiteral::Property::COMPUTED: |
2398 __ CallRuntime(Runtime::kDefineClassMethod, 3); | 2394 __ CallRuntime(Runtime::kDefineClassMethod, 3); |
2399 break; | 2395 break; |
2400 | 2396 |
(...skipping 2840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5241 Assembler::target_address_at(call_target_address, | 5237 Assembler::target_address_at(call_target_address, |
5242 unoptimized_code)); | 5238 unoptimized_code)); |
5243 return OSR_AFTER_STACK_CHECK; | 5239 return OSR_AFTER_STACK_CHECK; |
5244 } | 5240 } |
5245 | 5241 |
5246 | 5242 |
5247 } // namespace internal | 5243 } // namespace internal |
5248 } // namespace v8 | 5244 } // namespace v8 |
5249 | 5245 |
5250 #endif // V8_TARGET_ARCH_IA32 | 5246 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |