Index: frog/leg/universe.dart |
=================================================================== |
--- frog/leg/universe.dart (revision 5925) |
+++ frog/leg/universe.dart (working copy) |
@@ -1,234 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-class Universe { |
- Map<Element, String> generatedCode; |
- Map<Element, String> generatedBailoutCode; |
- final Set<ClassElement> instantiatedClasses; |
- final Set<SourceString> instantiatedClassInstanceFields; |
- final Set<FunctionElement> staticFunctionsNeedingGetter; |
- final Map<SourceString, Set<Selector>> invokedNames; |
- final Set<SourceString> invokedGetters; |
- final Set<SourceString> invokedSetters; |
- final Map<String, LibraryElement> libraries; |
- // TODO(ngeoffray): This should be a Set<Type>. |
- final Set<Element> isChecks; |
- |
- Universe() : generatedCode = new Map<Element, String>(), |
- generatedBailoutCode = new Map<Element, String>(), |
- libraries = new Map<String, LibraryElement>(), |
- instantiatedClasses = new Set<ClassElement>(), |
- instantiatedClassInstanceFields = new Set<SourceString>(), |
- staticFunctionsNeedingGetter = new Set<FunctionElement>(), |
- invokedNames = new Map<SourceString, Set<Selector>>(), |
- invokedGetters = new Set<SourceString>(), |
- invokedSetters = new Set<SourceString>(), |
- isChecks = new Set<Element>(); |
- |
- void addGeneratedCode(WorkItem work, String code) { |
- generatedCode[work.element] = code; |
- } |
- |
- void addBailoutCode(WorkItem work, String code) { |
- generatedBailoutCode[work.element] = code; |
- } |
-} |
- |
-class SelectorKind { |
- final String name; |
- const SelectorKind(this.name); |
- |
- static final SelectorKind GETTER = const SelectorKind('getter'); |
- static final SelectorKind SETTER = const SelectorKind('setter'); |
- static final SelectorKind INVOCATION = const SelectorKind('invocation'); |
- static final SelectorKind OPERATOR = const SelectorKind('operator'); |
- static final SelectorKind INDEX = const SelectorKind('index'); |
- |
- toString() => name; |
-} |
- |
-class Selector implements Hashable { |
- // The numbers of arguments of the selector. Includes named |
- // arguments. |
- final int argumentCount; |
- final SelectorKind kind; |
- const Selector(this.kind, this.argumentCount); |
- |
- int hashCode() => argumentCount + 1000 * namedArguments.length; |
- List<SourceString> get namedArguments() => const <SourceString>[]; |
- int get namedArgumentCount() => 0; |
- int get positionalArgumentCount() => argumentCount; |
- |
- static final Selector GETTER = const Selector(SelectorKind.GETTER, 0); |
- static final Selector SETTER = const Selector(SelectorKind.SETTER, 1); |
- static final Selector UNARY_OPERATOR = |
- const Selector(SelectorKind.OPERATOR, 0); |
- static final Selector BINARY_OPERATOR = |
- const Selector(SelectorKind.OPERATOR, 1); |
- static final Selector INDEX = const Selector(SelectorKind.INDEX, 1); |
- static final Selector INDEX_SET = const Selector(SelectorKind.INDEX, 2); |
- static final Selector INDEX_AND_INDEX_SET = |
- const Selector(SelectorKind.INDEX, 2); |
- static final Selector GETTER_AND_SETTER = |
- const Selector(SelectorKind.SETTER, 1); |
- static final Selector INVOCATION_0 = |
- const Selector(SelectorKind.INVOCATION, 0); |
- static final Selector INVOCATION_1 = |
- const Selector(SelectorKind.INVOCATION, 1); |
- static final Selector INVOCATION_2 = |
- const Selector(SelectorKind.INVOCATION, 2); |
- |
- bool applies(FunctionParameters parameters) { |
- if (argumentCount > parameters.parameterCount) return false; |
- int requiredParameterCount = parameters.requiredParameterCount; |
- int optionalParameterCount = parameters.optionalParameterCount; |
- |
- bool hasOptionalParameters = !parameters.optionalParameters.isEmpty(); |
- if (namedArguments.isEmpty()) { |
- if (!hasOptionalParameters) { |
- return requiredParameterCount == argumentCount; |
- } else { |
- return argumentCount >= requiredParameterCount && |
- argumentCount <= requiredParameterCount + optionalParameterCount; |
- } |
- } else { |
- if (!hasOptionalParameters) return false; |
- Link<Element> remainingNamedParameters = parameters.optionalParameters; |
- for (int i = requiredParameterCount; i < positionalArgumentCount; i++) { |
- remainingNamedParameters = remainingNamedParameters.tail; |
- } |
- Set<SourceString> nameSet = new Set<SourceString>(); |
- for (; |
- !remainingNamedParameters.isEmpty(); |
- remainingNamedParameters = remainingNamedParameters.tail) { |
- nameSet.add(remainingNamedParameters.head.name); |
- } |
- |
- for (SourceString name in namedArguments) { |
- if (!nameSet.contains(name)) { |
- return false; |
- } |
- nameSet.remove(name); |
- } |
- return true; |
- } |
- } |
- |
- /** |
- * Returns [:true:] if the selector and the [element] match; [:false:] |
- * otherwise. |
- */ |
- bool addSendArgumentsToList(Send send, |
- List list, |
- FunctionParameters parameters, |
- compileArgument(Node argument), |
- compileConstant(Element element)) { |
- void addMatchingSendArgumentsToList(Link<Node> link) { |
- for (; !link.isEmpty(); link = link.tail) { |
- list.add(compileArgument(link.head)); |
- } |
- } |
- |
- if (!this.applies(parameters)) return false; |
- if (this.positionalArgumentCount == parameters.parameterCount) { |
- addMatchingSendArgumentsToList(send.arguments); |
- return true; |
- } |
- |
- // If there are named arguments, provide them in the order |
- // expected by the called function, which is the source order. |
- |
- // Visit positional arguments and add them to the list. |
- Link<Node> arguments = send.arguments; |
- int positionalArgumentCount = this.positionalArgumentCount; |
- for (int i = 0; |
- i < positionalArgumentCount; |
- arguments = arguments.tail, i++) { |
- list.add(compileArgument(arguments.head)); |
- } |
- |
- // Visit named arguments and add them into a temporary list. |
- List namedArguments = []; |
- for (; !arguments.isEmpty(); arguments = arguments.tail) { |
- NamedArgument namedArgument = arguments.head; |
- namedArguments.add(compileArgument(namedArgument.expression)); |
- } |
- |
- Link<Element> remainingNamedParameters = parameters.optionalParameters; |
- // Skip the optional parameters that have been given in the |
- // positional arguments. |
- for (int i = parameters.requiredParameterCount; |
- i < positionalArgumentCount; |
- i++) { |
- remainingNamedParameters = remainingNamedParameters.tail; |
- } |
- |
- // Loop over the remaining named parameters, and try to find |
- // their values: either in the temporary list or using the |
- // default value. |
- for (; |
- !remainingNamedParameters.isEmpty(); |
- remainingNamedParameters = remainingNamedParameters.tail) { |
- Element parameter = remainingNamedParameters.head; |
- int foundIndex = -1; |
- for (int i = 0; i < this.namedArguments.length; i++) { |
- SourceString name = this.namedArguments[i]; |
- if (name == parameter.name) { |
- foundIndex = i; |
- break; |
- } |
- } |
- if (foundIndex != -1) { |
- list.add(namedArguments[foundIndex]); |
- } else { |
- list.add(compileConstant(parameter)); |
- } |
- } |
- return true; |
- } |
- |
- static bool sameNames(List<SourceString> first, List<SourceString> second) { |
- for (int i = 0; i < first.length; i++) { |
- if (first[i] != second[i]) return false; |
- } |
- return true; |
- } |
- |
- bool operator ==(other) { |
- if (other is !Selector) return false; |
- return argumentCount == other.argumentCount |
- && namedArguments.length == other.namedArguments.length |
- && sameNames(namedArguments, other.namedArguments); |
- } |
- |
- List<SourceString> getOrderedNamedArguments() => namedArguments; |
- |
- toString() => '$kind $argumentCount'; |
-} |
- |
-class Invocation extends Selector { |
- final List<SourceString> namedArguments; |
- List<SourceString> orderedNamedArguments; |
- int get namedArgumentCount() => namedArguments.length; |
- int get positionalArgumentCount() => argumentCount - namedArgumentCount; |
- |
- Invocation(int argumentCount, |
- [List<SourceString> names = const <SourceString>[]]) |
- : super(SelectorKind.INVOCATION, argumentCount), |
- namedArguments = names, |
- orderedNamedArguments = const <SourceString>[]; |
- |
- List<SourceString> getOrderedNamedArguments() { |
- if (namedArguments.isEmpty()) return namedArguments; |
- // We use the empty const List as a sentinel. |
- if (!orderedNamedArguments.isEmpty()) return orderedNamedArguments; |
- |
- List<SourceString> list = new List<SourceString>.from(namedArguments); |
- list.sort((SourceString first, SourceString second) { |
- return first.slowToString().compareTo(second.slowToString()); |
- }); |
- orderedNamedArguments = list; |
- return orderedNamedArguments; |
- } |
-} |