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 1621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 __ push(eax); // Save result on the stack | 1632 __ push(eax); // Save result on the stack |
1633 result_saved = true; | 1633 result_saved = true; |
1634 } | 1634 } |
1635 switch (property->kind()) { | 1635 switch (property->kind()) { |
1636 case ObjectLiteral::Property::CONSTANT: | 1636 case ObjectLiteral::Property::CONSTANT: |
1637 UNREACHABLE(); | 1637 UNREACHABLE(); |
1638 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1638 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
1639 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); | 1639 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); |
1640 // Fall through. | 1640 // Fall through. |
1641 case ObjectLiteral::Property::COMPUTED: | 1641 case ObjectLiteral::Property::COMPUTED: |
1642 if (key->handle()->IsInternalizedString()) { | 1642 if (key->value()->IsInternalizedString()) { |
1643 if (property->emit_store()) { | 1643 if (property->emit_store()) { |
1644 VisitForAccumulatorValue(value); | 1644 VisitForAccumulatorValue(value); |
1645 __ mov(ecx, Immediate(key->handle())); | 1645 __ mov(ecx, Immediate(key->value())); |
1646 __ mov(edx, Operand(esp, 0)); | 1646 __ mov(edx, Operand(esp, 0)); |
1647 Handle<Code> ic = is_classic_mode() | 1647 Handle<Code> ic = is_classic_mode() |
1648 ? isolate()->builtins()->StoreIC_Initialize() | 1648 ? isolate()->builtins()->StoreIC_Initialize() |
1649 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 1649 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
1650 CallIC(ic, RelocInfo::CODE_TARGET, key->LiteralFeedbackId()); | 1650 CallIC(ic, RelocInfo::CODE_TARGET, key->LiteralFeedbackId()); |
1651 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1651 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
1652 } else { | 1652 } else { |
1653 VisitForEffect(value); | 1653 VisitForEffect(value); |
1654 } | 1654 } |
1655 break; | 1655 break; |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2214 // Only the value field needs a write barrier, as the other values are in the | 2214 // Only the value field needs a write barrier, as the other values are in the |
2215 // root set. | 2215 // root set. |
2216 __ RecordWriteField(eax, JSGeneratorObject::kResultValuePropertyOffset, | 2216 __ RecordWriteField(eax, JSGeneratorObject::kResultValuePropertyOffset, |
2217 ecx, edx, kDontSaveFPRegs); | 2217 ecx, edx, kDontSaveFPRegs); |
2218 } | 2218 } |
2219 | 2219 |
2220 | 2220 |
2221 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 2221 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { |
2222 SetSourcePosition(prop->position()); | 2222 SetSourcePosition(prop->position()); |
2223 Literal* key = prop->key()->AsLiteral(); | 2223 Literal* key = prop->key()->AsLiteral(); |
2224 ASSERT(!key->handle()->IsSmi()); | 2224 ASSERT(!key->value()->IsSmi()); |
2225 __ mov(ecx, Immediate(key->handle())); | 2225 __ mov(ecx, Immediate(key->value())); |
2226 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); | 2226 Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); |
2227 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); | 2227 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); |
2228 } | 2228 } |
2229 | 2229 |
2230 | 2230 |
2231 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 2231 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { |
2232 SetSourcePosition(prop->position()); | 2232 SetSourcePosition(prop->position()); |
2233 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); | 2233 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); |
2234 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); | 2234 CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId()); |
2235 } | 2235 } |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2369 Variable* var = expr->AsVariableProxy()->var(); | 2369 Variable* var = expr->AsVariableProxy()->var(); |
2370 EffectContext context(this); | 2370 EffectContext context(this); |
2371 EmitVariableAssignment(var, Token::ASSIGN); | 2371 EmitVariableAssignment(var, Token::ASSIGN); |
2372 break; | 2372 break; |
2373 } | 2373 } |
2374 case NAMED_PROPERTY: { | 2374 case NAMED_PROPERTY: { |
2375 __ push(eax); // Preserve value. | 2375 __ push(eax); // Preserve value. |
2376 VisitForAccumulatorValue(prop->obj()); | 2376 VisitForAccumulatorValue(prop->obj()); |
2377 __ mov(edx, eax); | 2377 __ mov(edx, eax); |
2378 __ pop(eax); // Restore value. | 2378 __ pop(eax); // Restore value. |
2379 __ mov(ecx, prop->key()->AsLiteral()->handle()); | 2379 __ mov(ecx, prop->key()->AsLiteral()->value()); |
2380 Handle<Code> ic = is_classic_mode() | 2380 Handle<Code> ic = is_classic_mode() |
2381 ? isolate()->builtins()->StoreIC_Initialize() | 2381 ? isolate()->builtins()->StoreIC_Initialize() |
2382 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 2382 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
2383 CallIC(ic); | 2383 CallIC(ic); |
2384 break; | 2384 break; |
2385 } | 2385 } |
2386 case KEYED_PROPERTY: { | 2386 case KEYED_PROPERTY: { |
2387 __ push(eax); // Preserve value. | 2387 __ push(eax); // Preserve value. |
2388 VisitForStackValue(prop->obj()); | 2388 VisitForStackValue(prop->obj()); |
2389 VisitForAccumulatorValue(prop->key()); | 2389 VisitForAccumulatorValue(prop->key()); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2496 // Assignment to a property, using a named store IC. | 2496 // Assignment to a property, using a named store IC. |
2497 // eax : value | 2497 // eax : value |
2498 // esp[0] : receiver | 2498 // esp[0] : receiver |
2499 | 2499 |
2500 Property* prop = expr->target()->AsProperty(); | 2500 Property* prop = expr->target()->AsProperty(); |
2501 ASSERT(prop != NULL); | 2501 ASSERT(prop != NULL); |
2502 ASSERT(prop->key()->AsLiteral() != NULL); | 2502 ASSERT(prop->key()->AsLiteral() != NULL); |
2503 | 2503 |
2504 // Record source code position before IC call. | 2504 // Record source code position before IC call. |
2505 SetSourcePosition(expr->position()); | 2505 SetSourcePosition(expr->position()); |
2506 __ mov(ecx, prop->key()->AsLiteral()->handle()); | 2506 __ mov(ecx, prop->key()->AsLiteral()->value()); |
2507 __ pop(edx); | 2507 __ pop(edx); |
2508 Handle<Code> ic = is_classic_mode() | 2508 Handle<Code> ic = is_classic_mode() |
2509 ? isolate()->builtins()->StoreIC_Initialize() | 2509 ? isolate()->builtins()->StoreIC_Initialize() |
2510 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 2510 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
2511 CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId()); | 2511 CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId()); |
2512 | 2512 |
2513 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2513 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2514 context()->Plug(eax); | 2514 context()->Plug(eax); |
2515 } | 2515 } |
2516 | 2516 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2761 // LoadContextSlot. That object could be the hole if the receiver is | 2761 // LoadContextSlot. That object could be the hole if the receiver is |
2762 // implicitly the global object. | 2762 // implicitly the global object. |
2763 EmitCallWithStub(expr, RECEIVER_MIGHT_BE_IMPLICIT); | 2763 EmitCallWithStub(expr, RECEIVER_MIGHT_BE_IMPLICIT); |
2764 | 2764 |
2765 } else if (property != NULL) { | 2765 } else if (property != NULL) { |
2766 { PreservePositionScope scope(masm()->positions_recorder()); | 2766 { PreservePositionScope scope(masm()->positions_recorder()); |
2767 VisitForStackValue(property->obj()); | 2767 VisitForStackValue(property->obj()); |
2768 } | 2768 } |
2769 if (property->key()->IsPropertyName()) { | 2769 if (property->key()->IsPropertyName()) { |
2770 EmitCallWithIC(expr, | 2770 EmitCallWithIC(expr, |
2771 property->key()->AsLiteral()->handle(), | 2771 property->key()->AsLiteral()->value(), |
2772 RelocInfo::CODE_TARGET); | 2772 RelocInfo::CODE_TARGET); |
2773 } else { | 2773 } else { |
2774 EmitKeyedCallWithIC(expr, property->key()); | 2774 EmitKeyedCallWithIC(expr, property->key()); |
2775 } | 2775 } |
2776 | 2776 |
2777 } else { | 2777 } else { |
2778 // Call to an arbitrary expression not handled specially above. | 2778 // Call to an arbitrary expression not handled specially above. |
2779 { PreservePositionScope scope(masm()->positions_recorder()); | 2779 { PreservePositionScope scope(masm()->positions_recorder()); |
2780 VisitForStackValue(callee); | 2780 VisitForStackValue(callee); |
2781 } | 2781 } |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3379 | 3379 |
3380 __ bind(&done); | 3380 __ bind(&done); |
3381 context()->Plug(eax); | 3381 context()->Plug(eax); |
3382 } | 3382 } |
3383 | 3383 |
3384 | 3384 |
3385 void FullCodeGenerator::EmitDateField(CallRuntime* expr) { | 3385 void FullCodeGenerator::EmitDateField(CallRuntime* expr) { |
3386 ZoneList<Expression*>* args = expr->arguments(); | 3386 ZoneList<Expression*>* args = expr->arguments(); |
3387 ASSERT(args->length() == 2); | 3387 ASSERT(args->length() == 2); |
3388 ASSERT_NE(NULL, args->at(1)->AsLiteral()); | 3388 ASSERT_NE(NULL, args->at(1)->AsLiteral()); |
3389 Smi* index = Smi::cast(*(args->at(1)->AsLiteral()->handle())); | 3389 Smi* index = Smi::cast(*(args->at(1)->AsLiteral()->value())); |
3390 | 3390 |
3391 VisitForAccumulatorValue(args->at(0)); // Load the object. | 3391 VisitForAccumulatorValue(args->at(0)); // Load the object. |
3392 | 3392 |
3393 Label runtime, done, not_date_object; | 3393 Label runtime, done, not_date_object; |
3394 Register object = eax; | 3394 Register object = eax; |
3395 Register result = eax; | 3395 Register result = eax; |
3396 Register scratch = ecx; | 3396 Register scratch = ecx; |
3397 | 3397 |
3398 __ JumpIfSmi(object, ¬_date_object); | 3398 __ JumpIfSmi(object, ¬_date_object); |
3399 __ CmpObjectType(object, JS_DATE_TYPE, scratch); | 3399 __ CmpObjectType(object, JS_DATE_TYPE, scratch); |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3808 __ CallStub(&stub); | 3808 __ CallStub(&stub); |
3809 context()->Plug(eax); | 3809 context()->Plug(eax); |
3810 } | 3810 } |
3811 | 3811 |
3812 | 3812 |
3813 void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) { | 3813 void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) { |
3814 ZoneList<Expression*>* args = expr->arguments(); | 3814 ZoneList<Expression*>* args = expr->arguments(); |
3815 ASSERT_EQ(2, args->length()); | 3815 ASSERT_EQ(2, args->length()); |
3816 | 3816 |
3817 ASSERT_NE(NULL, args->at(0)->AsLiteral()); | 3817 ASSERT_NE(NULL, args->at(0)->AsLiteral()); |
3818 int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->handle()))->value(); | 3818 int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->value()))->value(); |
3819 | 3819 |
3820 Handle<FixedArray> jsfunction_result_caches( | 3820 Handle<FixedArray> jsfunction_result_caches( |
3821 isolate()->native_context()->jsfunction_result_caches()); | 3821 isolate()->native_context()->jsfunction_result_caches()); |
3822 if (jsfunction_result_caches->length() <= cache_id) { | 3822 if (jsfunction_result_caches->length() <= cache_id) { |
3823 __ Abort("Attempt to use undefined cache."); | 3823 __ Abort("Attempt to use undefined cache."); |
3824 __ mov(eax, isolate()->factory()->undefined_value()); | 3824 __ mov(eax, isolate()->factory()->undefined_value()); |
3825 context()->Plug(eax); | 3825 context()->Plug(eax); |
3826 return; | 3826 return; |
3827 } | 3827 } |
3828 | 3828 |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4520 } | 4520 } |
4521 } else { | 4521 } else { |
4522 // Perform the assignment as if via '='. | 4522 // Perform the assignment as if via '='. |
4523 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4523 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
4524 Token::ASSIGN); | 4524 Token::ASSIGN); |
4525 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4525 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4526 context()->Plug(eax); | 4526 context()->Plug(eax); |
4527 } | 4527 } |
4528 break; | 4528 break; |
4529 case NAMED_PROPERTY: { | 4529 case NAMED_PROPERTY: { |
4530 __ mov(ecx, prop->key()->AsLiteral()->handle()); | 4530 __ mov(ecx, prop->key()->AsLiteral()->value()); |
4531 __ pop(edx); | 4531 __ pop(edx); |
4532 Handle<Code> ic = is_classic_mode() | 4532 Handle<Code> ic = is_classic_mode() |
4533 ? isolate()->builtins()->StoreIC_Initialize() | 4533 ? isolate()->builtins()->StoreIC_Initialize() |
4534 : isolate()->builtins()->StoreIC_Initialize_Strict(); | 4534 : isolate()->builtins()->StoreIC_Initialize_Strict(); |
4535 CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId()); | 4535 CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId()); |
4536 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4536 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4537 if (expr->is_postfix()) { | 4537 if (expr->is_postfix()) { |
4538 if (!context()->IsEffect()) { | 4538 if (!context()->IsEffect()) { |
4539 context()->PlugTOS(); | 4539 context()->PlugTOS(); |
4540 } | 4540 } |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4921 *stack_depth = 0; | 4921 *stack_depth = 0; |
4922 *context_length = 0; | 4922 *context_length = 0; |
4923 return previous_; | 4923 return previous_; |
4924 } | 4924 } |
4925 | 4925 |
4926 #undef __ | 4926 #undef __ |
4927 | 4927 |
4928 } } // namespace v8::internal | 4928 } } // namespace v8::internal |
4929 | 4929 |
4930 #endif // V8_TARGET_ARCH_IA32 | 4930 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |