| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 __ push(rax); // Save result on the stack | 1656 __ push(rax); // Save result on the stack |
| 1657 result_saved = true; | 1657 result_saved = true; |
| 1658 } | 1658 } |
| 1659 switch (property->kind()) { | 1659 switch (property->kind()) { |
| 1660 case ObjectLiteral::Property::CONSTANT: | 1660 case ObjectLiteral::Property::CONSTANT: |
| 1661 UNREACHABLE(); | 1661 UNREACHABLE(); |
| 1662 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1662 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 1663 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); | 1663 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); |
| 1664 // Fall through. | 1664 // Fall through. |
| 1665 case ObjectLiteral::Property::COMPUTED: | 1665 case ObjectLiteral::Property::COMPUTED: |
| 1666 if (key->handle()->IsInternalizedString()) { | 1666 if (key->value()->IsInternalizedString()) { |
| 1667 if (property->emit_store()) { | 1667 if (property->emit_store()) { |
| 1668 VisitForAccumulatorValue(value); | 1668 VisitForAccumulatorValue(value); |
| 1669 __ Move(rcx, key->handle()); | 1669 __ Move(rcx, key->value()); |
| 1670 __ movq(rdx, Operand(rsp, 0)); | 1670 __ movq(rdx, Operand(rsp, 0)); |
| 1671 Handle<Code> ic = is_classic_mode() | 1671 Handle<Code> ic = is_classic_mode() |
| 1672 ? isolate()->builtins()->StoreIC_Initialize() | 1672 ? isolate()->builtins()->StoreIC_Initialize() |
| 1673 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 1673 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
| 1674 CallIC(ic, RelocInfo::CODE_TARGET, key->LiteralFeedbackId()); | 1674 CallIC(ic, RelocInfo::CODE_TARGET, key->LiteralFeedbackId()); |
| 1675 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1675 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
| 1676 } else { | 1676 } else { |
| 1677 VisitForEffect(value); | 1677 VisitForEffect(value); |
| 1678 } | 1678 } |
| 1679 break; | 1679 break; |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2240 // Only the value field needs a write barrier, as the other values are in the | 2240 // Only the value field needs a write barrier, as the other values are in the |
| 2241 // root set. | 2241 // root set. |
| 2242 __ RecordWriteField(rax, JSGeneratorObject::kResultValuePropertyOffset, | 2242 __ RecordWriteField(rax, JSGeneratorObject::kResultValuePropertyOffset, |
| 2243 rcx, rdx, kDontSaveFPRegs); | 2243 rcx, rdx, kDontSaveFPRegs); |
| 2244 } | 2244 } |
| 2245 | 2245 |
| 2246 | 2246 |
| 2247 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 2247 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { |
| 2248 SetSourcePosition(prop->position()); | 2248 SetSourcePosition(prop->position()); |
| 2249 Literal* key = prop->key()->AsLiteral(); | 2249 Literal* key = prop->key()->AsLiteral(); |
| 2250 __ Move(rcx, key->handle()); | 2250 __ Move(rcx, key->value()); |
| 2251 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); | 2251 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); |
| 2252 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); | 2252 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); |
| 2253 } | 2253 } |
| 2254 | 2254 |
| 2255 | 2255 |
| 2256 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 2256 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { |
| 2257 SetSourcePosition(prop->position()); | 2257 SetSourcePosition(prop->position()); |
| 2258 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); | 2258 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); |
| 2259 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); | 2259 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); |
| 2260 } | 2260 } |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2359 Variable* var = expr->AsVariableProxy()->var(); | 2359 Variable* var = expr->AsVariableProxy()->var(); |
| 2360 EffectContext context(this); | 2360 EffectContext context(this); |
| 2361 EmitVariableAssignment(var, Token::ASSIGN); | 2361 EmitVariableAssignment(var, Token::ASSIGN); |
| 2362 break; | 2362 break; |
| 2363 } | 2363 } |
| 2364 case NAMED_PROPERTY: { | 2364 case NAMED_PROPERTY: { |
| 2365 __ push(rax); // Preserve value. | 2365 __ push(rax); // Preserve value. |
| 2366 VisitForAccumulatorValue(prop->obj()); | 2366 VisitForAccumulatorValue(prop->obj()); |
| 2367 __ movq(rdx, rax); | 2367 __ movq(rdx, rax); |
| 2368 __ pop(rax); // Restore value. | 2368 __ pop(rax); // Restore value. |
| 2369 __ Move(rcx, prop->key()->AsLiteral()->handle()); | 2369 __ Move(rcx, prop->key()->AsLiteral()->value()); |
| 2370 Handle<Code> ic = is_classic_mode() | 2370 Handle<Code> ic = is_classic_mode() |
| 2371 ? isolate()->builtins()->StoreIC_Initialize() | 2371 ? isolate()->builtins()->StoreIC_Initialize() |
| 2372 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 2372 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
| 2373 CallIC(ic); | 2373 CallIC(ic); |
| 2374 break; | 2374 break; |
| 2375 } | 2375 } |
| 2376 case KEYED_PROPERTY: { | 2376 case KEYED_PROPERTY: { |
| 2377 __ push(rax); // Preserve value. | 2377 __ push(rax); // Preserve value. |
| 2378 VisitForStackValue(prop->obj()); | 2378 VisitForStackValue(prop->obj()); |
| 2379 VisitForAccumulatorValue(prop->key()); | 2379 VisitForAccumulatorValue(prop->key()); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2482 | 2482 |
| 2483 | 2483 |
| 2484 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { | 2484 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
| 2485 // Assignment to a property, using a named store IC. | 2485 // Assignment to a property, using a named store IC. |
| 2486 Property* prop = expr->target()->AsProperty(); | 2486 Property* prop = expr->target()->AsProperty(); |
| 2487 ASSERT(prop != NULL); | 2487 ASSERT(prop != NULL); |
| 2488 ASSERT(prop->key()->AsLiteral() != NULL); | 2488 ASSERT(prop->key()->AsLiteral() != NULL); |
| 2489 | 2489 |
| 2490 // Record source code position before IC call. | 2490 // Record source code position before IC call. |
| 2491 SetSourcePosition(expr->position()); | 2491 SetSourcePosition(expr->position()); |
| 2492 __ Move(rcx, prop->key()->AsLiteral()->handle()); | 2492 __ Move(rcx, prop->key()->AsLiteral()->value()); |
| 2493 __ pop(rdx); | 2493 __ pop(rdx); |
| 2494 Handle<Code> ic = is_classic_mode() | 2494 Handle<Code> ic = is_classic_mode() |
| 2495 ? isolate()->builtins()->StoreIC_Initialize() | 2495 ? isolate()->builtins()->StoreIC_Initialize() |
| 2496 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 2496 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
| 2497 CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId()); | 2497 CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId()); |
| 2498 | 2498 |
| 2499 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2499 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2500 context()->Plug(rax); | 2500 context()->Plug(rax); |
| 2501 } | 2501 } |
| 2502 | 2502 |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2742 // The receiver is either the global receiver or an object found by | 2742 // The receiver is either the global receiver or an object found by |
| 2743 // LoadContextSlot. That object could be the hole if the receiver is | 2743 // LoadContextSlot. That object could be the hole if the receiver is |
| 2744 // implicitly the global object. | 2744 // implicitly the global object. |
| 2745 EmitCallWithStub(expr, RECEIVER_MIGHT_BE_IMPLICIT); | 2745 EmitCallWithStub(expr, RECEIVER_MIGHT_BE_IMPLICIT); |
| 2746 } else if (property != NULL) { | 2746 } else if (property != NULL) { |
| 2747 { PreservePositionScope scope(masm()->positions_recorder()); | 2747 { PreservePositionScope scope(masm()->positions_recorder()); |
| 2748 VisitForStackValue(property->obj()); | 2748 VisitForStackValue(property->obj()); |
| 2749 } | 2749 } |
| 2750 if (property->key()->IsPropertyName()) { | 2750 if (property->key()->IsPropertyName()) { |
| 2751 EmitCallWithIC(expr, | 2751 EmitCallWithIC(expr, |
| 2752 property->key()->AsLiteral()->handle(), | 2752 property->key()->AsLiteral()->value(), |
| 2753 RelocInfo::CODE_TARGET); | 2753 RelocInfo::CODE_TARGET); |
| 2754 } else { | 2754 } else { |
| 2755 EmitKeyedCallWithIC(expr, property->key()); | 2755 EmitKeyedCallWithIC(expr, property->key()); |
| 2756 } | 2756 } |
| 2757 } else { | 2757 } else { |
| 2758 // Call to an arbitrary expression not handled specially above. | 2758 // Call to an arbitrary expression not handled specially above. |
| 2759 { PreservePositionScope scope(masm()->positions_recorder()); | 2759 { PreservePositionScope scope(masm()->positions_recorder()); |
| 2760 VisitForStackValue(callee); | 2760 VisitForStackValue(callee); |
| 2761 } | 2761 } |
| 2762 // Load global receiver object. | 2762 // Load global receiver object. |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3347 | 3347 |
| 3348 __ bind(&done); | 3348 __ bind(&done); |
| 3349 context()->Plug(rax); | 3349 context()->Plug(rax); |
| 3350 } | 3350 } |
| 3351 | 3351 |
| 3352 | 3352 |
| 3353 void FullCodeGenerator::EmitDateField(CallRuntime* expr) { | 3353 void FullCodeGenerator::EmitDateField(CallRuntime* expr) { |
| 3354 ZoneList<Expression*>* args = expr->arguments(); | 3354 ZoneList<Expression*>* args = expr->arguments(); |
| 3355 ASSERT(args->length() == 2); | 3355 ASSERT(args->length() == 2); |
| 3356 ASSERT_NE(NULL, args->at(1)->AsLiteral()); | 3356 ASSERT_NE(NULL, args->at(1)->AsLiteral()); |
| 3357 Smi* index = Smi::cast(*(args->at(1)->AsLiteral()->handle())); | 3357 Smi* index = Smi::cast(*(args->at(1)->AsLiteral()->value())); |
| 3358 | 3358 |
| 3359 VisitForAccumulatorValue(args->at(0)); // Load the object. | 3359 VisitForAccumulatorValue(args->at(0)); // Load the object. |
| 3360 | 3360 |
| 3361 Label runtime, done, not_date_object; | 3361 Label runtime, done, not_date_object; |
| 3362 Register object = rax; | 3362 Register object = rax; |
| 3363 Register result = rax; | 3363 Register result = rax; |
| 3364 Register scratch = rcx; | 3364 Register scratch = rcx; |
| 3365 | 3365 |
| 3366 __ JumpIfSmi(object, ¬_date_object); | 3366 __ JumpIfSmi(object, ¬_date_object); |
| 3367 __ CmpObjectType(object, JS_DATE_TYPE, scratch); | 3367 __ CmpObjectType(object, JS_DATE_TYPE, scratch); |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3768 __ CallStub(&stub); | 3768 __ CallStub(&stub); |
| 3769 context()->Plug(rax); | 3769 context()->Plug(rax); |
| 3770 } | 3770 } |
| 3771 | 3771 |
| 3772 | 3772 |
| 3773 void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) { | 3773 void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) { |
| 3774 ZoneList<Expression*>* args = expr->arguments(); | 3774 ZoneList<Expression*>* args = expr->arguments(); |
| 3775 ASSERT_EQ(2, args->length()); | 3775 ASSERT_EQ(2, args->length()); |
| 3776 | 3776 |
| 3777 ASSERT_NE(NULL, args->at(0)->AsLiteral()); | 3777 ASSERT_NE(NULL, args->at(0)->AsLiteral()); |
| 3778 int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->handle()))->value(); | 3778 int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->value()))->value(); |
| 3779 | 3779 |
| 3780 Handle<FixedArray> jsfunction_result_caches( | 3780 Handle<FixedArray> jsfunction_result_caches( |
| 3781 isolate()->native_context()->jsfunction_result_caches()); | 3781 isolate()->native_context()->jsfunction_result_caches()); |
| 3782 if (jsfunction_result_caches->length() <= cache_id) { | 3782 if (jsfunction_result_caches->length() <= cache_id) { |
| 3783 __ Abort("Attempt to use undefined cache."); | 3783 __ Abort("Attempt to use undefined cache."); |
| 3784 __ LoadRoot(rax, Heap::kUndefinedValueRootIndex); | 3784 __ LoadRoot(rax, Heap::kUndefinedValueRootIndex); |
| 3785 context()->Plug(rax); | 3785 context()->Plug(rax); |
| 3786 return; | 3786 return; |
| 3787 } | 3787 } |
| 3788 | 3788 |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4506 } | 4506 } |
| 4507 } else { | 4507 } else { |
| 4508 // Perform the assignment as if via '='. | 4508 // Perform the assignment as if via '='. |
| 4509 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4509 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
| 4510 Token::ASSIGN); | 4510 Token::ASSIGN); |
| 4511 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4511 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4512 context()->Plug(rax); | 4512 context()->Plug(rax); |
| 4513 } | 4513 } |
| 4514 break; | 4514 break; |
| 4515 case NAMED_PROPERTY: { | 4515 case NAMED_PROPERTY: { |
| 4516 __ Move(rcx, prop->key()->AsLiteral()->handle()); | 4516 __ Move(rcx, prop->key()->AsLiteral()->value()); |
| 4517 __ pop(rdx); | 4517 __ pop(rdx); |
| 4518 Handle<Code> ic = is_classic_mode() | 4518 Handle<Code> ic = is_classic_mode() |
| 4519 ? isolate()->builtins()->StoreIC_Initialize() | 4519 ? isolate()->builtins()->StoreIC_Initialize() |
| 4520 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 4520 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
| 4521 CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId()); | 4521 CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId()); |
| 4522 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4522 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4523 if (expr->is_postfix()) { | 4523 if (expr->is_postfix()) { |
| 4524 if (!context()->IsEffect()) { | 4524 if (!context()->IsEffect()) { |
| 4525 context()->PlugTOS(); | 4525 context()->PlugTOS(); |
| 4526 } | 4526 } |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4909 *context_length = 0; | 4909 *context_length = 0; |
| 4910 return previous_; | 4910 return previous_; |
| 4911 } | 4911 } |
| 4912 | 4912 |
| 4913 | 4913 |
| 4914 #undef __ | 4914 #undef __ |
| 4915 | 4915 |
| 4916 } } // namespace v8::internal | 4916 } } // namespace v8::internal |
| 4917 | 4917 |
| 4918 #endif // V8_TARGET_ARCH_X64 | 4918 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |