Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2525)

Side by Side Diff: src/arm/full-codegen-arm.cc

Issue 682413004: Fix stepping in for-loops. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/arm64/full-codegen-arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_ARM 7 #if V8_TARGET_ARCH_ARM
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 Comment cmnt(masm_, "[ ForInStatement"); 1104 Comment cmnt(masm_, "[ ForInStatement");
1105 FeedbackVectorSlot slot = stmt->ForInFeedbackSlot(); 1105 FeedbackVectorSlot slot = stmt->ForInFeedbackSlot();
1106 SetStatementPosition(stmt); 1106 SetStatementPosition(stmt);
1107 1107
1108 Label loop, exit; 1108 Label loop, exit;
1109 ForIn loop_statement(this, stmt); 1109 ForIn loop_statement(this, stmt);
1110 increment_loop_depth(); 1110 increment_loop_depth();
1111 1111
1112 // Get the object to enumerate over. If the object is null or undefined, skip 1112 // Get the object to enumerate over. If the object is null or undefined, skip
1113 // over the loop. See ECMA-262 version 5, section 12.6.4. 1113 // over the loop. See ECMA-262 version 5, section 12.6.4.
1114 SetExpressionPosition(stmt->enumerable());
1114 VisitForAccumulatorValue(stmt->enumerable()); 1115 VisitForAccumulatorValue(stmt->enumerable());
1115 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex); 1116 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
1116 __ cmp(r0, ip); 1117 __ cmp(r0, ip);
1117 __ b(eq, &exit); 1118 __ b(eq, &exit);
1118 Register null_value = r5; 1119 Register null_value = r5;
1119 __ LoadRoot(null_value, Heap::kNullValueRootIndex); 1120 __ LoadRoot(null_value, Heap::kNullValueRootIndex);
1120 __ cmp(r0, null_value); 1121 __ cmp(r0, null_value);
1121 __ b(eq, &exit); 1122 __ b(eq, &exit);
1122 1123
1123 PrepareForBailoutForId(stmt->PrepareId(), TOS_REG); 1124 PrepareForBailoutForId(stmt->PrepareId(), TOS_REG);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1249 __ InvokeBuiltin(Builtins::FILTER_KEY, CALL_FUNCTION); 1250 __ InvokeBuiltin(Builtins::FILTER_KEY, CALL_FUNCTION);
1250 __ mov(r3, Operand(r0), SetCC); 1251 __ mov(r3, Operand(r0), SetCC);
1251 __ b(eq, loop_statement.continue_label()); 1252 __ b(eq, loop_statement.continue_label());
1252 1253
1253 // Update the 'each' property or variable from the possibly filtered 1254 // Update the 'each' property or variable from the possibly filtered
1254 // entry in register r3. 1255 // entry in register r3.
1255 __ bind(&update_each); 1256 __ bind(&update_each);
1256 __ mov(result_register(), r3); 1257 __ mov(result_register(), r3);
1257 // Perform the assignment as if via '='. 1258 // Perform the assignment as if via '='.
1258 { EffectContext context(this); 1259 { EffectContext context(this);
1260 SetExpressionPosition(stmt->each());
1259 EmitAssignment(stmt->each()); 1261 EmitAssignment(stmt->each());
1260 } 1262 }
1261 1263
1262 // Generate code for the body of the loop. 1264 // Generate code for the body of the loop.
1263 Visit(stmt->body()); 1265 Visit(stmt->body());
1264 1266
1265 // Generate code for the going to the next element by incrementing 1267 // Generate code for the going to the next element by incrementing
1266 // the index (smi) stored on top of the stack. 1268 // the index (smi) stored on top of the stack.
1267 __ bind(loop_statement.continue_label()); 1269 __ bind(loop_statement.continue_label());
1268 __ pop(r0); 1270 __ pop(r0);
1269 __ add(r0, r0, Operand(Smi::FromInt(1))); 1271 __ add(r0, r0, Operand(Smi::FromInt(1)));
1270 __ push(r0); 1272 __ push(r0);
1271 1273
1272 EmitBackEdgeBookkeeping(stmt, &loop); 1274 EmitBackEdgeBookkeeping(stmt, &loop);
1273 __ b(&loop); 1275 __ b(&loop);
1274 1276
1275 // Remove the pointers stored on the stack. 1277 // Remove the pointers stored on the stack.
1276 __ bind(loop_statement.break_label()); 1278 __ bind(loop_statement.break_label());
1277 __ Drop(5); 1279 __ Drop(5);
1278 1280
1279 // Exit and decrement the loop depth. 1281 // Exit and decrement the loop depth.
1280 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); 1282 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
1281 __ bind(&exit); 1283 __ bind(&exit);
1282 decrement_loop_depth(); 1284 decrement_loop_depth();
1283 } 1285 }
1284 1286
1285 1287
1286 void FullCodeGenerator::VisitForOfStatement(ForOfStatement* stmt) {
1287 Comment cmnt(masm_, "[ ForOfStatement");
1288 SetStatementPosition(stmt);
1289
1290 Iteration loop_statement(this, stmt);
1291 increment_loop_depth();
1292
1293 // var iterator = iterable[Symbol.iterator]();
1294 VisitForEffect(stmt->assign_iterator());
1295
1296 // Loop entry.
1297 __ bind(loop_statement.continue_label());
1298
1299 // result = iterator.next()
1300 VisitForEffect(stmt->next_result());
1301
1302 // if (result.done) break;
1303 Label result_not_done;
1304 VisitForControl(stmt->result_done(),
1305 loop_statement.break_label(),
1306 &result_not_done,
1307 &result_not_done);
1308 __ bind(&result_not_done);
1309
1310 // each = result.value
1311 VisitForEffect(stmt->assign_each());
1312
1313 // Generate code for the body of the loop.
1314 Visit(stmt->body());
1315
1316 // Check stack before looping.
1317 PrepareForBailoutForId(stmt->BackEdgeId(), NO_REGISTERS);
1318 EmitBackEdgeBookkeeping(stmt, loop_statement.continue_label());
1319 __ jmp(loop_statement.continue_label());
1320
1321 // Exit and decrement the loop depth.
1322 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
1323 __ bind(loop_statement.break_label());
1324 decrement_loop_depth();
1325 }
1326
1327
1328 void FullCodeGenerator::EmitNewClosure(Handle<SharedFunctionInfo> info, 1288 void FullCodeGenerator::EmitNewClosure(Handle<SharedFunctionInfo> info,
1329 bool pretenure) { 1289 bool pretenure) {
1330 // Use the fast case closure allocation code that allocates in new 1290 // Use the fast case closure allocation code that allocates in new
1331 // space for nested functions that don't need literals cloning. If 1291 // space for nested functions that don't need literals cloning. If
1332 // we're running with the --always-opt or the --prepare-always-opt 1292 // we're running with the --always-opt or the --prepare-always-opt
1333 // flag, we need to use the runtime function so that the new function 1293 // flag, we need to use the runtime function so that the new function
1334 // we are creating here gets a chance to have its code optimized and 1294 // we are creating here gets a chance to have its code optimized and
1335 // doesn't just get a copy of the existing unoptimized code. 1295 // doesn't just get a copy of the existing unoptimized code.
1336 if (!FLAG_always_opt && 1296 if (!FLAG_always_opt &&
1337 !FLAG_prepare_always_opt && 1297 !FLAG_prepare_always_opt &&
(...skipping 4003 matching lines...) Expand 10 before | Expand all | Expand 10 after
5341 5301
5342 DCHECK(interrupt_address == 5302 DCHECK(interrupt_address ==
5343 isolate->builtins()->OsrAfterStackCheck()->entry()); 5303 isolate->builtins()->OsrAfterStackCheck()->entry());
5344 return OSR_AFTER_STACK_CHECK; 5304 return OSR_AFTER_STACK_CHECK;
5345 } 5305 }
5346 5306
5347 5307
5348 } } // namespace v8::internal 5308 } } // namespace v8::internal
5349 5309
5350 #endif // V8_TARGET_ARCH_ARM 5310 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/arm64/full-codegen-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698