Skip to content

Commit 587e194

Browse files
committed
Factor per method body scopedVars into withPerMethodBodyState
The following commit will introduce another call-site. Sparating it to reduce noise.
1 parent 6022605 commit 587e194

File tree

1 file changed

+77
-76
lines changed

1 file changed

+77
-76
lines changed

compiler/src/main/scala/org/scalajs/nscplugin/GenJSCode.scala

Lines changed: 77 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,24 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
158158
private val enclosingLabelDefInfos = new ScopedVar[Map[Symbol, EnclosingLabelDefInfo]]
159159
private val isModuleInitialized = new ScopedVar[VarBox[Boolean]]
160160
private val undefinedDefaultParams = new ScopedVar[mutable.Set[Symbol]]
161-
162-
// For some method bodies
163161
private val mutableLocalVars = new ScopedVar[mutable.Set[Symbol]]
164162
private val mutatedLocalVars = new ScopedVar[mutable.Set[Symbol]]
165163

164+
private def withPerMethodBodyState[A](methodSym: Symbol)(body: => A): A = {
165+
withScopedVars(
166+
currentMethodSym := methodSym,
167+
thisLocalVarIdent := None,
168+
fakeTailJumpParamRepl := (NoSymbol, NoSymbol),
169+
enclosingLabelDefInfos := Map.empty,
170+
isModuleInitialized := new VarBox(false),
171+
undefinedDefaultParams := mutable.Set.empty,
172+
mutableLocalVars := mutable.Set.empty,
173+
mutatedLocalVars := mutable.Set.empty
174+
) {
175+
body
176+
}
177+
}
178+
166179
// For anonymous methods
167180
// These have a default, since we always read them.
168181
private val tryingToGenMethodAsJSFunction = new ScopedVar[Boolean](false)
@@ -1801,14 +1814,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
18011814
val DefDef(mods, name, _, vparamss, _, rhs) = dd
18021815
val sym = dd.symbol
18031816

1804-
withScopedVars(
1805-
currentMethodSym := sym,
1806-
thisLocalVarIdent := None,
1807-
fakeTailJumpParamRepl := (NoSymbol, NoSymbol),
1808-
enclosingLabelDefInfos := Map.empty,
1809-
isModuleInitialized := new VarBox(false),
1810-
undefinedDefaultParams := mutable.Set.empty
1811-
) {
1817+
withPerMethodBodyState(sym) {
18121818
assert(vparamss.isEmpty || vparamss.tail.isEmpty,
18131819
"Malformed parameter list: " + vparamss)
18141820
val params = if (vparamss.isEmpty) Nil else vparamss.head map (_.symbol)
@@ -1858,84 +1864,79 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
18581864
// Do not emit trait impl forwarders with @JavaDefaultMethod
18591865
None
18601866
} else {
1861-
withScopedVars(
1862-
mutableLocalVars := mutable.Set.empty,
1863-
mutatedLocalVars := mutable.Set.empty
1864-
) {
1865-
def isTraitImplForwarder = dd.rhs match {
1866-
case app: Apply => isImplClass(app.symbol.owner)
1867-
case _ => false
1868-
}
1867+
def isTraitImplForwarder = dd.rhs match {
1868+
case app: Apply => isImplClass(app.symbol.owner)
1869+
case _ => false
1870+
}
18691871

1870-
val shouldMarkInline = {
1871-
sym.hasAnnotation(InlineAnnotationClass) ||
1872-
sym.name.startsWith(nme.ANON_FUN_NAME) ||
1873-
adHocInlineMethods.contains(sym.fullName)
1874-
}
1872+
val shouldMarkInline = {
1873+
sym.hasAnnotation(InlineAnnotationClass) ||
1874+
sym.name.startsWith(nme.ANON_FUN_NAME) ||
1875+
adHocInlineMethods.contains(sym.fullName)
1876+
}
18751877

1876-
val shouldMarkNoinline = {
1877-
sym.hasAnnotation(NoinlineAnnotationClass) &&
1878-
!isTraitImplForwarder &&
1879-
!ignoreNoinlineAnnotation(sym)
1880-
}
1878+
val shouldMarkNoinline = {
1879+
sym.hasAnnotation(NoinlineAnnotationClass) &&
1880+
!isTraitImplForwarder &&
1881+
!ignoreNoinlineAnnotation(sym)
1882+
}
18811883

1882-
val optimizerHints =
1883-
OptimizerHints.empty.
1884-
withInline(shouldMarkInline).
1885-
withNoinline(shouldMarkNoinline)
1884+
val optimizerHints =
1885+
OptimizerHints.empty.
1886+
withInline(shouldMarkInline).
1887+
withNoinline(shouldMarkNoinline)
18861888

1887-
val methodDef = {
1888-
if (sym.isClassConstructor) {
1889-
val body0 = genStat(rhs)
1890-
val body1 = {
1891-
val needsMove =
1892-
isNonNativeJSClass(currentClassSym) && sym.isPrimaryConstructor
1889+
val methodDef = {
1890+
if (sym.isClassConstructor) {
1891+
val body0 = genStat(rhs)
1892+
val body1 = {
1893+
val needsMove =
1894+
isNonNativeJSClass(currentClassSym) && sym.isPrimaryConstructor
18931895

1894-
if (needsMove) moveAllStatementsAfterSuperConstructorCall(body0)
1895-
else body0
1896-
}
1896+
if (needsMove) moveAllStatementsAfterSuperConstructorCall(body0)
1897+
else body0
1898+
}
18971899

1898-
val namespace = js.MemberNamespace.Constructor
1899-
js.MethodDef(
1900-
js.MemberFlags.empty.withNamespace(namespace), methodName,
1901-
originalName, jsParams, jstpe.NoType, Some(body1))(
1902-
optimizerHints, None)
1903-
} else {
1904-
val resultIRType = toIRType(sym.tpe.resultType)
1905-
val namespace = {
1906-
if (sym.isStaticMember) {
1907-
if (sym.isPrivate) js.MemberNamespace.PrivateStatic
1908-
else js.MemberNamespace.PublicStatic
1909-
} else {
1910-
if (sym.isPrivate) js.MemberNamespace.Private
1911-
else js.MemberNamespace.Public
1912-
}
1900+
val namespace = js.MemberNamespace.Constructor
1901+
js.MethodDef(
1902+
js.MemberFlags.empty.withNamespace(namespace), methodName,
1903+
originalName, jsParams, jstpe.NoType, Some(body1))(
1904+
optimizerHints, None)
1905+
} else {
1906+
val resultIRType = toIRType(sym.tpe.resultType)
1907+
val namespace = {
1908+
if (sym.isStaticMember) {
1909+
if (sym.isPrivate) js.MemberNamespace.PrivateStatic
1910+
else js.MemberNamespace.PublicStatic
1911+
} else {
1912+
if (sym.isPrivate) js.MemberNamespace.Private
1913+
else js.MemberNamespace.Public
19131914
}
1914-
genMethodDef(namespace, methodName, originalName, params,
1915-
resultIRType, rhs, optimizerHints)
19161915
}
1916+
genMethodDef(namespace, methodName, originalName, params,
1917+
resultIRType, rhs, optimizerHints)
19171918
}
1919+
}
19181920

1919-
val methodDefWithoutUselessVars = {
1920-
val unmutatedMutableLocalVars =
1921-
(mutableLocalVars.diff(mutatedLocalVars)).toList
1922-
val mutatedImmutableLocalVals =
1923-
(mutatedLocalVars.diff(mutableLocalVars)).toList
1924-
if (unmutatedMutableLocalVars.isEmpty &&
1925-
mutatedImmutableLocalVals.isEmpty) {
1926-
// OK, we're good (common case)
1927-
methodDef
1928-
} else {
1929-
val patches = (
1930-
unmutatedMutableLocalVars.map(encodeLocalSym(_).name -> false) :::
1931-
mutatedImmutableLocalVals.map(encodeLocalSym(_).name -> true)
1932-
).toMap
1933-
patchMutableFlagOfLocals(methodDef, patches)
1934-
}
1921+
val methodDefWithoutUselessVars = {
1922+
val unmutatedMutableLocalVars =
1923+
(mutableLocalVars.diff(mutatedLocalVars)).toList
1924+
val mutatedImmutableLocalVals =
1925+
(mutatedLocalVars.diff(mutableLocalVars)).toList
1926+
if (unmutatedMutableLocalVars.isEmpty &&
1927+
mutatedImmutableLocalVals.isEmpty) {
1928+
// OK, we're good (common case)
1929+
methodDef
1930+
} else {
1931+
val patches = (
1932+
unmutatedMutableLocalVars.map(encodeLocalSym(_).name -> false) :::
1933+
mutatedImmutableLocalVals.map(encodeLocalSym(_).name -> true)
1934+
).toMap
1935+
patchMutableFlagOfLocals(methodDef, patches)
19351936
}
1936-
1937-
Some(methodDefWithoutUselessVars)
19381937
}
1938+
1939+
Some(methodDefWithoutUselessVars)
19391940
}
19401941
}
19411942
}

0 commit comments

Comments
 (0)