@@ -158,11 +158,24 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
158
158
private val enclosingLabelDefInfos = new ScopedVar [Map [Symbol , EnclosingLabelDefInfo ]]
159
159
private val isModuleInitialized = new ScopedVar [VarBox [Boolean ]]
160
160
private val undefinedDefaultParams = new ScopedVar [mutable.Set [Symbol ]]
161
-
162
- // For some method bodies
163
161
private val mutableLocalVars = new ScopedVar [mutable.Set [Symbol ]]
164
162
private val mutatedLocalVars = new ScopedVar [mutable.Set [Symbol ]]
165
163
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
+
166
179
// For anonymous methods
167
180
// These have a default, since we always read them.
168
181
private val tryingToGenMethodAsJSFunction = new ScopedVar [Boolean ](false )
@@ -1801,14 +1814,7 @@ abstract class GenJSCode[G <: Global with Singleton](val global: G)
1801
1814
val DefDef (mods, name, _, vparamss, _, rhs) = dd
1802
1815
val sym = dd.symbol
1803
1816
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) {
1812
1818
assert(vparamss.isEmpty || vparamss.tail.isEmpty,
1813
1819
" Malformed parameter list: " + vparamss)
1814
1820
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)
1858
1864
// Do not emit trait impl forwarders with @JavaDefaultMethod
1859
1865
None
1860
1866
} 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
+ }
1869
1871
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
+ }
1875
1877
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
+ }
1881
1883
1882
- val optimizerHints =
1883
- OptimizerHints .empty.
1884
- withInline(shouldMarkInline).
1885
- withNoinline(shouldMarkNoinline)
1884
+ val optimizerHints =
1885
+ OptimizerHints .empty.
1886
+ withInline(shouldMarkInline).
1887
+ withNoinline(shouldMarkNoinline)
1886
1888
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
1893
1895
1894
- if (needsMove) moveAllStatementsAfterSuperConstructorCall(body0)
1895
- else body0
1896
- }
1896
+ if (needsMove) moveAllStatementsAfterSuperConstructorCall(body0)
1897
+ else body0
1898
+ }
1897
1899
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
1913
1914
}
1914
- genMethodDef(namespace, methodName, originalName, params,
1915
- resultIRType, rhs, optimizerHints)
1916
1915
}
1916
+ genMethodDef(namespace, methodName, originalName, params,
1917
+ resultIRType, rhs, optimizerHints)
1917
1918
}
1919
+ }
1918
1920
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)
1935
1936
}
1936
-
1937
- Some (methodDefWithoutUselessVars)
1938
1937
}
1938
+
1939
+ Some (methodDefWithoutUselessVars)
1939
1940
}
1940
1941
}
1941
1942
}
0 commit comments