Skip to content

Commit de3ebf3

Browse files
paulbissmeta-codesync[bot]
authored andcommitted
Sequentialise init and iter expression lists on for statements in lift_await.rs
Reviewed By: jano Differential Revision: D93632558 fbshipit-source-id: 63cca761f738880bd54ad63f82ce2d4deecf9d92
1 parent 4b74fe5 commit de3ebf3

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

hphp/hack/src/elab/lift_await.rs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -542,19 +542,28 @@ impl LiftAwait {
542542
}
543543

544544
fn extract_iter(&mut self, env: &mut Env, pos: &Pos, iter: &mut LoopIter) {
545-
let mut con = vec![];
546545
let mut seq = vec![];
547-
let mut tmps = vec![];
548546

549547
let LoopIter(iter_tmps, iter_block, exprs) = iter;
550548

551549
for expr in exprs {
550+
let mut expr_con = vec![];
551+
let mut expr_seq = vec![];
552+
let mut expr_tmps = vec![];
552553
self.leave_await = true;
553-
self.check_and_extract_await(env, expr, &mut con, &mut seq, &mut tmps);
554+
self.check_and_extract_await(env, expr, &mut expr_con, &mut expr_seq, &mut expr_tmps);
554555
self.leave_await = false;
556+
let expr_val = std::mem::replace(expr, Expr((), Pos::NONE, Expr_::Null));
557+
expr_seq.push(Stmt(pos.clone(), Stmt_::Expr(Box::new(expr_val))));
558+
seq.append(&mut sequentialise(
559+
pos.clone(),
560+
expr_con,
561+
expr_seq,
562+
expr_tmps,
563+
));
555564
}
556565

557-
(*iter_tmps, *iter_block) = create_lifted_block(pos, con, seq, tmps);
566+
(*iter_tmps, *iter_block) = create_lifted_block(pos, vec![], seq, vec![]);
558567
}
559568

560569
fn concurrentise(
@@ -1313,7 +1322,26 @@ impl<'a> VisitorMut<'a> for LiftAwait {
13131322
Stmt_::For(box (init_exprs, test, update, block)) => {
13141323
for expr in init_exprs {
13151324
expr.accept(env, self.object())?;
1316-
self.check_and_extract_await(env, expr, &mut con, &mut seq, &mut tmps);
1325+
let mut init_con = vec![];
1326+
let mut init_seq = vec![];
1327+
let mut init_tmps = vec![];
1328+
self.leave_await = true;
1329+
self.check_and_extract_await(
1330+
env,
1331+
expr,
1332+
&mut init_con,
1333+
&mut init_seq,
1334+
&mut init_tmps,
1335+
);
1336+
self.leave_await = false;
1337+
let expr_val = std::mem::replace(expr, Expr((), Pos::NONE, Expr_::Null));
1338+
init_seq.push(Stmt(pos.clone(), Stmt_::Expr(Box::new(expr_val))));
1339+
seq.append(&mut sequentialise(
1340+
pos.clone(),
1341+
init_con,
1342+
init_seq,
1343+
init_tmps,
1344+
));
13171345
}
13181346

13191347
test.accept(env, self.object())?;

hphp/test/slow/await-exprs.php.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,9 +876,9 @@ start id()
876876
end id()
877877
int(0)
878878
start g(2)
879+
end g(2)
879880
start g(3)
880881
start g(4)
881-
end g(2)
882882
end g(3)
883883
end g(4)
884884
start g(4)

0 commit comments

Comments
 (0)