Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(622)

Unified Diff: frog/leg/compile_time_constants.dart

Issue 9699033: Introduce FieldParameterElement. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments and create a separate map for the fields. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | frog/leg/compiler.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/leg/compile_time_constants.dart
diff --git a/frog/leg/compile_time_constants.dart b/frog/leg/compile_time_constants.dart
index cefe2f5f2a70f8d0f44862a181f09597555c33cf..ddd80a2143a623c249c4d79ba9ec02307518b61c 100644
--- a/frog/leg/compile_time_constants.dart
+++ b/frog/leg/compile_time_constants.dart
@@ -486,7 +486,8 @@ class ConstantHandler extends CompilerTask {
*/
void compileWorkItem(WorkItem work) {
assert(work.element.kind == ElementKind.FIELD
- || work.element.kind == ElementKind.PARAMETER);
+ || work.element.kind == ElementKind.PARAMETER
+ || work.element.kind == ElementKind.FIELD_PARAMETER);
VariableElement element = work.element;
// Shortcut if it has already been compiled.
if (initialVariableValues.containsKey(element)) return;
@@ -920,7 +921,8 @@ class CompileTimeConstantEvaluator extends AbstractVisitor {
void assignArgumentsToParameters(
List<Constant> arguments,
FunctionParameters parameters,
- Map<Element, Constant> constructorDefinitions) {
+ Map<Element, Constant> constructorDefinitions,
ngeoffray 2012/03/15 15:16:25 constructorDefinitions -> parameterValues ?
floitsch 2012/03/15 15:37:24 I want to rename some elements in this file anyway
+ Map<Element, Constant> fieldValues) {
if (arguments.length != parameters.parameterCount) {
if (arguments.length < parameters.parameterCount &&
arguments.length >= parameters.requiredParameterCount) {
@@ -932,14 +934,20 @@ class CompileTimeConstantEvaluator extends AbstractVisitor {
}
int index = 0;
parameters.forEachParameter((Element parameter) {
- constructorDefinitions[parameter] = arguments[index++];
+ Constant argument = arguments[index++];
+ constructorDefinitions[parameter] = argument;
+ if (parameter.kind == ElementKind.FIELD_PARAMETER) {
+ FieldParameterElement fieldParameterElement = parameter;
+ fieldValues[fieldParameterElement.fieldElement] = argument;
+ }
});
}
void compileInitializers(Link<Node> initializers,
CompileTimeConstantEvaluator evaluator,
TreeElements constructorElements,
- Map<Element, Constant> constructorDefinitions) {
+ Map<Element, Constant> constructorDefinitions,
+ Map<Element, Constant> fieldValues) {
for (Link<Node> link = initializers; !link.isEmpty(); link = link.tail) {
assert(link.head is Send);
if (link.head is !SendSet) {
@@ -955,29 +963,28 @@ class CompileTimeConstantEvaluator extends AbstractVisitor {
Link<Node> arguments = init.arguments;
assert(!arguments.isEmpty() && arguments.tail.isEmpty());
Constant fieldValue = evaluator.evaluate(arguments.head);
- constructorDefinitions[constructorElements[init]] = fieldValue;
+ fieldValues[constructorElements[init]] = fieldValue;
}
}
}
- List<Constant> buildJsConstructorArguments(
- ClassElement classElement,
- Map<Element, Constant> constructorDefinitions) {
- List<Constant> fieldValues = <Constant>[];
+ List<Constant> buildJsNewArguments(ClassElement classElement,
+ Map<Element, Constant> fieldValues) {
+ List<Constant> jsNewArguments = <Constant>[];
for (Element member in classElement.members) {
if (member.isInstanceMember() && member.kind == ElementKind.FIELD) {
- Constant fieldValue = constructorDefinitions[member];
+ Constant fieldValue = fieldValues[member];
if (fieldValue === null) {
// Use the default value.
fieldValue = constantHandler.compileVariable(member);
}
- fieldValues.add(fieldValue);
+ jsNewArguments.add(fieldValue);
}
}
if (classElement.superclass != compiler.coreLibrary.find(Types.OBJECT)) {
compiler.unimplemented("ConstantHandler with super", node: node);
}
- return fieldValues;
+ return jsNewArguments;
}
// TODO(floitsch): get the type from somewhere.
@@ -989,11 +996,13 @@ class CompileTimeConstantEvaluator extends AbstractVisitor {
NodeList initializerList = functionNode.initializers;
FunctionParameters parameters = constructor.computeParameters(compiler);
+ Map<Element, Constant> fieldValues = new Map<Element, Constant>();
Map<Element, Constant> constructorDefinitions =
new Map<Element, Constant>();
List<Constant> arguments = compileArguments();
- assignArgumentsToParameters(arguments, parameters, constructorDefinitions);
+ assignArgumentsToParameters(arguments, parameters,
+ constructorDefinitions, fieldValues);
ngeoffray 2012/03/15 15:16:25 This is all happening in the same function, so you
floitsch 2012/03/15 15:37:24 I think I will need separate arguments when implem
CompileTimeConstantEvaluator initializerEvaluator =
new CompileTimeConstantEvaluator.insideConstructor(
constantHandler, constructorElements, compiler,
@@ -1003,14 +1012,15 @@ class CompileTimeConstantEvaluator extends AbstractVisitor {
compileInitializers(initializers,
initializerEvaluator,
constructorElements,
- constructorDefinitions);
+ constructorDefinitions,
+ fieldValues);
}
- List<Constant> fieldValues =
- buildJsConstructorArguments(classElement, constructorDefinitions);
+ List<Constant> jsNewArguments =
+ buildJsNewArguments(classElement, fieldValues);
compiler.registerInstantiatedClass(classElement);
Type type = new SimpleType(classElement.name, classElement);
- Constant constant = new ConstructedConstant(type, fieldValues);
+ Constant constant = new ConstructedConstant(type, jsNewArguments);
constantHandler.registerCompileTimeConstant(constant);
return constant;
}
« no previous file with comments | « no previous file | frog/leg/compiler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698