| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 2217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2228 } | 2228 } |
| 2229 break; | 2229 break; |
| 2230 } | 2230 } |
| 2231 | 2231 |
| 2232 case LoopStatement::WHILE_LOOP: { | 2232 case LoopStatement::WHILE_LOOP: { |
| 2233 // TODO(260): This flag controls whether to duplicate the test | 2233 // TODO(260): This flag controls whether to duplicate the test |
| 2234 // at the bottom of the loop. Replace it with a better | 2234 // at the bottom of the loop. Replace it with a better |
| 2235 // indication of when it is safe to do so. | 2235 // indication of when it is safe to do so. |
| 2236 static const bool test_at_bottom = false; | 2236 static const bool test_at_bottom = false; |
| 2237 | 2237 |
| 2238 JumpTarget body; // Uninitialized. | 2238 JumpTarget body(this); // Initialized as forward-only. |
| 2239 IncrementLoopNesting(); | 2239 IncrementLoopNesting(); |
| 2240 | 2240 |
| 2241 // If the condition is always false and has no side effects, we | 2241 // If the condition is always false and has no side effects, we |
| 2242 // do not need to compile anything. | 2242 // do not need to compile anything. |
| 2243 if (info == ALWAYS_FALSE) break; | 2243 if (info == ALWAYS_FALSE) break; |
| 2244 | 2244 |
| 2245 // Based on the condition analysis, compile the test as necessary. | 2245 // Based on the condition analysis, compile the test as necessary. |
| 2246 if (info == ALWAYS_TRUE) { | 2246 if (info == ALWAYS_TRUE) { |
| 2247 // We will not compile the test expression. Label the top of | 2247 // We will not compile the test expression. Label the top of |
| 2248 // the loop with the continue target. | 2248 // the loop with the continue target. |
| 2249 node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL); | 2249 node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL); |
| 2250 node->continue_target()->Bind(); | 2250 node->continue_target()->Bind(); |
| 2251 } else { | 2251 } else { |
| 2252 ASSERT(info == DONT_KNOW); // ALWAYS_FALSE cannot reach here. | 2252 ASSERT(info == DONT_KNOW); // ALWAYS_FALSE cannot reach here. |
| 2253 if (test_at_bottom) { | 2253 if (test_at_bottom) { |
| 2254 // Continue is the test at the bottom, no need to label the | 2254 // Continue is the test at the bottom, no need to label the |
| 2255 // test at the top. The body is a backward target. | 2255 // test at the top. The body is a backward target. |
| 2256 node->continue_target()->Initialize(this); | 2256 node->continue_target()->Initialize(this); |
| 2257 body.Initialize(this, JumpTarget::BIDIRECTIONAL); | 2257 body.make_bidirectional(); |
| 2258 } else { | 2258 } else { |
| 2259 // Label the test at the top as the continue target. The | 2259 // Label the test at the top as the continue target. The |
| 2260 // body is a forward-only target. | 2260 // body is a forward-only target. |
| 2261 node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL); | 2261 node->continue_target()->Initialize(this, JumpTarget::BIDIRECTIONAL); |
| 2262 node->continue_target()->Bind(); | 2262 node->continue_target()->Bind(); |
| 2263 body.Initialize(this); | |
| 2264 } | 2263 } |
| 2265 // Compile the test with the body as the true target and | 2264 // Compile the test with the body as the true target and |
| 2266 // preferred fall-through and with the break target as the | 2265 // preferred fall-through and with the break target as the |
| 2267 // false target. | 2266 // false target. |
| 2268 ControlDestination dest(&body, node->break_target(), true); | 2267 ControlDestination dest(&body, node->break_target(), true); |
| 2269 LoadCondition(node->cond(), NOT_INSIDE_TYPEOF, &dest, true); | 2268 LoadCondition(node->cond(), NOT_INSIDE_TYPEOF, &dest, true); |
| 2270 | 2269 |
| 2271 if (dest.false_was_fall_through()) { | 2270 if (dest.false_was_fall_through()) { |
| 2272 // If we got the break target as fall-through, the test may | 2271 // If we got the break target as fall-through, the test may |
| 2273 // have been unconditionally false (if there are no jumps to | 2272 // have been unconditionally false (if there are no jumps to |
| (...skipping 4662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6936 | 6935 |
| 6937 // Slow-case: Go through the JavaScript implementation. | 6936 // Slow-case: Go through the JavaScript implementation. |
| 6938 __ bind(&slow); | 6937 __ bind(&slow); |
| 6939 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 6938 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
| 6940 } | 6939 } |
| 6941 | 6940 |
| 6942 | 6941 |
| 6943 #undef __ | 6942 #undef __ |
| 6944 | 6943 |
| 6945 } } // namespace v8::internal | 6944 } } // namespace v8::internal |
| OLD | NEW |