OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of js_backend; | 5 part of js_backend; |
6 | 6 |
7 const VERBOSE_OPTIMIZER_HINTS = false; | 7 const VERBOSE_OPTIMIZER_HINTS = false; |
8 | 8 |
9 class JavaScriptItemCompilationContext extends ItemCompilationContext { | 9 class JavaScriptItemCompilationContext extends ItemCompilationContext { |
10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); | 10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); |
(...skipping 1911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1922 // Compute a mapping from class to the closures it contains, so we | 1922 // Compute a mapping from class to the closures it contains, so we |
1923 // can include the correct ones when including the class. | 1923 // can include the correct ones when including the class. |
1924 Map<ClassElement, List<LocalFunctionElement>> closureMap = | 1924 Map<ClassElement, List<LocalFunctionElement>> closureMap = |
1925 new Map<ClassElement, List<LocalFunctionElement>>(); | 1925 new Map<ClassElement, List<LocalFunctionElement>>(); |
1926 for (LocalFunctionElement closure in compiler.resolverWorld.allClosures) { | 1926 for (LocalFunctionElement closure in compiler.resolverWorld.allClosures) { |
1927 closureMap.putIfAbsent(closure.enclosingClass, () => []).add(closure); | 1927 closureMap.putIfAbsent(closure.enclosingClass, () => []).add(closure); |
1928 } | 1928 } |
1929 bool foundClosure = false; | 1929 bool foundClosure = false; |
1930 Set<Element> reflectableMembers = new Set<Element>(); | 1930 Set<Element> reflectableMembers = new Set<Element>(); |
1931 ResolutionEnqueuer resolution = compiler.enqueuer.resolution; | 1931 ResolutionEnqueuer resolution = compiler.enqueuer.resolution; |
1932 for (ClassElement cls in resolution.universe.instantiatedClasses) { | 1932 for (ClassElement cls in resolution.universe.directlyInstantiatedClasses) { |
1933 // Do not process internal classes. | 1933 // Do not process internal classes. |
1934 if (cls.library.isInternalLibrary || cls.isInjected) continue; | 1934 if (cls.library.isInternalLibrary || cls.isInjected) continue; |
1935 if (referencedFromMirrorSystem(cls)) { | 1935 if (referencedFromMirrorSystem(cls)) { |
1936 Set<Name> memberNames = new Set<Name>(); | 1936 Set<Name> memberNames = new Set<Name>(); |
1937 // 1) the class (should be live) | 1937 // 1) the class (should be resolved) |
1938 assert(invariant(cls, resolution.isLive(cls))); | 1938 assert(invariant(cls, cls.isResolved)); |
1939 reflectableMembers.add(cls); | 1939 reflectableMembers.add(cls); |
1940 // 2) its constructors (if live) | 1940 // 2) its constructors (if resolved) |
1941 cls.constructors.forEach((Element constructor) { | 1941 cls.constructors.forEach((Element constructor) { |
1942 if (resolution.isLive(constructor)) { | 1942 if (resolution.hasBeenResolved(constructor)) { |
1943 reflectableMembers.add(constructor); | 1943 reflectableMembers.add(constructor); |
1944 } | 1944 } |
1945 }); | 1945 }); |
1946 // 3) all members, including fields via getter/setters (if live) | 1946 // 3) all members, including fields via getter/setters (if resolved) |
1947 cls.forEachClassMember((Member member) { | 1947 cls.forEachClassMember((Member member) { |
1948 if (resolution.isLive(member.element)) { | 1948 if (resolution.hasBeenResolved(member.element)) { |
1949 memberNames.add(member.name); | 1949 memberNames.add(member.name); |
1950 reflectableMembers.add(member.element); | 1950 reflectableMembers.add(member.element); |
1951 } | 1951 } |
1952 }); | 1952 }); |
1953 // 4) all overriding members of subclasses/subtypes (should be live) | 1953 // 4) all overriding members of subclasses/subtypes (should be resolved) |
1954 if (compiler.world.hasAnySubtype(cls)) { | 1954 if (compiler.world.hasAnySubtype(cls)) { |
1955 for (ClassElement subcls in compiler.world.subtypesOf(cls)) { | 1955 for (ClassElement subcls in compiler.world.subtypesOf(cls)) { |
1956 subcls.forEachClassMember((Member member) { | 1956 subcls.forEachClassMember((Member member) { |
1957 if (memberNames.contains(member.name)) { | 1957 if (memberNames.contains(member.name)) { |
1958 // TODO(20993): find out why this assertion fails. | 1958 // TODO(20993): find out why this assertion fails. |
1959 // assert(invariant(member.element, | 1959 // assert(invariant(member.element, |
1960 // resolution.isLive(member.element))); | 1960 // resolution.hasBeenResolved(member.element))); |
1961 if (resolution.isLive(member.element)) { | 1961 if (resolution.hasBeenResolved(member.element)) { |
1962 reflectableMembers.add(member.element); | 1962 reflectableMembers.add(member.element); |
1963 } | 1963 } |
1964 } | 1964 } |
1965 }); | 1965 }); |
1966 } | 1966 } |
1967 } | 1967 } |
1968 // 5) all its closures | 1968 // 5) all its closures |
1969 List<LocalFunctionElement> closures = closureMap[cls]; | 1969 List<LocalFunctionElement> closures = closureMap[cls]; |
1970 if (closures != null) { | 1970 if (closures != null) { |
1971 reflectableMembers.addAll(closures); | 1971 reflectableMembers.addAll(closures); |
1972 foundClosure = true; | 1972 foundClosure = true; |
1973 } | 1973 } |
1974 } else { | 1974 } else { |
1975 // check members themselves | 1975 // check members themselves |
1976 cls.constructors.forEach((ConstructorElement element) { | 1976 cls.constructors.forEach((ConstructorElement element) { |
1977 if (!compiler.enqueuer.resolution.isLive(element)) return; | 1977 if (!resolution.hasBeenResolved(element)) return; |
1978 if (referencedFromMirrorSystem(element, false)) { | 1978 if (referencedFromMirrorSystem(element, false)) { |
1979 reflectableMembers.add(element); | 1979 reflectableMembers.add(element); |
1980 } | 1980 } |
1981 }); | 1981 }); |
1982 cls.forEachClassMember((Member member) { | 1982 cls.forEachClassMember((Member member) { |
1983 if (!compiler.enqueuer.resolution.isLive(member.element)) return; | 1983 if (!resolution.hasBeenResolved(member.element)) return; |
1984 if (referencedFromMirrorSystem(member.element, false)) { | 1984 if (referencedFromMirrorSystem(member.element, false)) { |
1985 reflectableMembers.add(member.element); | 1985 reflectableMembers.add(member.element); |
1986 } | 1986 } |
1987 }); | 1987 }); |
1988 // Also add in closures. Those might be reflectable is their enclosing | 1988 // Also add in closures. Those might be reflectable is their enclosing |
1989 // member is. | 1989 // member is. |
1990 List<LocalFunctionElement> closures = closureMap[cls]; | 1990 List<LocalFunctionElement> closures = closureMap[cls]; |
1991 if (closures != null) { | 1991 if (closures != null) { |
1992 for (LocalFunctionElement closure in closures) { | 1992 for (LocalFunctionElement closure in closures) { |
1993 if (referencedFromMirrorSystem(closure.memberContext, false)) { | 1993 if (referencedFromMirrorSystem(closure.memberContext, false)) { |
1994 reflectableMembers.add(closure); | 1994 reflectableMembers.add(closure); |
1995 foundClosure = true; | 1995 foundClosure = true; |
1996 } | 1996 } |
1997 } | 1997 } |
1998 } | 1998 } |
1999 } | 1999 } |
2000 } | 2000 } |
2001 // We also need top-level non-class elements like static functions and | 2001 // We also need top-level non-class elements like static functions and |
2002 // global fields. We use the resolution queue to decide which elements are | 2002 // global fields. We use the resolution queue to decide which elements are |
2003 // part of the live world. | 2003 // part of the live world. |
2004 for (LibraryElement lib in compiler.libraryLoader.libraries) { | 2004 for (LibraryElement lib in compiler.libraryLoader.libraries) { |
2005 if (lib.isInternalLibrary) continue; | 2005 if (lib.isInternalLibrary) continue; |
2006 lib.forEachLocalMember((Element member) { | 2006 lib.forEachLocalMember((Element member) { |
2007 if (!member.isClass && | 2007 if (!member.isClass && |
2008 compiler.enqueuer.resolution.isLive(member) && | 2008 resolution.hasBeenResolved(member) && |
2009 referencedFromMirrorSystem(member)) { | 2009 referencedFromMirrorSystem(member)) { |
2010 reflectableMembers.add(member); | 2010 reflectableMembers.add(member); |
2011 } | 2011 } |
2012 }); | 2012 }); |
2013 } | 2013 } |
2014 // And closures inside top-level elements that do not have a surrounding | 2014 // And closures inside top-level elements that do not have a surrounding |
2015 // class. These will be in the [:null:] bucket of the [closureMap]. | 2015 // class. These will be in the [:null:] bucket of the [closureMap]. |
2016 if (closureMap.containsKey(null)) { | 2016 if (closureMap.containsKey(null)) { |
2017 for (Element closure in closureMap[null]) { | 2017 for (Element closure in closureMap[null]) { |
2018 if (referencedFromMirrorSystem(closure)) { | 2018 if (referencedFromMirrorSystem(closure)) { |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2436 } | 2436 } |
2437 } | 2437 } |
2438 | 2438 |
2439 /// Records that [constant] is used by the element behind [registry]. | 2439 /// Records that [constant] is used by the element behind [registry]. |
2440 class Dependency { | 2440 class Dependency { |
2441 final ConstantValue constant; | 2441 final ConstantValue constant; |
2442 final Element annotatedElement; | 2442 final Element annotatedElement; |
2443 | 2443 |
2444 const Dependency(this.constant, this.annotatedElement); | 2444 const Dependency(this.constant, this.annotatedElement); |
2445 } | 2445 } |
OLD | NEW |