Simplify forked completion constructors (#2315)

Summary:
Release note: Simplified forked completion constructors

Since effects and completions are now 1-1, we can stop passing (completion, effects) argument pairs.
Pull Request resolved: https://github.com/facebook/prepack/pull/2315

Differential Revision: D8985970

Pulled By: hermanventer

fbshipit-source-id: 12ab3848951be4fee973bde71eaca135f56b1a3d
This commit is contained in:
Herman Venter 2018-07-24 18:24:22 -07:00 committed by Facebook Github Bot
parent 62b11dcb6e
commit a1bd30ddb9
2 changed files with 22 additions and 66 deletions

View File

@ -133,19 +133,8 @@ export class ReturnCompletion extends AbruptCompletion {
} }
export class ForkedAbruptCompletion extends AbruptCompletion { export class ForkedAbruptCompletion extends AbruptCompletion {
constructor( constructor(realm: Realm, joinCondition: AbstractValue, consequent: AbruptCompletion, alternate: AbruptCompletion) {
realm: Realm,
joinCondition: AbstractValue,
consequent: AbruptCompletion,
consequentEffects: Effects,
alternate: AbruptCompletion,
alternateEffects: Effects
) {
super(realm.intrinsics.empty, undefined, consequent.location); super(realm.intrinsics.empty, undefined, consequent.location);
invariant(consequentEffects.result === consequent);
invariant(consequent.effects === consequentEffects);
invariant(alternateEffects.result === alternate);
invariant(alternate.effects === alternateEffects);
this.joinCondition = joinCondition; this.joinCondition = joinCondition;
this.consequent = consequent; this.consequent = consequent;
this.alternate = alternate; this.alternate = alternate;
@ -156,16 +145,7 @@ export class ForkedAbruptCompletion extends AbruptCompletion {
alternate: AbruptCompletion; alternate: AbruptCompletion;
shallowCloneWithoutEffects(): ForkedAbruptCompletion { shallowCloneWithoutEffects(): ForkedAbruptCompletion {
let consequentEffects = this.consequentEffects; return new ForkedAbruptCompletion(this.value.$Realm, this.joinCondition, this.consequent, this.alternate);
let alternateEffects = this.alternateEffects;
return new ForkedAbruptCompletion(
this.value.$Realm,
this.joinCondition,
this.consequent,
consequentEffects,
this.alternate,
alternateEffects
);
} }
// For convenience, this.consequent.effects should always be defined, but accessing it directly requires // For convenience, this.consequent.effects should always be defined, but accessing it directly requires
@ -233,9 +213,7 @@ export class ForkedAbruptCompletion extends AbruptCompletion {
this.value.$Realm.intrinsics.empty, this.value.$Realm.intrinsics.empty,
this.joinCondition, this.joinCondition,
this.consequent, this.consequent,
this.consequentEffects,
this.alternate, this.alternate,
this.alternateEffects,
[] []
); );
} }
@ -249,16 +227,10 @@ export class PossiblyNormalCompletion extends NormalCompletion {
value: Value, value: Value,
joinCondition: AbstractValue, joinCondition: AbstractValue,
consequent: Completion, consequent: Completion,
consequentEffects: Effects,
alternate: Completion, alternate: Completion,
alternateEffects: Effects,
savedPathConditions: Array<AbstractValue>, savedPathConditions: Array<AbstractValue>,
savedEffects: void | Effects = undefined savedEffects: void | Effects = undefined
) { ) {
invariant(consequent === consequentEffects.result);
invariant(consequent.effects === consequentEffects);
invariant(alternate === alternateEffects.result);
invariant(alternate.effects === alternateEffects);
invariant(consequent instanceof NormalCompletion || alternate instanceof NormalCompletion); invariant(consequent instanceof NormalCompletion || alternate instanceof NormalCompletion);
super(value, undefined, consequent.location); super(value, undefined, consequent.location);
this.joinCondition = joinCondition; this.joinCondition = joinCondition;
@ -284,9 +256,7 @@ export class PossiblyNormalCompletion extends NormalCompletion {
this.value, this.value,
this.joinCondition, this.joinCondition,
this.consequent, this.consequent,
consequentEffects,
this.alternate, this.alternate,
alternateEffects,
this.savedPathConditions, this.savedPathConditions,
this.savedEffects this.savedEffects
); );

View File

@ -164,23 +164,19 @@ export class JoinImplementation {
c.value, c.value,
pnc.joinCondition, pnc.joinCondition,
pnc.consequent, pnc.consequent,
pnc.consequentEffects,
newAlternateEffects.result, newAlternateEffects.result,
newAlternateEffects,
savedPathConditions, savedPathConditions,
pnc.savedEffects pnc.savedEffects
); );
} }
invariant(pnc.alternate instanceof PossiblyNormalCompletion); invariant(pnc.alternate instanceof PossiblyNormalCompletion);
na = this.composePossiblyNormalCompletions(realm, pnc.alternate, c, priorEffects); na = this.composePossiblyNormalCompletions(realm, pnc.alternate, c, priorEffects);
let newAlternateEffects = ae.shallowCloneWithResult(na); ae.shallowCloneWithResult(na);
return new PossiblyNormalCompletion( return new PossiblyNormalCompletion(
c.value, c.value,
pnc.joinCondition, pnc.joinCondition,
pnc.consequent, pnc.consequent,
pnc.consequentEffects,
na, na,
newAlternateEffects,
savedPathConditions, savedPathConditions,
pnc.savedEffects pnc.savedEffects
); );
@ -195,23 +191,19 @@ export class JoinImplementation {
c.value, c.value,
pnc.joinCondition, pnc.joinCondition,
newConsequentEffects.result, newConsequentEffects.result,
newConsequentEffects,
pnc.alternate, pnc.alternate,
pnc.alternateEffects,
savedPathConditions, savedPathConditions,
pnc.savedEffects pnc.savedEffects
); );
} }
invariant(pnc.consequent instanceof PossiblyNormalCompletion); invariant(pnc.consequent instanceof PossiblyNormalCompletion);
nc = this.composePossiblyNormalCompletions(realm, pnc.consequent, c); nc = this.composePossiblyNormalCompletions(realm, pnc.consequent, c);
let newConsequentEffects = ce.shallowCloneWithResult(nc); ce.shallowCloneWithResult(nc);
return new PossiblyNormalCompletion( return new PossiblyNormalCompletion(
c.value, c.value,
pnc.joinCondition, pnc.joinCondition,
nc, nc,
newConsequentEffects,
pnc.alternate, pnc.alternate,
pnc.alternateEffects,
savedPathConditions, savedPathConditions,
pnc.savedEffects pnc.savedEffects
); );
@ -292,10 +284,10 @@ export class JoinImplementation {
// effects collected after pnc was constructed // effects collected after pnc was constructed
e: Effects e: Effects
): ForkedAbruptCompletion { ): ForkedAbruptCompletion {
let recurse = (xpnc, xe, nac, ne): [ForkedAbruptCompletion, Effects] => { let recurse = (xpnc, xe, nac, ne): ForkedAbruptCompletion => {
let nx = this.replacePossiblyNormalCompletionWithForkedAbruptCompletion(realm, xpnc, nac, ne); let nx = this.replacePossiblyNormalCompletionWithForkedAbruptCompletion(realm, xpnc, nac, ne);
let nxe = xe.shallowCloneWithResult(nx); xe.shallowCloneWithResult(nx);
return [nx, nxe]; return nx;
}; };
let cloneEffects = () => { let cloneEffects = () => {
@ -319,12 +311,11 @@ export class JoinImplementation {
// todo: simplify with implied path condition // todo: simplify with implied path condition
e = realm.composeEffects(pnc.alternateEffects, e); e = realm.composeEffects(pnc.alternateEffects, e);
invariant(e.result instanceof AbruptCompletion); invariant(e.result instanceof AbruptCompletion);
ac = e.result; return new ForkedAbruptCompletion(realm, pnc.joinCondition, pncc, e.result);
return new ForkedAbruptCompletion(realm, pnc.joinCondition, pncc, pnc.consequentEffects, ac, e);
} }
invariant(pnca instanceof PossiblyNormalCompletion); invariant(pnca instanceof PossiblyNormalCompletion);
let [na, nae] = recurse(pnca, pnc.alternateEffects, ac, e); let na = recurse(pnca, pnc.alternateEffects, ac, e);
return new ForkedAbruptCompletion(realm, pnc.joinCondition, pncc, pnc.consequentEffects, na, nae); return new ForkedAbruptCompletion(realm, pnc.joinCondition, pncc, na);
} }
// * case (SimpleNormalCompletion, AbruptCompletion) // * case (SimpleNormalCompletion, AbruptCompletion)
@ -334,12 +325,11 @@ export class JoinImplementation {
// todo: simplify with implied path condition // todo: simplify with implied path condition
e = realm.composeEffects(pnc.consequentEffects, e); e = realm.composeEffects(pnc.consequentEffects, e);
invariant(e.result instanceof AbruptCompletion); invariant(e.result instanceof AbruptCompletion);
ac = e.result; return new ForkedAbruptCompletion(realm, pnc.joinCondition, e.result, pnca);
return new ForkedAbruptCompletion(realm, pnc.joinCondition, ac, e, pnca, pnc.alternateEffects);
} }
invariant(pncc instanceof PossiblyNormalCompletion); invariant(pncc instanceof PossiblyNormalCompletion);
let [nc, nce] = recurse(pncc, pnc.consequentEffects, ac, e); let nc = recurse(pncc, pnc.consequentEffects, ac, e);
return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, nce, pnca, pnc.alternateEffects); return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, pnca);
} }
// * case (SimpleNormalCompletion, SimpleNormalCompletion) // * case (SimpleNormalCompletion, SimpleNormalCompletion)
@ -356,9 +346,9 @@ export class JoinImplementation {
na = nae.result; na = nae.result;
} else { } else {
invariant(pnca instanceof PossiblyNormalCompletion); invariant(pnca instanceof PossiblyNormalCompletion);
[na, nae] = recurse(pnca, pnc.alternateEffects, ac, e); na = recurse(pnca, pnc.alternateEffects, ac, e);
} }
return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, nce, na, nae); return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, na);
} }
// * case (PossibleNormalCompletion, SimpleNormalCompletion) // * case (PossibleNormalCompletion, SimpleNormalCompletion)
@ -368,17 +358,17 @@ export class JoinImplementation {
let na = nae.result; let na = nae.result;
invariant(pncc instanceof PossiblyNormalCompletion); invariant(pncc instanceof PossiblyNormalCompletion);
[ac, e] = cloneEffects(); [ac, e] = cloneEffects();
let [nc, nce] = recurse(pncc, pnc.consequentEffects, ac, e); let nc = recurse(pncc, pnc.consequentEffects, ac, e);
return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, nce, na, nae); return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, na);
} }
// * case (PossibleNormalCompletion, PossibleNormalCompletion) // * case (PossibleNormalCompletion, PossibleNormalCompletion)
invariant(pncc instanceof PossiblyNormalCompletion); invariant(pncc instanceof PossiblyNormalCompletion);
invariant(pnca instanceof PossiblyNormalCompletion); invariant(pnca instanceof PossiblyNormalCompletion);
let [nc, nce] = recurse(pncc, pnc.consequentEffects, ac, e); let nc = recurse(pncc, pnc.consequentEffects, ac, e);
[ac, e] = cloneEffects(); [ac, e] = cloneEffects();
let [na, nae] = recurse(pnca, pnc.alternateEffects, ac, e); let na = recurse(pnca, pnc.alternateEffects, ac, e);
return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, nce, na, nae); return new ForkedAbruptCompletion(realm, pnc.joinCondition, nc, na);
// Impossible cases: // Impossible cases:
// * case (AbruptCompletion, AbruptCompletion) // * case (AbruptCompletion, AbruptCompletion)
@ -400,7 +390,7 @@ export class JoinImplementation {
let rv = this.joinValues(realm, c.value, a.value, getAbstractValue); let rv = this.joinValues(realm, c.value, a.value, getAbstractValue);
invariant(rv instanceof Value); invariant(rv instanceof Value);
a.value = rv; a.value = rv;
return new PossiblyNormalCompletion(rv, joinCondition, c, ce, a, ae, []); return new PossiblyNormalCompletion(rv, joinCondition, c, a, []);
} }
// Join all effects that result in completions of type CompletionType. // Join all effects that result in completions of type CompletionType.
@ -619,7 +609,7 @@ export class JoinImplementation {
return new SimpleNormalCompletion(val); return new SimpleNormalCompletion(val);
} }
if (result1 instanceof AbruptCompletion && result2 instanceof AbruptCompletion) { if (result1 instanceof AbruptCompletion && result2 instanceof AbruptCompletion) {
return new ForkedAbruptCompletion(realm, joinCondition, result1, e1, result2, e2); return new ForkedAbruptCompletion(realm, joinCondition, result1, result2);
} }
if (result1 instanceof NormalCompletion && result2 instanceof NormalCompletion) { if (result1 instanceof NormalCompletion && result2 instanceof NormalCompletion) {
return this.joinNormalCompletions(realm, joinCondition, result1, e1, result2, e2); return this.joinNormalCompletions(realm, joinCondition, result1, e1, result2, e2);
@ -638,9 +628,7 @@ export class JoinImplementation {
completion.value, completion.value,
joinCondition, joinCondition,
result1, result1,
e1,
result2, result2,
e2,
savedPathConditions, savedPathConditions,
savedEffects savedEffects
); );
@ -659,9 +647,7 @@ export class JoinImplementation {
completion.value, completion.value,
joinCondition, joinCondition,
result1, result1,
e1,
result2, result2,
e2,
savedPathConditions, savedPathConditions,
savedEffects savedEffects
); );