| OLD | NEW | 
|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 463 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 474   ASSERT(materialize_true == materialize_false); | 474   ASSERT(materialize_true == materialize_false); | 
| 475   __ bind(materialize_true); | 475   __ bind(materialize_true); | 
| 476 } | 476 } | 
| 477 | 477 | 
| 478 | 478 | 
| 479 void FullCodeGenerator::AccumulatorValueContext::Plug( | 479 void FullCodeGenerator::AccumulatorValueContext::Plug( | 
| 480     Label* materialize_true, | 480     Label* materialize_true, | 
| 481     Label* materialize_false) const { | 481     Label* materialize_false) const { | 
| 482   NearLabel done; | 482   NearLabel done; | 
| 483   __ bind(materialize_true); | 483   __ bind(materialize_true); | 
| 484   __ Move(result_register(), Factory::true_value()); | 484   __ Move(result_register(), isolate()->factory()->true_value()); | 
| 485   __ jmp(&done); | 485   __ jmp(&done); | 
| 486   __ bind(materialize_false); | 486   __ bind(materialize_false); | 
| 487   __ Move(result_register(), Factory::false_value()); | 487   __ Move(result_register(), isolate()->factory()->false_value()); | 
| 488   __ bind(&done); | 488   __ bind(&done); | 
| 489 } | 489 } | 
| 490 | 490 | 
| 491 | 491 | 
| 492 void FullCodeGenerator::StackValueContext::Plug( | 492 void FullCodeGenerator::StackValueContext::Plug( | 
| 493     Label* materialize_true, | 493     Label* materialize_true, | 
| 494     Label* materialize_false) const { | 494     Label* materialize_false) const { | 
| 495   NearLabel done; | 495   NearLabel done; | 
| 496   __ bind(materialize_true); | 496   __ bind(materialize_true); | 
| 497   __ Push(Factory::true_value()); | 497   __ Push(isolate()->factory()->true_value()); | 
| 498   __ jmp(&done); | 498   __ jmp(&done); | 
| 499   __ bind(materialize_false); | 499   __ bind(materialize_false); | 
| 500   __ Push(Factory::false_value()); | 500   __ Push(isolate()->factory()->false_value()); | 
| 501   __ bind(&done); | 501   __ bind(&done); | 
| 502 } | 502 } | 
| 503 | 503 | 
| 504 | 504 | 
| 505 void FullCodeGenerator::TestContext::Plug(Label* materialize_true, | 505 void FullCodeGenerator::TestContext::Plug(Label* materialize_true, | 
| 506                                           Label* materialize_false) const { | 506                                           Label* materialize_false) const { | 
| 507   ASSERT(materialize_true == true_label_); | 507   ASSERT(materialize_true == true_label_); | 
| 508   ASSERT(materialize_false == false_label_); | 508   ASSERT(materialize_false == false_label_); | 
| 509 } | 509 } | 
| 510 | 510 | 
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 733         VisitForAccumulatorValue(function); | 733         VisitForAccumulatorValue(function); | 
| 734         __ pop(rdx); | 734         __ pop(rdx); | 
| 735       } else { | 735       } else { | 
| 736         __ movq(rdx, rax); | 736         __ movq(rdx, rax); | 
| 737         __ LoadRoot(rax, Heap::kTheHoleValueRootIndex); | 737         __ LoadRoot(rax, Heap::kTheHoleValueRootIndex); | 
| 738       } | 738       } | 
| 739       ASSERT(prop->key()->AsLiteral() != NULL && | 739       ASSERT(prop->key()->AsLiteral() != NULL && | 
| 740              prop->key()->AsLiteral()->handle()->IsSmi()); | 740              prop->key()->AsLiteral()->handle()->IsSmi()); | 
| 741       __ Move(rcx, prop->key()->AsLiteral()->handle()); | 741       __ Move(rcx, prop->key()->AsLiteral()->handle()); | 
| 742 | 742 | 
| 743       Handle<Code> ic(Builtins::builtin( | 743       Handle<Code> ic(isolate()->builtins()->builtin(is_strict_mode() | 
| 744           is_strict_mode() ? Builtins::KeyedStoreIC_Initialize_Strict | 744           ? Builtins::KeyedStoreIC_Initialize_Strict | 
| 745                            : Builtins::KeyedStoreIC_Initialize)); | 745           : Builtins::KeyedStoreIC_Initialize)); | 
| 746       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 746       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 747     } | 747     } | 
| 748   } | 748   } | 
| 749 } | 749 } | 
| 750 | 750 | 
| 751 | 751 | 
| 752 void FullCodeGenerator::VisitDeclaration(Declaration* decl) { | 752 void FullCodeGenerator::VisitDeclaration(Declaration* decl) { | 
| 753   EmitDeclaration(decl->proxy()->var(), decl->mode(), decl->fun()); | 753   EmitDeclaration(decl->proxy()->var(), decl->mode(), decl->fun()); | 
| 754 } | 754 } | 
| 755 | 755 | 
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1043       !FLAG_prepare_always_opt && | 1043       !FLAG_prepare_always_opt && | 
| 1044       !pretenure && | 1044       !pretenure && | 
| 1045       scope()->is_function_scope() && | 1045       scope()->is_function_scope() && | 
| 1046       info->num_literals() == 0) { | 1046       info->num_literals() == 0) { | 
| 1047     FastNewClosureStub stub(info->strict_mode() ? kStrictMode : kNonStrictMode); | 1047     FastNewClosureStub stub(info->strict_mode() ? kStrictMode : kNonStrictMode); | 
| 1048     __ Push(info); | 1048     __ Push(info); | 
| 1049     __ CallStub(&stub); | 1049     __ CallStub(&stub); | 
| 1050   } else { | 1050   } else { | 
| 1051     __ push(rsi); | 1051     __ push(rsi); | 
| 1052     __ Push(info); | 1052     __ Push(info); | 
| 1053     __ Push(pretenure ? Factory::true_value() : Factory::false_value()); | 1053     __ Push(pretenure | 
|  | 1054             ? isolate()->factory()->true_value() | 
|  | 1055             : isolate()->factory()->false_value()); | 
| 1054     __ CallRuntime(Runtime::kNewClosure, 3); | 1056     __ CallRuntime(Runtime::kNewClosure, 3); | 
| 1055   } | 1057   } | 
| 1056   context()->Plug(rax); | 1058   context()->Plug(rax); | 
| 1057 } | 1059 } | 
| 1058 | 1060 | 
| 1059 | 1061 | 
| 1060 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 1062 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 
| 1061   Comment cmnt(masm_, "[ VariableProxy"); | 1063   Comment cmnt(masm_, "[ VariableProxy"); | 
| 1062   EmitVariableLoad(expr->var()); | 1064   EmitVariableLoad(expr->var()); | 
| 1063 } | 1065 } | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1112     __ movq(temp, ContextOperand(temp, Context::CLOSURE_INDEX)); | 1114     __ movq(temp, ContextOperand(temp, Context::CLOSURE_INDEX)); | 
| 1113     __ movq(temp, FieldOperand(temp, JSFunction::kContextOffset)); | 1115     __ movq(temp, FieldOperand(temp, JSFunction::kContextOffset)); | 
| 1114     __ jmp(&next); | 1116     __ jmp(&next); | 
| 1115     __ bind(&fast); | 1117     __ bind(&fast); | 
| 1116   } | 1118   } | 
| 1117 | 1119 | 
| 1118   // All extension objects were empty and it is safe to use a global | 1120   // All extension objects were empty and it is safe to use a global | 
| 1119   // load IC call. | 1121   // load IC call. | 
| 1120   __ movq(rax, GlobalObjectOperand()); | 1122   __ movq(rax, GlobalObjectOperand()); | 
| 1121   __ Move(rcx, slot->var()->name()); | 1123   __ Move(rcx, slot->var()->name()); | 
| 1122   Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); | 1124   Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 1125       Builtins::LoadIC_Initialize)); | 
| 1123   RelocInfo::Mode mode = (typeof_state == INSIDE_TYPEOF) | 1126   RelocInfo::Mode mode = (typeof_state == INSIDE_TYPEOF) | 
| 1124       ? RelocInfo::CODE_TARGET | 1127       ? RelocInfo::CODE_TARGET | 
| 1125       : RelocInfo::CODE_TARGET_CONTEXT; | 1128       : RelocInfo::CODE_TARGET_CONTEXT; | 
| 1126   EmitCallIC(ic, mode); | 1129   EmitCallIC(ic, mode); | 
| 1127 } | 1130 } | 
| 1128 | 1131 | 
| 1129 | 1132 | 
| 1130 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions( | 1133 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions( | 
| 1131     Slot* slot, | 1134     Slot* slot, | 
| 1132     Label* slow) { | 1135     Label* slow) { | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1195             key_literal != NULL && | 1198             key_literal != NULL && | 
| 1196             obj_proxy->IsArguments() && | 1199             obj_proxy->IsArguments() && | 
| 1197             key_literal->handle()->IsSmi()) { | 1200             key_literal->handle()->IsSmi()) { | 
| 1198           // Load arguments object if there are no eval-introduced | 1201           // Load arguments object if there are no eval-introduced | 
| 1199           // variables. Then load the argument from the arguments | 1202           // variables. Then load the argument from the arguments | 
| 1200           // object using keyed load. | 1203           // object using keyed load. | 
| 1201           __ movq(rdx, | 1204           __ movq(rdx, | 
| 1202                   ContextSlotOperandCheckExtensions(obj_proxy->var()->AsSlot(), | 1205                   ContextSlotOperandCheckExtensions(obj_proxy->var()->AsSlot(), | 
| 1203                                                     slow)); | 1206                                                     slow)); | 
| 1204           __ Move(rax, key_literal->handle()); | 1207           __ Move(rax, key_literal->handle()); | 
| 1205           Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 1208           Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 1209               Builtins::KeyedLoadIC_Initialize)); | 
| 1206           EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1210           EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1207           __ jmp(done); | 1211           __ jmp(done); | 
| 1208         } | 1212         } | 
| 1209       } | 1213       } | 
| 1210     } | 1214     } | 
| 1211   } | 1215   } | 
| 1212 } | 1216 } | 
| 1213 | 1217 | 
| 1214 | 1218 | 
| 1215 void FullCodeGenerator::EmitVariableLoad(Variable* var) { | 1219 void FullCodeGenerator::EmitVariableLoad(Variable* var) { | 
| 1216   // Four cases: non-this global variables, lookup slots, all other | 1220   // Four cases: non-this global variables, lookup slots, all other | 
| 1217   // types of slots, and parameters that rewrite to explicit property | 1221   // types of slots, and parameters that rewrite to explicit property | 
| 1218   // accesses on the arguments object. | 1222   // accesses on the arguments object. | 
| 1219   Slot* slot = var->AsSlot(); | 1223   Slot* slot = var->AsSlot(); | 
| 1220   Property* property = var->AsProperty(); | 1224   Property* property = var->AsProperty(); | 
| 1221 | 1225 | 
| 1222   if (var->is_global() && !var->is_this()) { | 1226   if (var->is_global() && !var->is_this()) { | 
| 1223     Comment cmnt(masm_, "Global variable"); | 1227     Comment cmnt(masm_, "Global variable"); | 
| 1224     // Use inline caching. Variable name is passed in rcx and the global | 1228     // Use inline caching. Variable name is passed in rcx and the global | 
| 1225     // object on the stack. | 1229     // object on the stack. | 
| 1226     __ Move(rcx, var->name()); | 1230     __ Move(rcx, var->name()); | 
| 1227     __ movq(rax, GlobalObjectOperand()); | 1231     __ movq(rax, GlobalObjectOperand()); | 
| 1228     Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); | 1232     Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 1233         Builtins::LoadIC_Initialize)); | 
| 1229     EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); | 1234     EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); | 
| 1230     context()->Plug(rax); | 1235     context()->Plug(rax); | 
| 1231 | 1236 | 
| 1232   } else if (slot != NULL && slot->type() == Slot::LOOKUP) { | 1237   } else if (slot != NULL && slot->type() == Slot::LOOKUP) { | 
| 1233     Label done, slow; | 1238     Label done, slow; | 
| 1234 | 1239 | 
| 1235     // Generate code for loading from variables potentially shadowed | 1240     // Generate code for loading from variables potentially shadowed | 
| 1236     // by eval-introduced variables. | 1241     // by eval-introduced variables. | 
| 1237     EmitDynamicLoadFromSlotFastCase(slot, NOT_INSIDE_TYPEOF, &slow, &done); | 1242     EmitDynamicLoadFromSlotFastCase(slot, NOT_INSIDE_TYPEOF, &slow, &done); | 
| 1238 | 1243 | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1281 | 1286 | 
| 1282     // Assert that the key is a smi. | 1287     // Assert that the key is a smi. | 
| 1283     Literal* key_literal = property->key()->AsLiteral(); | 1288     Literal* key_literal = property->key()->AsLiteral(); | 
| 1284     ASSERT_NOT_NULL(key_literal); | 1289     ASSERT_NOT_NULL(key_literal); | 
| 1285     ASSERT(key_literal->handle()->IsSmi()); | 1290     ASSERT(key_literal->handle()->IsSmi()); | 
| 1286 | 1291 | 
| 1287     // Load the key. | 1292     // Load the key. | 
| 1288     __ Move(rax, key_literal->handle()); | 1293     __ Move(rax, key_literal->handle()); | 
| 1289 | 1294 | 
| 1290     // Do a keyed property load. | 1295     // Do a keyed property load. | 
| 1291     Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 1296     Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 1297         Builtins::KeyedLoadIC_Initialize)); | 
| 1292     EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1298     EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1293     context()->Plug(rax); | 1299     context()->Plug(rax); | 
| 1294   } | 1300   } | 
| 1295 } | 1301 } | 
| 1296 | 1302 | 
| 1297 | 1303 | 
| 1298 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { | 1304 void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { | 
| 1299   Comment cmnt(masm_, "[ RegExpLiteral"); | 1305   Comment cmnt(masm_, "[ RegExpLiteral"); | 
| 1300   Label materialized; | 1306   Label materialized; | 
| 1301   // Registers will be used as follows: | 1307   // Registers will be used as follows: | 
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1386         UNREACHABLE(); | 1392         UNREACHABLE(); | 
| 1387       case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1393       case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 
| 1388         ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); | 1394         ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); | 
| 1389         // Fall through. | 1395         // Fall through. | 
| 1390       case ObjectLiteral::Property::COMPUTED: | 1396       case ObjectLiteral::Property::COMPUTED: | 
| 1391         if (key->handle()->IsSymbol()) { | 1397         if (key->handle()->IsSymbol()) { | 
| 1392           VisitForAccumulatorValue(value); | 1398           VisitForAccumulatorValue(value); | 
| 1393           __ Move(rcx, key->handle()); | 1399           __ Move(rcx, key->handle()); | 
| 1394           __ movq(rdx, Operand(rsp, 0)); | 1400           __ movq(rdx, Operand(rsp, 0)); | 
| 1395           if (property->emit_store()) { | 1401           if (property->emit_store()) { | 
| 1396             Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); | 1402             Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 1403                 Builtins::StoreIC_Initialize)); | 
| 1397             EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1404             EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1398             PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1405             PrepareForBailoutForId(key->id(), NO_REGISTERS); | 
| 1399           } | 1406           } | 
| 1400           break; | 1407           break; | 
| 1401         } | 1408         } | 
| 1402         // Fall through. | 1409         // Fall through. | 
| 1403       case ObjectLiteral::Property::PROTOTYPE: | 1410       case ObjectLiteral::Property::PROTOTYPE: | 
| 1404         __ push(Operand(rsp, 0));  // Duplicate receiver. | 1411         __ push(Operand(rsp, 0));  // Duplicate receiver. | 
| 1405         VisitForStackValue(key); | 1412         VisitForStackValue(key); | 
| 1406         VisitForStackValue(value); | 1413         VisitForStackValue(value); | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 1435 void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { | 1442 void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { | 
| 1436   Comment cmnt(masm_, "[ ArrayLiteral"); | 1443   Comment cmnt(masm_, "[ ArrayLiteral"); | 
| 1437 | 1444 | 
| 1438   ZoneList<Expression*>* subexprs = expr->values(); | 1445   ZoneList<Expression*>* subexprs = expr->values(); | 
| 1439   int length = subexprs->length(); | 1446   int length = subexprs->length(); | 
| 1440 | 1447 | 
| 1441   __ movq(rbx, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); | 1448   __ movq(rbx, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); | 
| 1442   __ push(FieldOperand(rbx, JSFunction::kLiteralsOffset)); | 1449   __ push(FieldOperand(rbx, JSFunction::kLiteralsOffset)); | 
| 1443   __ Push(Smi::FromInt(expr->literal_index())); | 1450   __ Push(Smi::FromInt(expr->literal_index())); | 
| 1444   __ Push(expr->constant_elements()); | 1451   __ Push(expr->constant_elements()); | 
| 1445   if (expr->constant_elements()->map() == Heap::fixed_cow_array_map()) { | 1452   if (expr->constant_elements()->map() == | 
|  | 1453       isolate()->heap()->fixed_cow_array_map()) { | 
| 1446     FastCloneShallowArrayStub stub( | 1454     FastCloneShallowArrayStub stub( | 
| 1447         FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS, length); | 1455         FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS, length); | 
| 1448     __ CallStub(&stub); | 1456     __ CallStub(&stub); | 
| 1449     __ IncrementCounter(&Counters::cow_arrays_created_stub, 1); | 1457     __ IncrementCounter(isolate()->counters()->cow_arrays_created_stub(), 1); | 
| 1450   } else if (expr->depth() > 1) { | 1458   } else if (expr->depth() > 1) { | 
| 1451     __ CallRuntime(Runtime::kCreateArrayLiteral, 3); | 1459     __ CallRuntime(Runtime::kCreateArrayLiteral, 3); | 
| 1452   } else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) { | 1460   } else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) { | 
| 1453     __ CallRuntime(Runtime::kCreateArrayLiteralShallow, 3); | 1461     __ CallRuntime(Runtime::kCreateArrayLiteralShallow, 3); | 
| 1454   } else { | 1462   } else { | 
| 1455     FastCloneShallowArrayStub stub( | 1463     FastCloneShallowArrayStub stub( | 
| 1456         FastCloneShallowArrayStub::CLONE_ELEMENTS, length); | 1464         FastCloneShallowArrayStub::CLONE_ELEMENTS, length); | 
| 1457     __ CallStub(&stub); | 1465     __ CallStub(&stub); | 
| 1458   } | 1466   } | 
| 1459 | 1467 | 
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1623       EmitKeyedPropertyAssignment(expr); | 1631       EmitKeyedPropertyAssignment(expr); | 
| 1624       break; | 1632       break; | 
| 1625   } | 1633   } | 
| 1626 } | 1634 } | 
| 1627 | 1635 | 
| 1628 | 1636 | 
| 1629 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 1637 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 
| 1630   SetSourcePosition(prop->position()); | 1638   SetSourcePosition(prop->position()); | 
| 1631   Literal* key = prop->key()->AsLiteral(); | 1639   Literal* key = prop->key()->AsLiteral(); | 
| 1632   __ Move(rcx, key->handle()); | 1640   __ Move(rcx, key->handle()); | 
| 1633   Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); | 1641   Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 1642       Builtins::LoadIC_Initialize)); | 
| 1634   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1643   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1635 } | 1644 } | 
| 1636 | 1645 | 
| 1637 | 1646 | 
| 1638 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 1647 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 
| 1639   SetSourcePosition(prop->position()); | 1648   SetSourcePosition(prop->position()); | 
| 1640   Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 1649   Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 1650       Builtins::KeyedLoadIC_Initialize)); | 
| 1641   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1651   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1642 } | 1652 } | 
| 1643 | 1653 | 
| 1644 | 1654 | 
| 1645 void FullCodeGenerator::EmitInlineSmiBinaryOp(Expression* expr, | 1655 void FullCodeGenerator::EmitInlineSmiBinaryOp(Expression* expr, | 
| 1646                                               Token::Value op, | 1656                                               Token::Value op, | 
| 1647                                               OverwriteMode mode, | 1657                                               OverwriteMode mode, | 
| 1648                                               Expression* left, | 1658                                               Expression* left, | 
| 1649                                               Expression* right) { | 1659                                               Expression* right) { | 
| 1650   // Do combined smi check of the operands. Left operand is on the | 1660   // Do combined smi check of the operands. Left operand is on the | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1736       EffectContext context(this); | 1746       EffectContext context(this); | 
| 1737       EmitVariableAssignment(var, Token::ASSIGN); | 1747       EmitVariableAssignment(var, Token::ASSIGN); | 
| 1738       break; | 1748       break; | 
| 1739     } | 1749     } | 
| 1740     case NAMED_PROPERTY: { | 1750     case NAMED_PROPERTY: { | 
| 1741       __ push(rax);  // Preserve value. | 1751       __ push(rax);  // Preserve value. | 
| 1742       VisitForAccumulatorValue(prop->obj()); | 1752       VisitForAccumulatorValue(prop->obj()); | 
| 1743       __ movq(rdx, rax); | 1753       __ movq(rdx, rax); | 
| 1744       __ pop(rax);  // Restore value. | 1754       __ pop(rax);  // Restore value. | 
| 1745       __ Move(rcx, prop->key()->AsLiteral()->handle()); | 1755       __ Move(rcx, prop->key()->AsLiteral()->handle()); | 
| 1746       Handle<Code> ic(Builtins::builtin( | 1756       Handle<Code> ic(isolate()->builtins()->builtin( | 
| 1747           is_strict_mode() ? Builtins::StoreIC_Initialize_Strict | 1757           is_strict_mode() ? Builtins::StoreIC_Initialize_Strict | 
| 1748                            : Builtins::StoreIC_Initialize)); | 1758                            : Builtins::StoreIC_Initialize)); | 
| 1749       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1759       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1750       break; | 1760       break; | 
| 1751     } | 1761     } | 
| 1752     case KEYED_PROPERTY: { | 1762     case KEYED_PROPERTY: { | 
| 1753       __ push(rax);  // Preserve value. | 1763       __ push(rax);  // Preserve value. | 
| 1754       if (prop->is_synthetic()) { | 1764       if (prop->is_synthetic()) { | 
| 1755         ASSERT(prop->obj()->AsVariableProxy() != NULL); | 1765         ASSERT(prop->obj()->AsVariableProxy() != NULL); | 
| 1756         ASSERT(prop->key()->AsLiteral() != NULL); | 1766         ASSERT(prop->key()->AsLiteral() != NULL); | 
| 1757         { AccumulatorValueContext for_object(this); | 1767         { AccumulatorValueContext for_object(this); | 
| 1758           EmitVariableLoad(prop->obj()->AsVariableProxy()->var()); | 1768           EmitVariableLoad(prop->obj()->AsVariableProxy()->var()); | 
| 1759         } | 1769         } | 
| 1760         __ movq(rdx, rax); | 1770         __ movq(rdx, rax); | 
| 1761         __ Move(rcx, prop->key()->AsLiteral()->handle()); | 1771         __ Move(rcx, prop->key()->AsLiteral()->handle()); | 
| 1762       } else { | 1772       } else { | 
| 1763         VisitForStackValue(prop->obj()); | 1773         VisitForStackValue(prop->obj()); | 
| 1764         VisitForAccumulatorValue(prop->key()); | 1774         VisitForAccumulatorValue(prop->key()); | 
| 1765         __ movq(rcx, rax); | 1775         __ movq(rcx, rax); | 
| 1766         __ pop(rdx); | 1776         __ pop(rdx); | 
| 1767       } | 1777       } | 
| 1768       __ pop(rax);  // Restore value. | 1778       __ pop(rax);  // Restore value. | 
| 1769       Handle<Code> ic(Builtins::builtin( | 1779       Handle<Code> ic(isolate()->builtins()->builtin( | 
| 1770           is_strict_mode() ? Builtins::KeyedStoreIC_Initialize_Strict | 1780           is_strict_mode() ? Builtins::KeyedStoreIC_Initialize_Strict | 
| 1771                            : Builtins::KeyedStoreIC_Initialize)); | 1781                            : Builtins::KeyedStoreIC_Initialize)); | 
| 1772       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1782       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1773       break; | 1783       break; | 
| 1774     } | 1784     } | 
| 1775   } | 1785   } | 
| 1776   PrepareForBailoutForId(bailout_ast_id, TOS_REG); | 1786   PrepareForBailoutForId(bailout_ast_id, TOS_REG); | 
| 1777   context()->Plug(rax); | 1787   context()->Plug(rax); | 
| 1778 } | 1788 } | 
| 1779 | 1789 | 
| 1780 | 1790 | 
| 1781 void FullCodeGenerator::EmitVariableAssignment(Variable* var, | 1791 void FullCodeGenerator::EmitVariableAssignment(Variable* var, | 
| 1782                                                Token::Value op) { | 1792                                                Token::Value op) { | 
| 1783   // Left-hand sides that rewrite to explicit property accesses do not reach | 1793   // Left-hand sides that rewrite to explicit property accesses do not reach | 
| 1784   // here. | 1794   // here. | 
| 1785   ASSERT(var != NULL); | 1795   ASSERT(var != NULL); | 
| 1786   ASSERT(var->is_global() || var->AsSlot() != NULL); | 1796   ASSERT(var->is_global() || var->AsSlot() != NULL); | 
| 1787 | 1797 | 
| 1788   if (var->is_global()) { | 1798   if (var->is_global()) { | 
| 1789     ASSERT(!var->is_this()); | 1799     ASSERT(!var->is_this()); | 
| 1790     // Assignment to a global variable.  Use inline caching for the | 1800     // Assignment to a global variable.  Use inline caching for the | 
| 1791     // assignment.  Right-hand-side value is passed in rax, variable name in | 1801     // assignment.  Right-hand-side value is passed in rax, variable name in | 
| 1792     // rcx, and the global object on the stack. | 1802     // rcx, and the global object on the stack. | 
| 1793     __ Move(rcx, var->name()); | 1803     __ Move(rcx, var->name()); | 
| 1794     __ movq(rdx, GlobalObjectOperand()); | 1804     __ movq(rdx, GlobalObjectOperand()); | 
| 1795     Handle<Code> ic(Builtins::builtin( | 1805     Handle<Code> ic(isolate()->builtins()->builtin(is_strict_mode() | 
| 1796         is_strict_mode() ? Builtins::StoreIC_Initialize_Strict | 1806         ? Builtins::StoreIC_Initialize_Strict | 
| 1797                          : Builtins::StoreIC_Initialize)); | 1807         : Builtins::StoreIC_Initialize)); | 
| 1798     EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); | 1808     EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); | 
| 1799 | 1809 | 
| 1800   } else if (op == Token::INIT_CONST) { | 1810   } else if (op == Token::INIT_CONST) { | 
| 1801     // Like var declarations, const declarations are hoisted to function | 1811     // Like var declarations, const declarations are hoisted to function | 
| 1802     // scope.  However, unlike var initializers, const initializers are able | 1812     // scope.  However, unlike var initializers, const initializers are able | 
| 1803     // to drill a hole to that function context, even from inside a 'with' | 1813     // to drill a hole to that function context, even from inside a 'with' | 
| 1804     // context.  We thus bypass the normal static scope lookup. | 1814     // context.  We thus bypass the normal static scope lookup. | 
| 1805     Slot* slot = var->AsSlot(); | 1815     Slot* slot = var->AsSlot(); | 
| 1806     Label skip; | 1816     Label skip; | 
| 1807     switch (slot->type()) { | 1817     switch (slot->type()) { | 
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1888   } | 1898   } | 
| 1889 | 1899 | 
| 1890   // Record source code position before IC call. | 1900   // Record source code position before IC call. | 
| 1891   SetSourcePosition(expr->position()); | 1901   SetSourcePosition(expr->position()); | 
| 1892   __ Move(rcx, prop->key()->AsLiteral()->handle()); | 1902   __ Move(rcx, prop->key()->AsLiteral()->handle()); | 
| 1893   if (expr->ends_initialization_block()) { | 1903   if (expr->ends_initialization_block()) { | 
| 1894     __ movq(rdx, Operand(rsp, 0)); | 1904     __ movq(rdx, Operand(rsp, 0)); | 
| 1895   } else { | 1905   } else { | 
| 1896     __ pop(rdx); | 1906     __ pop(rdx); | 
| 1897   } | 1907   } | 
| 1898   Handle<Code> ic(Builtins::builtin( | 1908   Handle<Code> ic(isolate()->builtins()->builtin( | 
| 1899       is_strict_mode() ? Builtins::StoreIC_Initialize_Strict | 1909       is_strict_mode() ? Builtins::StoreIC_Initialize_Strict | 
| 1900                        : Builtins::StoreIC_Initialize)); | 1910                        : Builtins::StoreIC_Initialize)); | 
| 1901   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1911   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1902 | 1912 | 
| 1903   // If the assignment ends an initialization block, revert to fast case. | 1913   // If the assignment ends an initialization block, revert to fast case. | 
| 1904   if (expr->ends_initialization_block()) { | 1914   if (expr->ends_initialization_block()) { | 
| 1905     __ push(rax);  // Result of assignment, saved even if not needed. | 1915     __ push(rax);  // Result of assignment, saved even if not needed. | 
| 1906     __ push(Operand(rsp, kPointerSize));  // Receiver is under value. | 1916     __ push(Operand(rsp, kPointerSize));  // Receiver is under value. | 
| 1907     __ CallRuntime(Runtime::kToFastProperties, 1); | 1917     __ CallRuntime(Runtime::kToFastProperties, 1); | 
| 1908     __ pop(rax); | 1918     __ pop(rax); | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 1928   } | 1938   } | 
| 1929 | 1939 | 
| 1930   __ pop(rcx); | 1940   __ pop(rcx); | 
| 1931   if (expr->ends_initialization_block()) { | 1941   if (expr->ends_initialization_block()) { | 
| 1932     __ movq(rdx, Operand(rsp, 0));  // Leave receiver on the stack for later. | 1942     __ movq(rdx, Operand(rsp, 0));  // Leave receiver on the stack for later. | 
| 1933   } else { | 1943   } else { | 
| 1934     __ pop(rdx); | 1944     __ pop(rdx); | 
| 1935   } | 1945   } | 
| 1936   // Record source code position before IC call. | 1946   // Record source code position before IC call. | 
| 1937   SetSourcePosition(expr->position()); | 1947   SetSourcePosition(expr->position()); | 
| 1938   Handle<Code> ic(Builtins::builtin( | 1948   Handle<Code> ic(isolate()->builtins()->builtin( | 
| 1939       is_strict_mode() ? Builtins::KeyedStoreIC_Initialize_Strict | 1949       is_strict_mode() ? Builtins::KeyedStoreIC_Initialize_Strict | 
| 1940                        : Builtins::KeyedStoreIC_Initialize)); | 1950                        : Builtins::KeyedStoreIC_Initialize)); | 
| 1941   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 1951   EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 1942 | 1952 | 
| 1943   // If the assignment ends an initialization block, revert to fast case. | 1953   // If the assignment ends an initialization block, revert to fast case. | 
| 1944   if (expr->ends_initialization_block()) { | 1954   if (expr->ends_initialization_block()) { | 
| 1945     __ pop(rdx); | 1955     __ pop(rdx); | 
| 1946     __ push(rax);  // Result of assignment, saved even if not needed. | 1956     __ push(rax);  // Result of assignment, saved even if not needed. | 
| 1947     __ push(rdx); | 1957     __ push(rdx); | 
| 1948     __ CallRuntime(Runtime::kToFastProperties, 1); | 1958     __ CallRuntime(Runtime::kToFastProperties, 1); | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1981   { PreservePositionScope scope(masm()->positions_recorder()); | 1991   { PreservePositionScope scope(masm()->positions_recorder()); | 
| 1982     for (int i = 0; i < arg_count; i++) { | 1992     for (int i = 0; i < arg_count; i++) { | 
| 1983       VisitForStackValue(args->at(i)); | 1993       VisitForStackValue(args->at(i)); | 
| 1984     } | 1994     } | 
| 1985     __ Move(rcx, name); | 1995     __ Move(rcx, name); | 
| 1986   } | 1996   } | 
| 1987   // Record source position for debugger. | 1997   // Record source position for debugger. | 
| 1988   SetSourcePosition(expr->position()); | 1998   SetSourcePosition(expr->position()); | 
| 1989   // Call the IC initialization code. | 1999   // Call the IC initialization code. | 
| 1990   InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 2000   InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 
| 1991   Handle<Code> ic = StubCache::ComputeCallInitialize(arg_count, in_loop); | 2001   Handle<Code> ic = | 
|  | 2002       ISOLATE->stub_cache()->ComputeCallInitialize(arg_count, in_loop); | 
| 1992   EmitCallIC(ic, mode); | 2003   EmitCallIC(ic, mode); | 
| 1993   RecordJSReturnSite(expr); | 2004   RecordJSReturnSite(expr); | 
| 1994   // Restore context register. | 2005   // Restore context register. | 
| 1995   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2006   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 
| 1996   context()->Plug(rax); | 2007   context()->Plug(rax); | 
| 1997 } | 2008 } | 
| 1998 | 2009 | 
| 1999 | 2010 | 
| 2000 void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, | 2011 void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, | 
| 2001                                             Expression* key, | 2012                                             Expression* key, | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 2014   int arg_count = args->length(); | 2025   int arg_count = args->length(); | 
| 2015   { PreservePositionScope scope(masm()->positions_recorder()); | 2026   { PreservePositionScope scope(masm()->positions_recorder()); | 
| 2016     for (int i = 0; i < arg_count; i++) { | 2027     for (int i = 0; i < arg_count; i++) { | 
| 2017       VisitForStackValue(args->at(i)); | 2028       VisitForStackValue(args->at(i)); | 
| 2018     } | 2029     } | 
| 2019   } | 2030   } | 
| 2020   // Record source position for debugger. | 2031   // Record source position for debugger. | 
| 2021   SetSourcePosition(expr->position()); | 2032   SetSourcePosition(expr->position()); | 
| 2022   // Call the IC initialization code. | 2033   // Call the IC initialization code. | 
| 2023   InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 2034   InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 
| 2024   Handle<Code> ic = StubCache::ComputeKeyedCallInitialize(arg_count, in_loop); | 2035   Handle<Code> ic = | 
|  | 2036       ISOLATE->stub_cache()->ComputeKeyedCallInitialize(arg_count, in_loop); | 
| 2025   __ movq(rcx, Operand(rsp, (arg_count + 1) * kPointerSize));  // Key. | 2037   __ movq(rcx, Operand(rsp, (arg_count + 1) * kPointerSize));  // Key. | 
| 2026   EmitCallIC(ic, mode); | 2038   EmitCallIC(ic, mode); | 
| 2027   RecordJSReturnSite(expr); | 2039   RecordJSReturnSite(expr); | 
| 2028   // Restore context register. | 2040   // Restore context register. | 
| 2029   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2041   __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 
| 2030   context()->DropAndPlug(1, rax);  // Drop the key still on the stack. | 2042   context()->DropAndPlug(1, rax);  // Drop the key still on the stack. | 
| 2031 } | 2043 } | 
| 2032 | 2044 | 
| 2033 | 2045 | 
| 2034 void FullCodeGenerator::EmitCallWithStub(Call* expr) { | 2046 void FullCodeGenerator::EmitCallWithStub(Call* expr) { | 
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2207         MemOperand operand = EmitSlotSearch(slot, rdx); | 2219         MemOperand operand = EmitSlotSearch(slot, rdx); | 
| 2208         __ movq(rdx, operand); | 2220         __ movq(rdx, operand); | 
| 2209 | 2221 | 
| 2210         ASSERT(prop->key()->AsLiteral() != NULL); | 2222         ASSERT(prop->key()->AsLiteral() != NULL); | 
| 2211         ASSERT(prop->key()->AsLiteral()->handle()->IsSmi()); | 2223         ASSERT(prop->key()->AsLiteral()->handle()->IsSmi()); | 
| 2212         __ Move(rax, prop->key()->AsLiteral()->handle()); | 2224         __ Move(rax, prop->key()->AsLiteral()->handle()); | 
| 2213 | 2225 | 
| 2214         // Record source code position for IC call. | 2226         // Record source code position for IC call. | 
| 2215         SetSourcePosition(prop->position()); | 2227         SetSourcePosition(prop->position()); | 
| 2216 | 2228 | 
| 2217         Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 2229         Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 2230             Builtins::KeyedLoadIC_Initialize)); | 
| 2218         EmitCallIC(ic, RelocInfo::CODE_TARGET); | 2231         EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 2219         // Push result (function). | 2232         // Push result (function). | 
| 2220         __ push(rax); | 2233         __ push(rax); | 
| 2221         // Push Global receiver. | 2234         // Push Global receiver. | 
| 2222         __ movq(rcx, GlobalObjectOperand()); | 2235         __ movq(rcx, GlobalObjectOperand()); | 
| 2223         __ push(FieldOperand(rcx, GlobalObject::kGlobalReceiverOffset)); | 2236         __ push(FieldOperand(rcx, GlobalObject::kGlobalReceiverOffset)); | 
| 2224         EmitCallWithStub(expr); | 2237         EmitCallWithStub(expr); | 
| 2225       } else { | 2238       } else { | 
| 2226         { PreservePositionScope scope(masm()->positions_recorder()); | 2239         { PreservePositionScope scope(masm()->positions_recorder()); | 
| 2227           VisitForStackValue(prop->obj()); | 2240           VisitForStackValue(prop->obj()); | 
| 2228         } | 2241         } | 
| 2229         EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET); | 2242         EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET); | 
| 2230       } | 2243       } | 
| 2231     } | 2244     } | 
| 2232   } else { | 2245   } else { | 
| 2233     // Call to some other expression.  If the expression is an anonymous | 2246     // Call to some other expression.  If the expression is an anonymous | 
| 2234     // function literal not called in a loop, mark it as one that should | 2247     // function literal not called in a loop, mark it as one that should | 
| 2235     // also use the full code generator. | 2248     // also use the full code generator. | 
| 2236     FunctionLiteral* lit = fun->AsFunctionLiteral(); | 2249     FunctionLiteral* lit = fun->AsFunctionLiteral(); | 
| 2237     if (lit != NULL && | 2250     if (lit != NULL && | 
| 2238         lit->name()->Equals(Heap::empty_string()) && | 2251         lit->name()->Equals(isolate()->heap()->empty_string()) && | 
| 2239         loop_depth() == 0) { | 2252         loop_depth() == 0) { | 
| 2240       lit->set_try_full_codegen(true); | 2253       lit->set_try_full_codegen(true); | 
| 2241     } | 2254     } | 
| 2242     { PreservePositionScope scope(masm()->positions_recorder()); | 2255     { PreservePositionScope scope(masm()->positions_recorder()); | 
| 2243       VisitForStackValue(fun); | 2256       VisitForStackValue(fun); | 
| 2244     } | 2257     } | 
| 2245     // Load global receiver object. | 2258     // Load global receiver object. | 
| 2246     __ movq(rbx, GlobalObjectOperand()); | 2259     __ movq(rbx, GlobalObjectOperand()); | 
| 2247     __ push(FieldOperand(rbx, GlobalObject::kGlobalReceiverOffset)); | 2260     __ push(FieldOperand(rbx, GlobalObject::kGlobalReceiverOffset)); | 
| 2248     // Emit function call. | 2261     // Emit function call. | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
| 2275   } | 2288   } | 
| 2276 | 2289 | 
| 2277   // Call the construct call builtin that handles allocation and | 2290   // Call the construct call builtin that handles allocation and | 
| 2278   // constructor invocation. | 2291   // constructor invocation. | 
| 2279   SetSourcePosition(expr->position()); | 2292   SetSourcePosition(expr->position()); | 
| 2280 | 2293 | 
| 2281   // Load function and argument count into rdi and rax. | 2294   // Load function and argument count into rdi and rax. | 
| 2282   __ Set(rax, arg_count); | 2295   __ Set(rax, arg_count); | 
| 2283   __ movq(rdi, Operand(rsp, arg_count * kPointerSize)); | 2296   __ movq(rdi, Operand(rsp, arg_count * kPointerSize)); | 
| 2284 | 2297 | 
| 2285   Handle<Code> construct_builtin(Builtins::builtin(Builtins::JSConstructCall)); | 2298   Handle<Code> construct_builtin(isolate()->builtins()->builtin( | 
|  | 2299       Builtins::JSConstructCall)); | 
| 2286   __ Call(construct_builtin, RelocInfo::CONSTRUCT_CALL); | 2300   __ Call(construct_builtin, RelocInfo::CONSTRUCT_CALL); | 
| 2287   context()->Plug(rax); | 2301   context()->Plug(rax); | 
| 2288 } | 2302 } | 
| 2289 | 2303 | 
| 2290 | 2304 | 
| 2291 void FullCodeGenerator::EmitIsSmi(ZoneList<Expression*>* args) { | 2305 void FullCodeGenerator::EmitIsSmi(ZoneList<Expression*>* args) { | 
| 2292   ASSERT(args->length() == 1); | 2306   ASSERT(args->length() == 1); | 
| 2293 | 2307 | 
| 2294   VisitForAccumulatorValue(args->at(0)); | 2308   VisitForAccumulatorValue(args->at(0)); | 
| 2295 | 2309 | 
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2608   __ j(not_equal, &non_function_constructor); | 2622   __ j(not_equal, &non_function_constructor); | 
| 2609 | 2623 | 
| 2610   // rax now contains the constructor function. Grab the | 2624   // rax now contains the constructor function. Grab the | 
| 2611   // instance class name from there. | 2625   // instance class name from there. | 
| 2612   __ movq(rax, FieldOperand(rax, JSFunction::kSharedFunctionInfoOffset)); | 2626   __ movq(rax, FieldOperand(rax, JSFunction::kSharedFunctionInfoOffset)); | 
| 2613   __ movq(rax, FieldOperand(rax, SharedFunctionInfo::kInstanceClassNameOffset)); | 2627   __ movq(rax, FieldOperand(rax, SharedFunctionInfo::kInstanceClassNameOffset)); | 
| 2614   __ jmp(&done); | 2628   __ jmp(&done); | 
| 2615 | 2629 | 
| 2616   // Functions have class 'Function'. | 2630   // Functions have class 'Function'. | 
| 2617   __ bind(&function); | 2631   __ bind(&function); | 
| 2618   __ Move(rax, Factory::function_class_symbol()); | 2632   __ Move(rax, isolate()->factory()->function_class_symbol()); | 
| 2619   __ jmp(&done); | 2633   __ jmp(&done); | 
| 2620 | 2634 | 
| 2621   // Objects with a non-function constructor have class 'Object'. | 2635   // Objects with a non-function constructor have class 'Object'. | 
| 2622   __ bind(&non_function_constructor); | 2636   __ bind(&non_function_constructor); | 
| 2623   __ Move(rax, Factory::Object_symbol()); | 2637   __ Move(rax, isolate()->factory()->Object_symbol()); | 
| 2624   __ jmp(&done); | 2638   __ jmp(&done); | 
| 2625 | 2639 | 
| 2626   // Non-JS objects have class null. | 2640   // Non-JS objects have class null. | 
| 2627   __ bind(&null); | 2641   __ bind(&null); | 
| 2628   __ LoadRoot(rax, Heap::kNullValueRootIndex); | 2642   __ LoadRoot(rax, Heap::kNullValueRootIndex); | 
| 2629 | 2643 | 
| 2630   // All done. | 2644   // All done. | 
| 2631   __ bind(&done); | 2645   __ bind(&done); | 
| 2632 | 2646 | 
| 2633   context()->Plug(rax); | 2647   context()->Plug(rax); | 
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3072 } | 3086 } | 
| 3073 | 3087 | 
| 3074 | 3088 | 
| 3075 void FullCodeGenerator::EmitGetFromCache(ZoneList<Expression*>* args) { | 3089 void FullCodeGenerator::EmitGetFromCache(ZoneList<Expression*>* args) { | 
| 3076   ASSERT_EQ(2, args->length()); | 3090   ASSERT_EQ(2, args->length()); | 
| 3077 | 3091 | 
| 3078   ASSERT_NE(NULL, args->at(0)->AsLiteral()); | 3092   ASSERT_NE(NULL, args->at(0)->AsLiteral()); | 
| 3079   int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->handle()))->value(); | 3093   int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->handle()))->value(); | 
| 3080 | 3094 | 
| 3081   Handle<FixedArray> jsfunction_result_caches( | 3095   Handle<FixedArray> jsfunction_result_caches( | 
| 3082       Top::global_context()->jsfunction_result_caches()); | 3096       isolate()->global_context()->jsfunction_result_caches()); | 
| 3083   if (jsfunction_result_caches->length() <= cache_id) { | 3097   if (jsfunction_result_caches->length() <= cache_id) { | 
| 3084     __ Abort("Attempt to use undefined cache."); | 3098     __ Abort("Attempt to use undefined cache."); | 
| 3085     __ LoadRoot(rax, Heap::kUndefinedValueRootIndex); | 3099     __ LoadRoot(rax, Heap::kUndefinedValueRootIndex); | 
| 3086     context()->Plug(rax); | 3100     context()->Plug(rax); | 
| 3087     return; | 3101     return; | 
| 3088   } | 3102   } | 
| 3089 | 3103 | 
| 3090   VisitForAccumulatorValue(args->at(1)); | 3104   VisitForAccumulatorValue(args->at(1)); | 
| 3091 | 3105 | 
| 3092   Register key = rax; | 3106   Register key = rax; | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3149   __ movq(tmp, FieldOperand(left, HeapObject::kMapOffset)); | 3163   __ movq(tmp, FieldOperand(left, HeapObject::kMapOffset)); | 
| 3150   __ cmpb(FieldOperand(tmp, Map::kInstanceTypeOffset), | 3164   __ cmpb(FieldOperand(tmp, Map::kInstanceTypeOffset), | 
| 3151           Immediate(JS_REGEXP_TYPE)); | 3165           Immediate(JS_REGEXP_TYPE)); | 
| 3152   __ j(not_equal, &fail); | 3166   __ j(not_equal, &fail); | 
| 3153   __ cmpq(tmp, FieldOperand(right, HeapObject::kMapOffset)); | 3167   __ cmpq(tmp, FieldOperand(right, HeapObject::kMapOffset)); | 
| 3154   __ j(not_equal, &fail); | 3168   __ j(not_equal, &fail); | 
| 3155   __ movq(tmp, FieldOperand(left, JSRegExp::kDataOffset)); | 3169   __ movq(tmp, FieldOperand(left, JSRegExp::kDataOffset)); | 
| 3156   __ cmpq(tmp, FieldOperand(right, JSRegExp::kDataOffset)); | 3170   __ cmpq(tmp, FieldOperand(right, JSRegExp::kDataOffset)); | 
| 3157   __ j(equal, &ok); | 3171   __ j(equal, &ok); | 
| 3158   __ bind(&fail); | 3172   __ bind(&fail); | 
| 3159   __ Move(rax, Factory::false_value()); | 3173   __ Move(rax, isolate()->factory()->false_value()); | 
| 3160   __ jmp(&done); | 3174   __ jmp(&done); | 
| 3161   __ bind(&ok); | 3175   __ bind(&ok); | 
| 3162   __ Move(rax, Factory::true_value()); | 3176   __ Move(rax, isolate()->factory()->true_value()); | 
| 3163   __ bind(&done); | 3177   __ bind(&done); | 
| 3164 | 3178 | 
| 3165   context()->Plug(rax); | 3179   context()->Plug(rax); | 
| 3166 } | 3180 } | 
| 3167 | 3181 | 
| 3168 | 3182 | 
| 3169 void FullCodeGenerator::EmitHasCachedArrayIndex(ZoneList<Expression*>* args) { | 3183 void FullCodeGenerator::EmitHasCachedArrayIndex(ZoneList<Expression*>* args) { | 
| 3170   ASSERT(args->length() == 1); | 3184   ASSERT(args->length() == 1); | 
| 3171 | 3185 | 
| 3172   VisitForAccumulatorValue(args->at(0)); | 3186   VisitForAccumulatorValue(args->at(0)); | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3229   // Push the arguments ("left-to-right"). | 3243   // Push the arguments ("left-to-right"). | 
| 3230   int arg_count = args->length(); | 3244   int arg_count = args->length(); | 
| 3231   for (int i = 0; i < arg_count; i++) { | 3245   for (int i = 0; i < arg_count; i++) { | 
| 3232     VisitForStackValue(args->at(i)); | 3246     VisitForStackValue(args->at(i)); | 
| 3233   } | 3247   } | 
| 3234 | 3248 | 
| 3235   if (expr->is_jsruntime()) { | 3249   if (expr->is_jsruntime()) { | 
| 3236     // Call the JS runtime function using a call IC. | 3250     // Call the JS runtime function using a call IC. | 
| 3237     __ Move(rcx, expr->name()); | 3251     __ Move(rcx, expr->name()); | 
| 3238     InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 3252     InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 
| 3239     Handle<Code> ic = StubCache::ComputeCallInitialize(arg_count, in_loop); | 3253     Handle<Code> ic = | 
|  | 3254         ISOLATE->stub_cache()->ComputeCallInitialize(arg_count, in_loop); | 
| 3240     EmitCallIC(ic, RelocInfo::CODE_TARGET); | 3255     EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 3241     // Restore context register. | 3256     // Restore context register. | 
| 3242     __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 3257     __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 
| 3243   } else { | 3258   } else { | 
| 3244     __ CallRuntime(expr->function(), arg_count); | 3259     __ CallRuntime(expr->function(), arg_count); | 
| 3245   } | 3260   } | 
| 3246   context()->Plug(rax); | 3261   context()->Plug(rax); | 
| 3247 } | 3262 } | 
| 3248 | 3263 | 
| 3249 | 3264 | 
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3541         // Perform the assignment as if via '='. | 3556         // Perform the assignment as if via '='. | 
| 3542         EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 3557         EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 
| 3543                                Token::ASSIGN); | 3558                                Token::ASSIGN); | 
| 3544         PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 3559         PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
| 3545         context()->Plug(rax); | 3560         context()->Plug(rax); | 
| 3546       } | 3561       } | 
| 3547       break; | 3562       break; | 
| 3548     case NAMED_PROPERTY: { | 3563     case NAMED_PROPERTY: { | 
| 3549       __ Move(rcx, prop->key()->AsLiteral()->handle()); | 3564       __ Move(rcx, prop->key()->AsLiteral()->handle()); | 
| 3550       __ pop(rdx); | 3565       __ pop(rdx); | 
| 3551       Handle<Code> ic(Builtins::builtin( | 3566       Handle<Code> ic(isolate()->builtins()->builtin( | 
| 3552           is_strict_mode() ? Builtins::StoreIC_Initialize_Strict | 3567           is_strict_mode() ? Builtins::StoreIC_Initialize_Strict | 
| 3553                            : Builtins::StoreIC_Initialize)); | 3568                            : Builtins::StoreIC_Initialize)); | 
| 3554       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 3569       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 3555       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 3570       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
| 3556       if (expr->is_postfix()) { | 3571       if (expr->is_postfix()) { | 
| 3557         if (!context()->IsEffect()) { | 3572         if (!context()->IsEffect()) { | 
| 3558           context()->PlugTOS(); | 3573           context()->PlugTOS(); | 
| 3559         } | 3574         } | 
| 3560       } else { | 3575       } else { | 
| 3561         context()->Plug(rax); | 3576         context()->Plug(rax); | 
| 3562       } | 3577       } | 
| 3563       break; | 3578       break; | 
| 3564     } | 3579     } | 
| 3565     case KEYED_PROPERTY: { | 3580     case KEYED_PROPERTY: { | 
| 3566       __ pop(rcx); | 3581       __ pop(rcx); | 
| 3567       __ pop(rdx); | 3582       __ pop(rdx); | 
| 3568       Handle<Code> ic(Builtins::builtin( | 3583       Handle<Code> ic(isolate()->builtins()->builtin( | 
| 3569           is_strict_mode() ? Builtins::KeyedStoreIC_Initialize_Strict | 3584           is_strict_mode() ? Builtins::KeyedStoreIC_Initialize_Strict | 
| 3570                            : Builtins::KeyedStoreIC_Initialize)); | 3585                            : Builtins::KeyedStoreIC_Initialize)); | 
| 3571       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 3586       EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 3572       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 3587       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
| 3573       if (expr->is_postfix()) { | 3588       if (expr->is_postfix()) { | 
| 3574         if (!context()->IsEffect()) { | 3589         if (!context()->IsEffect()) { | 
| 3575           context()->PlugTOS(); | 3590           context()->PlugTOS(); | 
| 3576         } | 3591         } | 
| 3577       } else { | 3592       } else { | 
| 3578         context()->Plug(rax); | 3593         context()->Plug(rax); | 
| 3579       } | 3594       } | 
| 3580       break; | 3595       break; | 
| 3581     } | 3596     } | 
| 3582   } | 3597   } | 
| 3583 } | 3598 } | 
| 3584 | 3599 | 
| 3585 | 3600 | 
| 3586 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { | 3601 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { | 
| 3587   VariableProxy* proxy = expr->AsVariableProxy(); | 3602   VariableProxy* proxy = expr->AsVariableProxy(); | 
| 3588   ASSERT(!context()->IsEffect()); | 3603   ASSERT(!context()->IsEffect()); | 
| 3589   ASSERT(!context()->IsTest()); | 3604   ASSERT(!context()->IsTest()); | 
| 3590 | 3605 | 
| 3591   if (proxy != NULL && !proxy->var()->is_this() && proxy->var()->is_global()) { | 3606   if (proxy != NULL && !proxy->var()->is_this() && proxy->var()->is_global()) { | 
| 3592     Comment cmnt(masm_, "Global variable"); | 3607     Comment cmnt(masm_, "Global variable"); | 
| 3593     __ Move(rcx, proxy->name()); | 3608     __ Move(rcx, proxy->name()); | 
| 3594     __ movq(rax, GlobalObjectOperand()); | 3609     __ movq(rax, GlobalObjectOperand()); | 
| 3595     Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); | 3610     Handle<Code> ic(isolate()->builtins()->builtin( | 
|  | 3611         Builtins::LoadIC_Initialize)); | 
| 3596     // Use a regular load, not a contextual load, to avoid a reference | 3612     // Use a regular load, not a contextual load, to avoid a reference | 
| 3597     // error. | 3613     // error. | 
| 3598     EmitCallIC(ic, RelocInfo::CODE_TARGET); | 3614     EmitCallIC(ic, RelocInfo::CODE_TARGET); | 
| 3599     PrepareForBailout(expr, TOS_REG); | 3615     PrepareForBailout(expr, TOS_REG); | 
| 3600     context()->Plug(rax); | 3616     context()->Plug(rax); | 
| 3601   } else if (proxy != NULL && | 3617   } else if (proxy != NULL && | 
| 3602              proxy->var()->AsSlot() != NULL && | 3618              proxy->var()->AsSlot() != NULL && | 
| 3603              proxy->var()->AsSlot()->type() == Slot::LOOKUP) { | 3619              proxy->var()->AsSlot()->type() == Slot::LOOKUP) { | 
| 3604     Label done, slow; | 3620     Label done, slow; | 
| 3605 | 3621 | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3638   if (!right_literal_value->IsString()) return false; | 3654   if (!right_literal_value->IsString()) return false; | 
| 3639   UnaryOperation* left_unary = left->AsUnaryOperation(); | 3655   UnaryOperation* left_unary = left->AsUnaryOperation(); | 
| 3640   if (left_unary == NULL || left_unary->op() != Token::TYPEOF) return false; | 3656   if (left_unary == NULL || left_unary->op() != Token::TYPEOF) return false; | 
| 3641   Handle<String> check = Handle<String>::cast(right_literal_value); | 3657   Handle<String> check = Handle<String>::cast(right_literal_value); | 
| 3642 | 3658 | 
| 3643   { AccumulatorValueContext context(this); | 3659   { AccumulatorValueContext context(this); | 
| 3644     VisitForTypeofValue(left_unary->expression()); | 3660     VisitForTypeofValue(left_unary->expression()); | 
| 3645   } | 3661   } | 
| 3646   PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false); | 3662   PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false); | 
| 3647 | 3663 | 
| 3648   if (check->Equals(Heap::number_symbol())) { | 3664   if (check->Equals(isolate()->heap()->number_symbol())) { | 
| 3649     __ JumpIfSmi(rax, if_true); | 3665     __ JumpIfSmi(rax, if_true); | 
| 3650     __ movq(rax, FieldOperand(rax, HeapObject::kMapOffset)); | 3666     __ movq(rax, FieldOperand(rax, HeapObject::kMapOffset)); | 
| 3651     __ CompareRoot(rax, Heap::kHeapNumberMapRootIndex); | 3667     __ CompareRoot(rax, Heap::kHeapNumberMapRootIndex); | 
| 3652     Split(equal, if_true, if_false, fall_through); | 3668     Split(equal, if_true, if_false, fall_through); | 
| 3653   } else if (check->Equals(Heap::string_symbol())) { | 3669   } else if (check->Equals(isolate()->heap()->string_symbol())) { | 
| 3654     __ JumpIfSmi(rax, if_false); | 3670     __ JumpIfSmi(rax, if_false); | 
| 3655     // Check for undetectable objects => false. | 3671     // Check for undetectable objects => false. | 
| 3656     __ CmpObjectType(rax, FIRST_NONSTRING_TYPE, rdx); | 3672     __ CmpObjectType(rax, FIRST_NONSTRING_TYPE, rdx); | 
| 3657     __ j(above_equal, if_false); | 3673     __ j(above_equal, if_false); | 
| 3658     __ testb(FieldOperand(rdx, Map::kBitFieldOffset), | 3674     __ testb(FieldOperand(rdx, Map::kBitFieldOffset), | 
| 3659              Immediate(1 << Map::kIsUndetectable)); | 3675              Immediate(1 << Map::kIsUndetectable)); | 
| 3660     Split(zero, if_true, if_false, fall_through); | 3676     Split(zero, if_true, if_false, fall_through); | 
| 3661   } else if (check->Equals(Heap::boolean_symbol())) { | 3677   } else if (check->Equals(isolate()->heap()->boolean_symbol())) { | 
| 3662     __ CompareRoot(rax, Heap::kTrueValueRootIndex); | 3678     __ CompareRoot(rax, Heap::kTrueValueRootIndex); | 
| 3663     __ j(equal, if_true); | 3679     __ j(equal, if_true); | 
| 3664     __ CompareRoot(rax, Heap::kFalseValueRootIndex); | 3680     __ CompareRoot(rax, Heap::kFalseValueRootIndex); | 
| 3665     Split(equal, if_true, if_false, fall_through); | 3681     Split(equal, if_true, if_false, fall_through); | 
| 3666   } else if (check->Equals(Heap::undefined_symbol())) { | 3682   } else if (check->Equals(isolate()->heap()->undefined_symbol())) { | 
| 3667     __ CompareRoot(rax, Heap::kUndefinedValueRootIndex); | 3683     __ CompareRoot(rax, Heap::kUndefinedValueRootIndex); | 
| 3668     __ j(equal, if_true); | 3684     __ j(equal, if_true); | 
| 3669     __ JumpIfSmi(rax, if_false); | 3685     __ JumpIfSmi(rax, if_false); | 
| 3670     // Check for undetectable objects => true. | 3686     // Check for undetectable objects => true. | 
| 3671     __ movq(rdx, FieldOperand(rax, HeapObject::kMapOffset)); | 3687     __ movq(rdx, FieldOperand(rax, HeapObject::kMapOffset)); | 
| 3672     __ testb(FieldOperand(rdx, Map::kBitFieldOffset), | 3688     __ testb(FieldOperand(rdx, Map::kBitFieldOffset), | 
| 3673              Immediate(1 << Map::kIsUndetectable)); | 3689              Immediate(1 << Map::kIsUndetectable)); | 
| 3674     Split(not_zero, if_true, if_false, fall_through); | 3690     Split(not_zero, if_true, if_false, fall_through); | 
| 3675   } else if (check->Equals(Heap::function_symbol())) { | 3691   } else if (check->Equals(isolate()->heap()->function_symbol())) { | 
| 3676     __ JumpIfSmi(rax, if_false); | 3692     __ JumpIfSmi(rax, if_false); | 
| 3677     __ CmpObjectType(rax, FIRST_FUNCTION_CLASS_TYPE, rdx); | 3693     __ CmpObjectType(rax, FIRST_FUNCTION_CLASS_TYPE, rdx); | 
| 3678     Split(above_equal, if_true, if_false, fall_through); | 3694     Split(above_equal, if_true, if_false, fall_through); | 
| 3679   } else if (check->Equals(Heap::object_symbol())) { | 3695   } else if (check->Equals(isolate()->heap()->object_symbol())) { | 
| 3680     __ JumpIfSmi(rax, if_false); | 3696     __ JumpIfSmi(rax, if_false); | 
| 3681     __ CompareRoot(rax, Heap::kNullValueRootIndex); | 3697     __ CompareRoot(rax, Heap::kNullValueRootIndex); | 
| 3682     __ j(equal, if_true); | 3698     __ j(equal, if_true); | 
| 3683     __ CmpObjectType(rax, FIRST_JS_OBJECT_TYPE, rdx); | 3699     __ CmpObjectType(rax, FIRST_JS_OBJECT_TYPE, rdx); | 
| 3684     __ j(below, if_false); | 3700     __ j(below, if_false); | 
| 3685     __ CmpInstanceType(rdx, FIRST_FUNCTION_CLASS_TYPE); | 3701     __ CmpInstanceType(rdx, FIRST_FUNCTION_CLASS_TYPE); | 
| 3686     __ j(above_equal, if_false); | 3702     __ j(above_equal, if_false); | 
| 3687     // Check for undetectable objects => false. | 3703     // Check for undetectable objects => false. | 
| 3688     __ testb(FieldOperand(rdx, Map::kBitFieldOffset), | 3704     __ testb(FieldOperand(rdx, Map::kBitFieldOffset), | 
| 3689              Immediate(1 << Map::kIsUndetectable)); | 3705              Immediate(1 << Map::kIsUndetectable)); | 
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3851 Register FullCodeGenerator::context_register() { | 3867 Register FullCodeGenerator::context_register() { | 
| 3852   return rsi; | 3868   return rsi; | 
| 3853 } | 3869 } | 
| 3854 | 3870 | 
| 3855 | 3871 | 
| 3856 void FullCodeGenerator::EmitCallIC(Handle<Code> ic, RelocInfo::Mode mode) { | 3872 void FullCodeGenerator::EmitCallIC(Handle<Code> ic, RelocInfo::Mode mode) { | 
| 3857   ASSERT(mode == RelocInfo::CODE_TARGET || | 3873   ASSERT(mode == RelocInfo::CODE_TARGET || | 
| 3858          mode == RelocInfo::CODE_TARGET_CONTEXT); | 3874          mode == RelocInfo::CODE_TARGET_CONTEXT); | 
| 3859   switch (ic->kind()) { | 3875   switch (ic->kind()) { | 
| 3860     case Code::LOAD_IC: | 3876     case Code::LOAD_IC: | 
| 3861       __ IncrementCounter(&Counters::named_load_full, 1); | 3877       __ IncrementCounter(COUNTERS->named_load_full(), 1); | 
| 3862       break; | 3878       break; | 
| 3863     case Code::KEYED_LOAD_IC: | 3879     case Code::KEYED_LOAD_IC: | 
| 3864       __ IncrementCounter(&Counters::keyed_load_full, 1); | 3880       __ IncrementCounter(COUNTERS->keyed_load_full(), 1); | 
| 3865       break; | 3881       break; | 
| 3866     case Code::STORE_IC: | 3882     case Code::STORE_IC: | 
| 3867       __ IncrementCounter(&Counters::named_store_full, 1); | 3883       __ IncrementCounter(COUNTERS->named_store_full(), 1); | 
| 3868       break; | 3884       break; | 
| 3869     case Code::KEYED_STORE_IC: | 3885     case Code::KEYED_STORE_IC: | 
| 3870       __ IncrementCounter(&Counters::keyed_store_full, 1); | 3886       __ IncrementCounter(COUNTERS->keyed_store_full(), 1); | 
| 3871     default: | 3887     default: | 
| 3872       break; | 3888       break; | 
| 3873   } | 3889   } | 
| 3874 | 3890 | 
| 3875   __ call(ic, mode); | 3891   __ call(ic, mode); | 
| 3876 | 3892 | 
| 3877   // Crankshaft doesn't need patching of inlined loads and stores. | 3893   // Crankshaft doesn't need patching of inlined loads and stores. | 
| 3878   // When compiling the snapshot we need to produce code that works | 3894   // When compiling the snapshot we need to produce code that works | 
| 3879   // with and without Crankshaft. | 3895   // with and without Crankshaft. | 
| 3880   if (V8::UseCrankshaft() && !Serializer::enabled()) { | 3896   if (V8::UseCrankshaft() && !Serializer::enabled()) { | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 3894     default: | 3910     default: | 
| 3895       // Do nothing. | 3911       // Do nothing. | 
| 3896       break; | 3912       break; | 
| 3897   } | 3913   } | 
| 3898 } | 3914 } | 
| 3899 | 3915 | 
| 3900 | 3916 | 
| 3901 void FullCodeGenerator::EmitCallIC(Handle<Code> ic, JumpPatchSite* patch_site) { | 3917 void FullCodeGenerator::EmitCallIC(Handle<Code> ic, JumpPatchSite* patch_site) { | 
| 3902   switch (ic->kind()) { | 3918   switch (ic->kind()) { | 
| 3903     case Code::LOAD_IC: | 3919     case Code::LOAD_IC: | 
| 3904       __ IncrementCounter(&Counters::named_load_full, 1); | 3920       __ IncrementCounter(COUNTERS->named_load_full(), 1); | 
| 3905       break; | 3921       break; | 
| 3906     case Code::KEYED_LOAD_IC: | 3922     case Code::KEYED_LOAD_IC: | 
| 3907       __ IncrementCounter(&Counters::keyed_load_full, 1); | 3923       __ IncrementCounter(COUNTERS->keyed_load_full(), 1); | 
| 3908       break; | 3924       break; | 
| 3909     case Code::STORE_IC: | 3925     case Code::STORE_IC: | 
| 3910       __ IncrementCounter(&Counters::named_store_full, 1); | 3926       __ IncrementCounter(COUNTERS->named_store_full(), 1); | 
| 3911       break; | 3927       break; | 
| 3912     case Code::KEYED_STORE_IC: | 3928     case Code::KEYED_STORE_IC: | 
| 3913       __ IncrementCounter(&Counters::keyed_store_full, 1); | 3929       __ IncrementCounter(COUNTERS->keyed_store_full(), 1); | 
| 3914     default: | 3930     default: | 
| 3915       break; | 3931       break; | 
| 3916   } | 3932   } | 
| 3917 | 3933 | 
| 3918   __ call(ic, RelocInfo::CODE_TARGET); | 3934   __ call(ic, RelocInfo::CODE_TARGET); | 
| 3919   if (patch_site != NULL && patch_site->is_bound()) { | 3935   if (patch_site != NULL && patch_site->is_bound()) { | 
| 3920     patch_site->EmitPatchInfo(); | 3936     patch_site->EmitPatchInfo(); | 
| 3921   } else { | 3937   } else { | 
| 3922     __ nop();  // Signals no inlined code. | 3938     __ nop();  // Signals no inlined code. | 
| 3923   } | 3939   } | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3968   __ ret(0); | 3984   __ ret(0); | 
| 3969 } | 3985 } | 
| 3970 | 3986 | 
| 3971 | 3987 | 
| 3972 #undef __ | 3988 #undef __ | 
| 3973 | 3989 | 
| 3974 | 3990 | 
| 3975 } }  // namespace v8::internal | 3991 } }  // namespace v8::internal | 
| 3976 | 3992 | 
| 3977 #endif  // V8_TARGET_ARCH_X64 | 3993 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW | 
|---|