OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 4991 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5002 ASSERT(slot != NULL); | 5002 ASSERT(slot != NULL); |
5003 | 5003 |
5004 // Evaluate the right-hand side. | 5004 // Evaluate the right-hand side. |
5005 if (node->is_compound()) { | 5005 if (node->is_compound()) { |
5006 // For a compound assignment the right-hand side is a binary operation | 5006 // For a compound assignment the right-hand side is a binary operation |
5007 // between the current property value and the actual right-hand side. | 5007 // between the current property value and the actual right-hand side. |
5008 LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); | 5008 LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); |
5009 Load(node->value()); | 5009 Load(node->value()); |
5010 | 5010 |
5011 // Perform the binary operation. | 5011 // Perform the binary operation. |
5012 bool overwrite_value = | 5012 bool overwrite_value = node->value()->ResultOverwriteAllowed(); |
5013 (node->value()->AsBinaryOperation() != NULL && | |
5014 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
5015 // Construct the implicit binary operation. | 5013 // Construct the implicit binary operation. |
5016 BinaryOperation expr(node); | 5014 BinaryOperation expr(node); |
5017 GenericBinaryOperation(&expr, | 5015 GenericBinaryOperation(&expr, |
5018 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); | 5016 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); |
5019 } else { | 5017 } else { |
5020 // For non-compound assignment just load the right-hand side. | 5018 // For non-compound assignment just load the right-hand side. |
5021 Load(node->value()); | 5019 Load(node->value()); |
5022 } | 5020 } |
5023 | 5021 |
5024 // Perform the assignment. | 5022 // Perform the assignment. |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5093 // Freeing rax causes the code generator to load the global into it. | 5091 // Freeing rax causes the code generator to load the global into it. |
5094 frame_->Spill(rax); | 5092 frame_->Spill(rax); |
5095 LoadGlobal(); | 5093 LoadGlobal(); |
5096 } else { | 5094 } else { |
5097 frame()->Dup(); | 5095 frame()->Dup(); |
5098 } | 5096 } |
5099 Result value = EmitNamedLoad(name, var != NULL); | 5097 Result value = EmitNamedLoad(name, var != NULL); |
5100 frame()->Push(&value); | 5098 frame()->Push(&value); |
5101 Load(node->value()); | 5099 Load(node->value()); |
5102 | 5100 |
5103 bool overwrite_value = | 5101 bool overwrite_value = node->value()->ResultOverwriteAllowed(); |
5104 (node->value()->AsBinaryOperation() != NULL && | |
5105 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
5106 // Construct the implicit binary operation. | 5102 // Construct the implicit binary operation. |
5107 BinaryOperation expr(node); | 5103 BinaryOperation expr(node); |
5108 GenericBinaryOperation(&expr, | 5104 GenericBinaryOperation(&expr, |
5109 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); | 5105 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); |
5110 } else { | 5106 } else { |
5111 // For non-compound assignment just load the right-hand side. | 5107 // For non-compound assignment just load the right-hand side. |
5112 Load(node->value()); | 5108 Load(node->value()); |
5113 } | 5109 } |
5114 | 5110 |
5115 // Stack layout: | 5111 // Stack layout: |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5195 // For a compound assignment the right-hand side is a binary operation | 5191 // For a compound assignment the right-hand side is a binary operation |
5196 // between the current property value and the actual right-hand side. | 5192 // between the current property value and the actual right-hand side. |
5197 // Duplicate receiver and key for loading the current property value. | 5193 // Duplicate receiver and key for loading the current property value. |
5198 frame()->PushElementAt(1); | 5194 frame()->PushElementAt(1); |
5199 frame()->PushElementAt(1); | 5195 frame()->PushElementAt(1); |
5200 Result value = EmitKeyedLoad(); | 5196 Result value = EmitKeyedLoad(); |
5201 frame()->Push(&value); | 5197 frame()->Push(&value); |
5202 Load(node->value()); | 5198 Load(node->value()); |
5203 | 5199 |
5204 // Perform the binary operation. | 5200 // Perform the binary operation. |
5205 bool overwrite_value = | 5201 bool overwrite_value = node->value()->ResultOverwriteAllowed(); |
5206 (node->value()->AsBinaryOperation() != NULL && | |
5207 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
5208 BinaryOperation expr(node); | 5202 BinaryOperation expr(node); |
5209 GenericBinaryOperation(&expr, | 5203 GenericBinaryOperation(&expr, |
5210 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); | 5204 overwrite_value ? OVERWRITE_RIGHT : NO_OVERWRITE); |
5211 } else { | 5205 } else { |
5212 // For non-compound assignment just load the right-hand side. | 5206 // For non-compound assignment just load the right-hand side. |
5213 Load(node->value()); | 5207 Load(node->value()); |
5214 } | 5208 } |
5215 | 5209 |
5216 // Stack layout: | 5210 // Stack layout: |
5217 // [tos] : value | 5211 // [tos] : value |
(...skipping 2132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7350 expression->AsLiteral()->IsNull())) { | 7344 expression->AsLiteral()->IsNull())) { |
7351 // Omit evaluating the value of the primitive literal. | 7345 // Omit evaluating the value of the primitive literal. |
7352 // It will be discarded anyway, and can have no side effect. | 7346 // It will be discarded anyway, and can have no side effect. |
7353 frame_->Push(Factory::undefined_value()); | 7347 frame_->Push(Factory::undefined_value()); |
7354 } else { | 7348 } else { |
7355 Load(node->expression()); | 7349 Load(node->expression()); |
7356 frame_->SetElementAt(0, Factory::undefined_value()); | 7350 frame_->SetElementAt(0, Factory::undefined_value()); |
7357 } | 7351 } |
7358 | 7352 |
7359 } else { | 7353 } else { |
7360 bool can_overwrite = | 7354 bool can_overwrite = node->expression()->ResultOverwriteAllowed(); |
7361 (node->expression()->AsBinaryOperation() != NULL && | |
7362 node->expression()->AsBinaryOperation()->ResultOverwriteAllowed()); | |
7363 UnaryOverwriteMode overwrite = | 7355 UnaryOverwriteMode overwrite = |
7364 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; | 7356 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; |
7365 bool no_negative_zero = node->expression()->no_negative_zero(); | 7357 bool no_negative_zero = node->expression()->no_negative_zero(); |
7366 Load(node->expression()); | 7358 Load(node->expression()); |
7367 switch (op) { | 7359 switch (op) { |
7368 case Token::NOT: | 7360 case Token::NOT: |
7369 case Token::DELETE: | 7361 case Token::DELETE: |
7370 case Token::TYPEOF: | 7362 case Token::TYPEOF: |
7371 UNREACHABLE(); // handled above | 7363 UNREACHABLE(); // handled above |
7372 break; | 7364 break; |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7770 | 7762 |
7771 void CodeGenerator::VisitBinaryOperation(BinaryOperation* node) { | 7763 void CodeGenerator::VisitBinaryOperation(BinaryOperation* node) { |
7772 Comment cmnt(masm_, "[ BinaryOperation"); | 7764 Comment cmnt(masm_, "[ BinaryOperation"); |
7773 | 7765 |
7774 if (node->op() == Token::AND || node->op() == Token::OR) { | 7766 if (node->op() == Token::AND || node->op() == Token::OR) { |
7775 GenerateLogicalBooleanOperation(node); | 7767 GenerateLogicalBooleanOperation(node); |
7776 } else { | 7768 } else { |
7777 // NOTE: The code below assumes that the slow cases (calls to runtime) | 7769 // NOTE: The code below assumes that the slow cases (calls to runtime) |
7778 // never return a constant/immutable object. | 7770 // never return a constant/immutable object. |
7779 OverwriteMode overwrite_mode = NO_OVERWRITE; | 7771 OverwriteMode overwrite_mode = NO_OVERWRITE; |
7780 if (node->left()->AsBinaryOperation() != NULL && | 7772 if (node->left()->ResultOverwriteAllowed()) { |
7781 node->left()->AsBinaryOperation()->ResultOverwriteAllowed()) { | |
7782 overwrite_mode = OVERWRITE_LEFT; | 7773 overwrite_mode = OVERWRITE_LEFT; |
7783 } else if (node->right()->AsBinaryOperation() != NULL && | 7774 } else if (node->right()->ResultOverwriteAllowed()) { |
7784 node->right()->AsBinaryOperation()->ResultOverwriteAllowed()) { | |
7785 overwrite_mode = OVERWRITE_RIGHT; | 7775 overwrite_mode = OVERWRITE_RIGHT; |
7786 } | 7776 } |
7787 | 7777 |
7788 if (node->left()->IsTrivial()) { | 7778 if (node->left()->IsTrivial()) { |
7789 Load(node->right()); | 7779 Load(node->right()); |
7790 Result right = frame_->Pop(); | 7780 Result right = frame_->Pop(); |
7791 frame_->Push(node->left()); | 7781 frame_->Push(node->left()); |
7792 frame_->Push(&right); | 7782 frame_->Push(&right); |
7793 } else { | 7783 } else { |
7794 Load(node->left()); | 7784 Load(node->left()); |
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8882 #undef __ | 8872 #undef __ |
8883 | 8873 |
8884 void RecordWriteStub::Generate(MacroAssembler* masm) { | 8874 void RecordWriteStub::Generate(MacroAssembler* masm) { |
8885 masm->RecordWriteHelper(object_, addr_, scratch_); | 8875 masm->RecordWriteHelper(object_, addr_, scratch_); |
8886 masm->ret(0); | 8876 masm->ret(0); |
8887 } | 8877 } |
8888 | 8878 |
8889 } } // namespace v8::internal | 8879 } } // namespace v8::internal |
8890 | 8880 |
8891 #endif // V8_TARGET_ARCH_X64 | 8881 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |