OLD | NEW |
---|---|
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 library kernel.interpreter; | 4 library kernel.interpreter; |
5 | 5 |
6 import '../ast.dart'; | 6 import '../ast.dart'; |
7 import '../ast.dart' as ast show Class; | 7 import '../ast.dart' as ast show Class; |
8 | 8 |
9 import '../log.dart'; | 9 import '../log.dart'; |
10 export '../log.dart'; | 10 export '../log.dart'; |
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
663 constructor.function, argValues); | 663 constructor.function, argValues); |
664 | 664 |
665 var newObject = new ObjectValue(constructor.enclosingClass); | 665 var newObject = new ObjectValue(constructor.enclosingClass); |
666 var cont = new InitializationEK( | 666 var cont = new InitializationEK( |
667 constructor, ctrEnv, new NewSK(continuation, new Location(newObject))); | 667 constructor, ctrEnv, new NewSK(continuation, new Location(newObject))); |
668 | 668 |
669 return new ValuePassingConfiguration(cont, newObject); | 669 return new ValuePassingConfiguration(cont, newObject); |
670 } | 670 } |
671 } | 671 } |
672 | 672 |
673 /// Represents the application continuation applied on the list of evaluated | |
674 /// field initializer expressions. | |
675 class InstanceFieldsA extends ApplicationContinuation { | |
676 final Constructor constructor; | |
677 final Location location; | |
678 final Environment environment; | |
679 final ConstructorBodySK continuation; | |
680 | |
681 final Class _currentClass; | |
682 | |
683 InstanceFieldsA( | |
684 this.constructor, this.location, this.environment, this.continuation) | |
685 : _currentClass = new Class(constructor.enclosingClass.reference); | |
686 | |
687 Configuration call(List<InterpreterValue> fieldValues) { | |
688 for (FieldInitializerValue f in fieldValues) { | |
689 // Directly set the field with the corresponding implicit setter. | |
690 _currentClass.implicitSetters[f.field.name](location.value, f.value); | |
691 } | |
692 | |
693 // TODO(zhivkag): Execute constructor initializer list before initializing | |
694 // fields in immediately enclosing class to null. | |
695 _initializeNullFields(_currentClass, location.value); | |
696 return new ForwardConfiguration(continuation, environment); | |
697 } | |
698 } | |
699 | |
673 // ------------------------------------------------------------------------ | 700 // ------------------------------------------------------------------------ |
674 // Expression Continuations | 701 // Expression Continuations |
675 // ------------------------------------------------------------------------ | 702 // ------------------------------------------------------------------------ |
676 | 703 |
677 /// Represents an expression continuation. | 704 /// Represents an expression continuation. |
678 /// | 705 /// |
679 /// There are various kinds of [ExpressionContinuation]s and their names are | 706 /// There are various kinds of [ExpressionContinuation]s and their names are |
680 /// suffixed with "EK". | 707 /// suffixed with "EK". |
681 abstract class ExpressionContinuation extends Continuation { | 708 abstract class ExpressionContinuation extends Continuation { |
682 Configuration call(Value v); | 709 Configuration call(Value v); |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
953 | 980 |
954 InitializationEK(this.constructor, this.environment, this.continuation); | 981 InitializationEK(this.constructor, this.environment, this.continuation); |
955 | 982 |
956 Configuration call(Value value) { | 983 Configuration call(Value value) { |
957 if (constructor.enclosingClass.superclass.superclass != null) { | 984 if (constructor.enclosingClass.superclass.superclass != null) { |
958 throw 'Support for super constructors in not implemented.'; | 985 throw 'Support for super constructors in not implemented.'; |
959 } | 986 } |
960 | 987 |
961 if (constructor.initializers.isNotEmpty && | 988 if (constructor.initializers.isNotEmpty && |
962 !(constructor.initializers.last is SuperInitializer)) { | 989 !(constructor.initializers.last is SuperInitializer)) { |
963 throw 'Support for initializer is not implemented.'; | 990 throw 'Support for initializers is not implemented.'; |
964 } | 991 } |
965 | 992 |
966 // The statement body is captured by the next statement continuation and | 993 // The statement body is captured by the next statement continuation and |
967 // expressions for field initialization are evaluated. | 994 // expressions for field initialization are evaluated. |
968 var ctrEnv = environment.extendWithThis(value); | 995 var ctrEnv = environment.extendWithThis(value); |
969 var bodyCont = | 996 var bodyCont = |
970 new ConstructorBodySK(constructor.function.body, ctrEnv, continuation); | 997 new ConstructorBodySK(constructor.function.body, ctrEnv, continuation); |
971 // TODO(zhivkag): Add support for initialization of fields with initializers . | 998 var initializers = _getFieldInitializers(constructor.enclosingClass); |
972 return new ForwardConfiguration(bodyCont, ctrEnv); | 999 var fieldsCont = |
1000 new InstanceFieldsA(constructor, new Location(value), ctrEnv, bodyCont); | |
Dmitry Stefantsov
2017/07/27 09:10:39
I think [InstanceFieldsA] here is something differ
zhivkag
2017/07/27 10:38:21
It should be the same thing, except for the step (
Dmitry Stefantsov
2017/07/27 10:43:31
Thanks for the explanation!
| |
1001 return new EvalListConfiguration( | |
1002 initializers, new Environment.empty(), fieldsCont); | |
973 } | 1003 } |
974 } | 1004 } |
975 | 1005 |
976 /// Executes statements. | 1006 /// Executes statements. |
977 /// | 1007 /// |
978 /// Execution of a statement completes in one of the following ways: | 1008 /// Execution of a statement completes in one of the following ways: |
979 /// - It completes normally, in which case the execution proceeds to applying | 1009 /// - It completes normally, in which case the execution proceeds to applying |
980 /// the next continuation. | 1010 /// the next continuation. |
981 /// - It breaks with a label, in which case the corresponding continuation is | 1011 /// - It breaks with a label, in which case the corresponding continuation is |
982 /// returned and applied. | 1012 /// returned and applied. |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1362 var current = providedArgs.named[i]; | 1392 var current = providedArgs.named[i]; |
1363 args.add(new NamedExpression(current.name, current.value)); | 1393 args.add(new NamedExpression(current.name, current.value)); |
1364 namedFormals.remove(current.name); | 1394 namedFormals.remove(current.name); |
1365 } | 1395 } |
1366 | 1396 |
1367 // Add missing optional named initializers. | 1397 // Add missing optional named initializers. |
1368 args.addAll(namedFormals.values); | 1398 args.addAll(namedFormals.values); |
1369 | 1399 |
1370 return args; | 1400 return args; |
1371 } | 1401 } |
1402 | |
1403 /// Creates a list of all field expressions to be evaluated. | |
1404 /// | |
1405 /// A field expression is an initializer expression for a given field defined wh en | |
Dmitry Stefantsov
2017/07/27 09:10:39
The line is too long.
zhivkag
2017/07/27 10:38:21
Done.
| |
1406 /// the field was created. | |
1407 List<InterpreterExpression> _getFieldInitializers(ast.Class class_) { | |
1408 var fieldInitializers = new List<InterpreterExpression>(); | |
1409 | |
1410 for (Field f in class_.fields) { | |
1411 if (f.initializer != null) { | |
1412 fieldInitializers.add(new FieldInitializerExpression(f, f.initializer)); | |
1413 } | |
1414 } | |
1415 | |
1416 return fieldInitializers; | |
1417 } | |
1418 | |
1419 /// Initializes all non initialized fields from the provided class to | |
1420 /// `Value.nullInstance` in the provided value. | |
1421 void _initializeNullFields(Class class_, Value value) { | |
1422 int startIndex = class_.superclass?.instanceSize ?? 0; | |
1423 for (int i = startIndex; i < class_.instanceSize; i++) { | |
1424 if (value.fields[i].value == null) { | |
1425 value.fields[i].value = Value.nullInstance; | |
1426 } | |
1427 } | |
1428 } | |
OLD | NEW |