fix(javascript): retain conditional mutation ordering uncertainty
This commit is contained in:
1 parent
001851fde6
commit
b8a8190b2f
2 files changed
+17
-9
No files matched your search
@@ -72,6 +72,8 @@ describe("reference lifetimes across calls and shallow copies", () => {
|
|||||||
"mutate(alias); alias={};",
|
"mutate(alias); alias={};",
|
||||||
"if(flag) alias={}; mutate(alias);",
|
"if(flag) alias={}; mutate(alias);",
|
||||||
"alias={}; if(flag) mutate(alias);",
|
"alias={}; if(flag) mutate(alias);",
|
||||||
|
"alias={}; flag && mutate(alias);",
|
||||||
|
"alias={}; flag ? mutate(alias) : noop();",
|
||||||
"function invoke(){mutate(alias);} alias={}; invoke();",
|
"function invoke(){mutate(alias);} alias={}; invoke();",
|
||||||
"alias={}; mutate(alias); alias=source;",
|
"alias={}; mutate(alias); alias=source;",
|
||||||
])("retains uncertain call ordering: %s", (body) => {
|
])("retains uncertain call ordering: %s", (body) => {
|
||||||
|
|||||||
@@ -94,19 +94,25 @@ const directMutationPosition = (
|
|||||||
!t.isTaggedTemplateExpression(node)
|
!t.isTaggedTemplateExpression(node)
|
||||||
)
|
)
|
||||||
return null;
|
return null;
|
||||||
let current = parents.get(node);
|
let current: t.Node = node;
|
||||||
while (current !== undefined) {
|
while (true) {
|
||||||
if (t.isFunction(current)) return null;
|
const parent = parents.get(current);
|
||||||
if (t.isStatement(current)) return statementPosition(current, parents);
|
if (
|
||||||
if (t.isVariableDeclarator(current)) {
|
parent === undefined ||
|
||||||
const declaration = parents.get(current);
|
t.isFunction(parent) ||
|
||||||
|
(t.isLogicalExpression(parent) && parent.right === current) ||
|
||||||
|
(t.isConditionalExpression(parent) && parent.test !== current)
|
||||||
|
)
|
||||||
|
return null;
|
||||||
|
if (t.isStatement(parent)) return statementPosition(parent, parents);
|
||||||
|
if (t.isVariableDeclarator(parent)) {
|
||||||
|
const declaration = parents.get(parent);
|
||||||
return t.isVariableDeclaration(declaration)
|
return t.isVariableDeclaration(declaration)
|
||||||
? statementPosition(declaration, parents, current)
|
? statementPosition(declaration, parents, parent)
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
current = parents.get(current);
|
current = parent;
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const referenceInitializerPosition = (
|
const referenceInitializerPosition = (
|
||||||
|
|||||||
Reference in new issue
Block a user