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

Side by Side Diff: runtime/vm/kernel_binary_flowgraph.cc

Issue 2940323002: [kernel] Don't emit field initializers in a redirecting constructor (Closed)
Patch Set: Created 3 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | tests/language/language_kernel.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 #include "vm/kernel_binary_flowgraph.h" 5 #include "vm/kernel_binary_flowgraph.h"
6 6
7 #include "vm/compiler.h" 7 #include "vm/compiler.h"
8 #include "vm/longjump.h" 8 #include "vm/longjump.h"
9 #include "vm/object_store.h" 9 #include "vm/object_store.h"
10 10
(...skipping 2906 matching lines...) Expand 10 before | Expand all | Expand 10 after
2917 instructions += LoadLocal(scopes()->this_variable); 2917 instructions += LoadLocal(scopes()->this_variable);
2918 instructions += BuildExpression(); 2918 instructions += BuildExpression();
2919 instructions += flow_graph_builder_->StoreInstanceFieldGuarded(field, true); 2919 instructions += flow_graph_builder_->StoreInstanceFieldGuarded(field, true);
2920 return instructions; 2920 return instructions;
2921 } 2921 }
2922 2922
2923 Fragment StreamingFlowGraphBuilder::BuildInitializers( 2923 Fragment StreamingFlowGraphBuilder::BuildInitializers(
2924 intptr_t constructor_class_parent_offset) { 2924 intptr_t constructor_class_parent_offset) {
2925 Fragment instructions; 2925 Fragment instructions;
2926 2926
2927 // Start by getting the position of the constructors initializer.
2928 intptr_t initializers_offset = -1;
2929 {
2930 AlternativeReadingScope alt(reader_);
2931 SkipFunctionNode(); // read constructors function node.
2932 initializers_offset = ReaderOffset();
2933 }
2934
2927 // These come from: 2935 // These come from:
2928 // class A { 2936 // class A {
2929 // var x = (expr); 2937 // var x = (expr);
2930 // } 2938 // }
2939 // We don't want to do that when this is a Redirecting Constructors though
2940 // (i.e. has a single initializer being of type kRedirectingInitializer).
2941 bool is_redirecting_constructor = false;
2931 { 2942 {
2943 AlternativeReadingScope alt(reader_, initializers_offset);
2944 intptr_t list_length = ReadListLength(); // read initializers list length.
2945 if (list_length == 1) {
2946 Tag tag = ReadTag();
2947 if (tag == kRedirectingInitializer) is_redirecting_constructor = true;
2948 }
2949 }
2950
2951 if (!is_redirecting_constructor) {
2932 AlternativeReadingScope alt(reader_, constructor_class_parent_offset); 2952 AlternativeReadingScope alt(reader_, constructor_class_parent_offset);
2933 ReadClassUntilFields(); // read first part of class. 2953 ReadClassUntilFields(); // read first part of class.
2934 intptr_t list_length = ReadListLength(); // read fields list length. 2954 intptr_t list_length = ReadListLength(); // read fields list length.
2935 2955
2936 for (intptr_t i = 0; i < list_length; ++i) { 2956 for (intptr_t i = 0; i < list_length; ++i) {
2937 intptr_t field_offset = ReaderOffset(); 2957 intptr_t field_offset = ReaderOffset();
2938 NameIndex canonical_name; 2958 NameIndex canonical_name;
2939 TokenPosition position; 2959 TokenPosition position;
2940 TokenPosition end_position; 2960 TokenPosition end_position;
2941 word flags; 2961 word flags;
(...skipping 14 matching lines...) Expand all
2956 } 2976 }
2957 } 2977 }
2958 2978
2959 // These to come from: 2979 // These to come from:
2960 // class A { 2980 // class A {
2961 // var x; 2981 // var x;
2962 // var y; 2982 // var y;
2963 // A(this.x) : super(expr), y = (expr); 2983 // A(this.x) : super(expr), y = (expr);
2964 // } 2984 // }
2965 { 2985 {
2966 AlternativeReadingScope alt(reader_); 2986 AlternativeReadingScope alt(reader_, initializers_offset);
2967 SkipFunctionNode(); // read constructors function node.
2968
2969 intptr_t list_length = ReadListLength(); // read initializers list length. 2987 intptr_t list_length = ReadListLength(); // read initializers list length.
2970 for (intptr_t i = 0; i < list_length; ++i) { 2988 for (intptr_t i = 0; i < list_length; ++i) {
2971 Tag tag = ReadTag(); 2989 Tag tag = ReadTag();
2972 switch (tag) { 2990 switch (tag) {
2973 case kInvalidInitializer: 2991 case kInvalidInitializer:
2974 UNIMPLEMENTED(); 2992 UNIMPLEMENTED();
2975 return Fragment(); 2993 return Fragment();
2976 case kFieldInitializer: { 2994 case kFieldInitializer: {
2977 NameIndex canonical_name = 2995 NameIndex canonical_name =
2978 ReadCanonicalNameReference(); // read field_reference. 2996 ReadCanonicalNameReference(); // read field_reference.
(...skipping 15 matching lines...) Expand all
2994 argument_count += 1; 3012 argument_count += 1;
2995 3013
2996 const Function& target = Function::ZoneHandle( 3014 const Function& target = Function::ZoneHandle(
2997 Z, H.LookupConstructorByKernelConstructor(canonical_target)); 3015 Z, H.LookupConstructorByKernelConstructor(canonical_target));
2998 instructions += StaticCall(TokenPosition::kNoSource, target, 3016 instructions += StaticCall(TokenPosition::kNoSource, target,
2999 argument_count, argument_names); 3017 argument_count, argument_names);
3000 instructions += Drop(); 3018 instructions += Drop();
3001 break; 3019 break;
3002 } 3020 }
3003 case kRedirectingInitializer: { 3021 case kRedirectingInitializer: {
3004 NameIndex canonical_target = 3022 NameIndex canonical_target =
Vyacheslav Egorov (Google) 2017/06/16 11:14:28 ASSERT(list_length == 1) here
3005 ReadCanonicalNameReference(); // read target_reference. 3023 ReadCanonicalNameReference(); // read target_reference.
3006 3024
3007 instructions += LoadLocal(scopes()->this_variable); 3025 instructions += LoadLocal(scopes()->this_variable);
3008 instructions += PushArgument(); 3026 instructions += PushArgument();
3009 3027
3010 // TODO(jensj): ASSERT(init->arguments()->types().length() == 0); 3028 // TODO(jensj): ASSERT(init->arguments()->types().length() == 0);
3011 Array& argument_names = Array::ZoneHandle(Z); 3029 Array& argument_names = Array::ZoneHandle(Z);
3012 intptr_t argument_count; 3030 intptr_t argument_count;
3013 instructions += BuildArguments(&argument_names, 3031 instructions += BuildArguments(&argument_names,
3014 &argument_count); // read arguments. 3032 &argument_count); // read arguments.
(...skipping 4135 matching lines...) Expand 10 before | Expand all | Expand 10 after
7150 metadata_values.SetAt(i, value); 7168 metadata_values.SetAt(i, value);
7151 } 7169 }
7152 7170
7153 return metadata_values.raw(); 7171 return metadata_values.raw();
7154 } 7172 }
7155 7173
7156 } // namespace kernel 7174 } // namespace kernel
7157 } // namespace dart 7175 } // namespace dart
7158 7176
7159 #endif // !defined(DART_PRECOMPILED_RUNTIME) 7177 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « no previous file | tests/language/language_kernel.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698