OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 4525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4536 // Restore the context and overwrite the function on the stack with | 4536 // Restore the context and overwrite the function on the stack with |
4537 // the result. | 4537 // the result. |
4538 frame_->RestoreContextRegister(); | 4538 frame_->RestoreContextRegister(); |
4539 frame_->SetElementAt(0, &result); | 4539 frame_->SetElementAt(0, &result); |
4540 | 4540 |
4541 } else if (var != NULL && !var->is_this() && var->is_global()) { | 4541 } else if (var != NULL && !var->is_this() && var->is_global()) { |
4542 // ---------------------------------- | 4542 // ---------------------------------- |
4543 // JavaScript example: 'foo(1, 2, 3)' // foo is global | 4543 // JavaScript example: 'foo(1, 2, 3)' // foo is global |
4544 // ---------------------------------- | 4544 // ---------------------------------- |
4545 | 4545 |
4546 // Push the name of the function and the receiver onto the stack. | |
4547 frame_->Push(var->name()); | |
4548 | |
4549 // Pass the global object as the receiver and let the IC stub | 4546 // Pass the global object as the receiver and let the IC stub |
4550 // patch the stack to use the global proxy as 'this' in the | 4547 // patch the stack to use the global proxy as 'this' in the |
4551 // invoked function. | 4548 // invoked function. |
4552 LoadGlobal(); | 4549 LoadGlobal(); |
4553 | 4550 |
4554 // Load the arguments. | 4551 // Load the arguments. |
4555 int arg_count = args->length(); | 4552 int arg_count = args->length(); |
4556 for (int i = 0; i < arg_count; i++) { | 4553 for (int i = 0; i < arg_count; i++) { |
4557 Load(args->at(i)); | 4554 Load(args->at(i)); |
4558 } | 4555 } |
4559 | 4556 |
| 4557 // Push the name of the function onto the frame. |
| 4558 frame_->Push(var->name()); |
| 4559 |
4560 // Call the IC initialization code. | 4560 // Call the IC initialization code. |
4561 CodeForSourcePosition(node->position()); | 4561 CodeForSourcePosition(node->position()); |
4562 Result result = frame_->CallCallIC(RelocInfo::CODE_TARGET_CONTEXT, | 4562 Result result = frame_->CallCallIC(RelocInfo::CODE_TARGET_CONTEXT, |
4563 arg_count, | 4563 arg_count, |
4564 loop_nesting()); | 4564 loop_nesting()); |
4565 frame_->RestoreContextRegister(); | 4565 frame_->RestoreContextRegister(); |
4566 // Replace the function on the stack with the result. | 4566 frame_->Push(&result); |
4567 frame_->SetElementAt(0, &result); | |
4568 | 4567 |
4569 } else if (var != NULL && var->slot() != NULL && | 4568 } else if (var != NULL && var->slot() != NULL && |
4570 var->slot()->type() == Slot::LOOKUP) { | 4569 var->slot()->type() == Slot::LOOKUP) { |
4571 // ---------------------------------- | 4570 // ---------------------------------- |
4572 // JavaScript example: 'with (obj) foo(1, 2, 3)' // foo is in obj | 4571 // JavaScript example: 'with (obj) foo(1, 2, 3)' // foo is in obj |
4573 // ---------------------------------- | 4572 // ---------------------------------- |
4574 | 4573 |
4575 // Load the function from the context. Sync the frame so we can | 4574 // Load the function from the context. Sync the frame so we can |
4576 // push the arguments directly into place. | 4575 // push the arguments directly into place. |
4577 frame_->SyncRange(0, frame_->element_count() - 1); | 4576 frame_->SyncRange(0, frame_->element_count() - 1); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4610 args->at(1)->AsVariableProxy() != NULL && | 4609 args->at(1)->AsVariableProxy() != NULL && |
4611 args->at(1)->AsVariableProxy()->IsArguments()) { | 4610 args->at(1)->AsVariableProxy()->IsArguments()) { |
4612 // Use the optimized Function.prototype.apply that avoids | 4611 // Use the optimized Function.prototype.apply that avoids |
4613 // allocating lazily allocated arguments objects. | 4612 // allocating lazily allocated arguments objects. |
4614 CallApplyLazy(property, | 4613 CallApplyLazy(property, |
4615 args->at(0), | 4614 args->at(0), |
4616 args->at(1)->AsVariableProxy(), | 4615 args->at(1)->AsVariableProxy(), |
4617 node->position()); | 4616 node->position()); |
4618 | 4617 |
4619 } else { | 4618 } else { |
4620 // Push the name of the function and the receiver onto the stack. | 4619 // Push the receiver onto the frame. |
4621 frame_->Push(name); | |
4622 Load(property->obj()); | 4620 Load(property->obj()); |
4623 | 4621 |
4624 // Load the arguments. | 4622 // Load the arguments. |
4625 int arg_count = args->length(); | 4623 int arg_count = args->length(); |
4626 for (int i = 0; i < arg_count; i++) { | 4624 for (int i = 0; i < arg_count; i++) { |
4627 Load(args->at(i)); | 4625 Load(args->at(i)); |
4628 } | 4626 } |
4629 | 4627 |
| 4628 // Push the name of the function onto the frame. |
| 4629 frame_->Push(name); |
| 4630 |
4630 // Call the IC initialization code. | 4631 // Call the IC initialization code. |
4631 CodeForSourcePosition(node->position()); | 4632 CodeForSourcePosition(node->position()); |
4632 Result result = | 4633 Result result = |
4633 frame_->CallCallIC(RelocInfo::CODE_TARGET, arg_count, | 4634 frame_->CallCallIC(RelocInfo::CODE_TARGET, arg_count, |
4634 loop_nesting()); | 4635 loop_nesting()); |
4635 frame_->RestoreContextRegister(); | 4636 frame_->RestoreContextRegister(); |
4636 // Replace the function on the stack with the result. | 4637 frame_->Push(&result); |
4637 frame_->SetElementAt(0, &result); | |
4638 } | 4638 } |
4639 | 4639 |
4640 } else { | 4640 } else { |
4641 // ------------------------------------------- | 4641 // ------------------------------------------- |
4642 // JavaScript example: 'array[index](1, 2, 3)' | 4642 // JavaScript example: 'array[index](1, 2, 3)' |
4643 // ------------------------------------------- | 4643 // ------------------------------------------- |
4644 | 4644 |
4645 // Load the function to call from the property through a reference. | 4645 // Load the function to call from the property through a reference. |
4646 Reference ref(this, property); | 4646 Reference ref(this, property); |
4647 ref.GetValue(); | 4647 ref.GetValue(); |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5285 void CodeGenerator::VisitCallRuntime(CallRuntime* node) { | 5285 void CodeGenerator::VisitCallRuntime(CallRuntime* node) { |
5286 if (CheckForInlineRuntimeCall(node)) { | 5286 if (CheckForInlineRuntimeCall(node)) { |
5287 return; | 5287 return; |
5288 } | 5288 } |
5289 | 5289 |
5290 ZoneList<Expression*>* args = node->arguments(); | 5290 ZoneList<Expression*>* args = node->arguments(); |
5291 Comment cmnt(masm_, "[ CallRuntime"); | 5291 Comment cmnt(masm_, "[ CallRuntime"); |
5292 Runtime::Function* function = node->function(); | 5292 Runtime::Function* function = node->function(); |
5293 | 5293 |
5294 if (function == NULL) { | 5294 if (function == NULL) { |
5295 // Prepare stack for calling JS runtime function. | |
5296 frame_->Push(node->name()); | |
5297 // Push the builtins object found in the current global object. | 5295 // Push the builtins object found in the current global object. |
5298 Result temp = allocator()->Allocate(); | 5296 Result temp = allocator()->Allocate(); |
5299 ASSERT(temp.is_valid()); | 5297 ASSERT(temp.is_valid()); |
5300 __ mov(temp.reg(), GlobalObject()); | 5298 __ mov(temp.reg(), GlobalObject()); |
5301 __ mov(temp.reg(), FieldOperand(temp.reg(), GlobalObject::kBuiltinsOffset)); | 5299 __ mov(temp.reg(), FieldOperand(temp.reg(), GlobalObject::kBuiltinsOffset)); |
5302 frame_->Push(&temp); | 5300 frame_->Push(&temp); |
5303 } | 5301 } |
5304 | 5302 |
5305 // Push the arguments ("left-to-right"). | 5303 // Push the arguments ("left-to-right"). |
5306 int arg_count = args->length(); | 5304 int arg_count = args->length(); |
5307 for (int i = 0; i < arg_count; i++) { | 5305 for (int i = 0; i < arg_count; i++) { |
5308 Load(args->at(i)); | 5306 Load(args->at(i)); |
5309 } | 5307 } |
5310 | 5308 |
5311 if (function == NULL) { | 5309 if (function == NULL) { |
5312 // Call the JS runtime function. | 5310 // Call the JS runtime function. |
| 5311 frame_->Push(node->name()); |
5313 Result answer = frame_->CallCallIC(RelocInfo::CODE_TARGET, | 5312 Result answer = frame_->CallCallIC(RelocInfo::CODE_TARGET, |
5314 arg_count, | 5313 arg_count, |
5315 loop_nesting_); | 5314 loop_nesting_); |
5316 frame_->RestoreContextRegister(); | 5315 frame_->RestoreContextRegister(); |
5317 frame_->SetElementAt(0, &answer); | 5316 frame_->Push(&answer); |
5318 } else { | 5317 } else { |
5319 // Call the C runtime function. | 5318 // Call the C runtime function. |
5320 Result answer = frame_->CallRuntime(function, arg_count); | 5319 Result answer = frame_->CallRuntime(function, arg_count); |
5321 frame_->Push(&answer); | 5320 frame_->Push(&answer); |
5322 } | 5321 } |
5323 } | 5322 } |
5324 | 5323 |
5325 | 5324 |
5326 void CodeGenerator::VisitUnaryOperation(UnaryOperation* node) { | 5325 void CodeGenerator::VisitUnaryOperation(UnaryOperation* node) { |
5327 Comment cmnt(masm_, "[ UnaryOperation"); | 5326 Comment cmnt(masm_, "[ UnaryOperation"); |
(...skipping 3130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8458 __ add(Operand(dest), Immediate(2)); | 8457 __ add(Operand(dest), Immediate(2)); |
8459 } | 8458 } |
8460 __ sub(Operand(count), Immediate(1)); | 8459 __ sub(Operand(count), Immediate(1)); |
8461 __ j(not_zero, &loop); | 8460 __ j(not_zero, &loop); |
8462 } | 8461 } |
8463 | 8462 |
8464 | 8463 |
8465 #undef __ | 8464 #undef __ |
8466 | 8465 |
8467 } } // namespace v8::internal | 8466 } } // namespace v8::internal |
OLD | NEW |