diff --git a/src/methods/join.js b/src/methods/join.js index 84bb12c98..5a44c9161 100644 --- a/src/methods/join.js +++ b/src/methods/join.js @@ -487,14 +487,18 @@ export class JoinImplementation { } = e2; invariant(result2.effects === e2); + let emptyEffects = construct_empty_effects(realm); + let result = this.joinOrForkResults(realm, joinCondition, result1, result2, e1, e2); if (result1 instanceof AbruptCompletion) { if (!(result2 instanceof AbruptCompletion)) { invariant(result instanceof PossiblyNormalCompletion); + e2.generator = emptyEffects.generator; return new Effects(result, generator2, modifiedBindings2, modifiedProperties2, createdObjects2); } } else if (result2 instanceof AbruptCompletion) { invariant(result instanceof PossiblyNormalCompletion); + e1.generator = emptyEffects.generator; return new Effects(result, generator1, modifiedBindings1, modifiedProperties1, createdObjects1); } diff --git a/src/realm.js b/src/realm.js index a0a43bca3..484ef9183 100644 --- a/src/realm.js +++ b/src/realm.js @@ -1066,8 +1066,8 @@ export class Realm { // not all control flow branches join into one flow at this point. // Consequently we have to continue tracking changes until the point where // all the branches come together into one. + this.applyEffects(joinedEffects, "evaluateWithAbstractConditional"); completion = this.composeWithSavedCompletion(completion); - this.applyEffects(joinedEffects, "evaluateWithAbstractConditional", false); } else { this.applyEffects(joinedEffects, "evaluateWithAbstractConditional"); } diff --git a/test/serializer/optimized-functions/NestedTemporalJoinConditions.js b/test/serializer/optimized-functions/NestedTemporalJoinConditions.js new file mode 100644 index 000000000..4d11b97c2 --- /dev/null +++ b/test/serializer/optimized-functions/NestedTemporalJoinConditions.js @@ -0,0 +1,15 @@ +function fn(str, start, length) { + var size = str.length; + var posA = 0; + if (start > 0) { + if (posA >= size) { + return posA; + } + } +} + +if (global.__optimize) __optimize(fn); + +global.inspect = function() { + return true; +};