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

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

Issue 1321993004: Vector ICs: ObjectLiteral refactoring for Oracle feedback (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE, turned off flag. Created 5 years, 3 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
« no previous file with comments | « src/full-codegen/full-codegen.cc ('k') | src/full-codegen/mips/full-codegen-mips.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 // 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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/full-codegen/full-codegen.cc ('k') | src/full-codegen/mips/full-codegen-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698