| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 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 2272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2283 // TODO(X64): Enable this and the switch back to fast, once they work. | 2283 // TODO(X64): Enable this and the switch back to fast, once they work. |
| 2284 // frame_->PushElementAt(target.size() - 1); | 2284 // frame_->PushElementAt(target.size() - 1); |
| 2285 // Result ignored = frame_->CallRuntime(Runtime::kToSlowProperties, 1); | 2285 // Result ignored = frame_->CallRuntime(Runtime::kToSlowProperties, 1); |
| 2286 } | 2286 } |
| 2287 if (node->op() == Token::ASSIGN || | 2287 if (node->op() == Token::ASSIGN || |
| 2288 node->op() == Token::INIT_VAR || | 2288 node->op() == Token::INIT_VAR || |
| 2289 node->op() == Token::INIT_CONST) { | 2289 node->op() == Token::INIT_CONST) { |
| 2290 Load(node->value()); | 2290 Load(node->value()); |
| 2291 | 2291 |
| 2292 } else { | 2292 } else { |
| 2293 Literal* literal = node->value()->AsLiteral(); | 2293 // Literal* literal = node->value()->AsLiteral(); |
| 2294 bool overwrite_value = | 2294 bool overwrite_value = |
| 2295 (node->value()->AsBinaryOperation() != NULL && | 2295 (node->value()->AsBinaryOperation() != NULL && |
| 2296 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | 2296 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); |
| 2297 Variable* right_var = node->value()->AsVariableProxy()->AsVariable(); | 2297 // Variable* right_var = node->value()->AsVariableProxy()->AsVariable(); |
| 2298 // There are two cases where the target is not read in the right hand | 2298 // There are two cases where the target is not read in the right hand |
| 2299 // side, that are easy to test for: the right hand side is a literal, | 2299 // side, that are easy to test for: the right hand side is a literal, |
| 2300 // or the right hand side is a different variable. TakeValue invalidates | 2300 // or the right hand side is a different variable. TakeValue invalidates |
| 2301 // the target, with an implicit promise that it will be written to again | 2301 // the target, with an implicit promise that it will be written to again |
| 2302 // before it is read. | 2302 // before it is read. |
| 2303 // TODO(X64): Implement TakeValue optimization. | 2303 // TODO(X64): Implement TakeValue optimization. |
| 2304 if (false) { | 2304 if (false) { |
| 2305 // if (literal != NULL || (right_var != NULL && right_var != var)) { | 2305 // if (literal != NULL || (right_var != NULL && right_var != var)) { |
| 2306 // target.TakeValue(NOT_INSIDE_TYPEOF); | 2306 // target.TakeValue(NOT_INSIDE_TYPEOF); |
| 2307 } else { | 2307 } else { |
| (...skipping 3525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5833 | 5833 |
| 5834 // Arguments adaptor case: Read the arguments length from the | 5834 // Arguments adaptor case: Read the arguments length from the |
| 5835 // adaptor frame and return it. | 5835 // adaptor frame and return it. |
| 5836 __ bind(&adaptor); | 5836 __ bind(&adaptor); |
| 5837 __ movq(rax, Operand(rdx, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 5837 __ movq(rax, Operand(rdx, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 5838 __ ret(0); | 5838 __ ret(0); |
| 5839 } | 5839 } |
| 5840 | 5840 |
| 5841 | 5841 |
| 5842 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { | 5842 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { |
| 5843 // Check that stack should contain frame pointer, code pointer, state and | 5843 // Check that stack should contain next handler, frame pointer, state and |
| 5844 // return address in that order. | 5844 // return address in that order. |
| 5845 ASSERT_EQ(StackHandlerConstants::kFPOffset + kPointerSize, | 5845 ASSERT_EQ(StackHandlerConstants::kFPOffset + kPointerSize, |
| 5846 StackHandlerConstants::kStateOffset); | 5846 StackHandlerConstants::kStateOffset); |
| 5847 ASSERT_EQ(StackHandlerConstants::kStateOffset + kPointerSize, | 5847 ASSERT_EQ(StackHandlerConstants::kStateOffset + kPointerSize, |
| 5848 StackHandlerConstants::kPCOffset); | 5848 StackHandlerConstants::kPCOffset); |
| 5849 | 5849 |
| 5850 ExternalReference handler_address(Top::k_handler_address); | 5850 ExternalReference handler_address(Top::k_handler_address); |
| 5851 __ movq(kScratchRegister, handler_address); | 5851 __ movq(kScratchRegister, handler_address); |
| 5852 __ movq(rdx, Operand(kScratchRegister, 0)); | 5852 __ movq(rsp, Operand(kScratchRegister, 0)); |
| 5853 // get next in chain | 5853 // get next in chain |
| 5854 __ movq(rcx, Operand(rdx, 0)); | 5854 __ pop(rcx); |
| 5855 __ movq(Operand(kScratchRegister, 0), rcx); | 5855 __ movq(Operand(kScratchRegister, 0), rcx); |
| 5856 __ movq(rsp, rdx); | |
| 5857 __ pop(rbp); // pop frame pointer | 5856 __ pop(rbp); // pop frame pointer |
| 5858 __ pop(rdx); // remove code pointer | |
| 5859 __ pop(rdx); // remove state | 5857 __ pop(rdx); // remove state |
| 5860 | 5858 |
| 5861 // Before returning we restore the context from the frame pointer if not NULL. | 5859 // Before returning we restore the context from the frame pointer if not NULL. |
| 5862 // The frame pointer is NULL in the exception handler of a JS entry frame. | 5860 // The frame pointer is NULL in the exception handler of a JS entry frame. |
| 5863 __ xor_(rsi, rsi); // tentatively set context pointer to NULL | 5861 __ xor_(rsi, rsi); // tentatively set context pointer to NULL |
| 5864 Label skip; | 5862 Label skip; |
| 5865 __ cmpq(rbp, Immediate(0)); | 5863 __ cmpq(rbp, Immediate(0)); |
| 5866 __ j(equal, &skip); | 5864 __ j(equal, &skip); |
| 5867 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 5865 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| 5868 __ bind(&skip); | 5866 __ bind(&skip); |
| 5869 | |
| 5870 __ ret(0); | 5867 __ ret(0); |
| 5871 } | 5868 } |
| 5872 | 5869 |
| 5873 | 5870 |
| 5874 void CEntryStub::GenerateCore(MacroAssembler* masm, | 5871 void CEntryStub::GenerateCore(MacroAssembler* masm, |
| 5875 Label* throw_normal_exception, | 5872 Label* throw_normal_exception, |
| 5876 Label* throw_out_of_memory_exception, | 5873 Label* throw_out_of_memory_exception, |
| 5877 StackFrame::Type frame_type, | 5874 StackFrame::Type frame_type, |
| 5878 bool do_gc, | 5875 bool do_gc, |
| 5879 bool always_allocate_scope) { | 5876 bool always_allocate_scope) { |
| (...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6793 break; | 6790 break; |
| 6794 default: | 6791 default: |
| 6795 UNREACHABLE(); | 6792 UNREACHABLE(); |
| 6796 } | 6793 } |
| 6797 } | 6794 } |
| 6798 | 6795 |
| 6799 | 6796 |
| 6800 #undef __ | 6797 #undef __ |
| 6801 | 6798 |
| 6802 } } // namespace v8::internal | 6799 } } // namespace v8::internal |
| OLD | NEW |