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

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

Issue 2972343002: [kernel] Insert kernel bodies into VM heap (Closed)
Patch Set: Rebased Created 3 years, 4 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
OLDNEW
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 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/become.h" 10 #include "vm/become.h"
(...skipping 2713 matching lines...) Expand 10 before | Expand all | Expand 10 after
2724 owner, TokenPosition::kMethodExtractor)); 2724 owner, TokenPosition::kMethodExtractor));
2725 2725
2726 // Initialize signature: receiver is a single fixed parameter. 2726 // Initialize signature: receiver is a single fixed parameter.
2727 const intptr_t kNumParameters = 1; 2727 const intptr_t kNumParameters = 1;
2728 extractor.set_num_fixed_parameters(kNumParameters); 2728 extractor.set_num_fixed_parameters(kNumParameters);
2729 extractor.SetNumOptionalParameters(0, 0); 2729 extractor.SetNumOptionalParameters(0, 0);
2730 extractor.set_parameter_types(Object::extractor_parameter_types()); 2730 extractor.set_parameter_types(Object::extractor_parameter_types());
2731 extractor.set_parameter_names(Object::extractor_parameter_names()); 2731 extractor.set_parameter_names(Object::extractor_parameter_names());
2732 extractor.set_result_type(Object::dynamic_type()); 2732 extractor.set_result_type(Object::dynamic_type());
2733 extractor.set_kernel_offset(kernel_offset()); 2733 extractor.set_kernel_offset(kernel_offset());
2734 extractor.set_kernel_body(TypedData::Handle(zone, kernel_body()));
2734 2735
2735 extractor.set_extracted_method_closure(closure_function); 2736 extractor.set_extracted_method_closure(closure_function);
2736 extractor.set_is_debuggable(false); 2737 extractor.set_is_debuggable(false);
2737 extractor.set_is_visible(false); 2738 extractor.set_is_visible(false);
2738 2739
2739 owner.AddFunction(extractor); 2740 owner.AddFunction(extractor);
2740 2741
2741 return extractor.raw(); 2742 return extractor.raw();
2742 } 2743 }
2743 2744
(...skipping 3196 matching lines...) Expand 10 before | Expand all | Expand 10 after
5940 } 5941 }
5941 5942
5942 void Function::SetNumOptionalParameters(intptr_t num_optional_parameters, 5943 void Function::SetNumOptionalParameters(intptr_t num_optional_parameters,
5943 bool are_optional_positional) const { 5944 bool are_optional_positional) const {
5944 ASSERT(num_optional_parameters >= 0); 5945 ASSERT(num_optional_parameters >= 0);
5945 set_num_optional_parameters(are_optional_positional 5946 set_num_optional_parameters(are_optional_positional
5946 ? num_optional_parameters 5947 ? num_optional_parameters
5947 : -num_optional_parameters); 5948 : -num_optional_parameters);
5948 } 5949 }
5949 5950
5951 void Function::set_kernel_body(const TypedData& data) const {
5952 StorePointer(&raw_ptr()->kernel_body_, data.raw());
5953 }
5954
5950 bool Function::IsOptimizable() const { 5955 bool Function::IsOptimizable() const {
5951 if (FLAG_precompiled_mode) { 5956 if (FLAG_precompiled_mode) {
5952 return true; 5957 return true;
5953 } 5958 }
5954 if (is_native()) { 5959 if (is_native()) {
5955 // Native methods don't need to be optimized. 5960 // Native methods don't need to be optimized.
5956 return false; 5961 return false;
5957 } 5962 }
5958 const intptr_t function_length = end_token_pos().Pos() - token_pos().Pos(); 5963 const intptr_t function_length = end_token_pos().Pos() - token_pos().Pos();
5959 if (is_optimizable() && (script() != Script::null()) && 5964 if (is_optimizable() && (script() != Script::null()) &&
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
6632 const PatchClass& clone_owner = 6637 const PatchClass& clone_owner =
6633 PatchClass::Handle(zone, PatchClass::New(new_owner, origin)); 6638 PatchClass::Handle(zone, PatchClass::New(new_owner, origin));
6634 clone.set_owner(clone_owner); 6639 clone.set_owner(clone_owner);
6635 clone.ClearICDataArray(); 6640 clone.ClearICDataArray();
6636 clone.ClearCode(); 6641 clone.ClearCode();
6637 clone.set_usage_counter(0); 6642 clone.set_usage_counter(0);
6638 clone.set_deoptimization_counter(0); 6643 clone.set_deoptimization_counter(0);
6639 clone.set_optimized_instruction_count(0); 6644 clone.set_optimized_instruction_count(0);
6640 clone.set_optimized_call_site_count(0); 6645 clone.set_optimized_call_site_count(0);
6641 clone.set_kernel_offset(kernel_offset()); 6646 clone.set_kernel_offset(kernel_offset());
6647 clone.set_kernel_body(TypedData::Handle(zone, kernel_body()));
6648
6642 if (new_owner.NumTypeParameters() > 0) { 6649 if (new_owner.NumTypeParameters() > 0) {
6643 // Adjust uninstantiated types to refer to type parameters of the new owner. 6650 // Adjust uninstantiated types to refer to type parameters of the new owner.
6644 const TypeArguments& type_params = 6651 const TypeArguments& type_params =
6645 TypeArguments::Handle(zone, type_parameters()); 6652 TypeArguments::Handle(zone, type_parameters());
6646 if (!type_params.IsNull()) { 6653 if (!type_params.IsNull()) {
6647 const intptr_t num_type_params = type_params.Length(); 6654 const intptr_t num_type_params = type_params.Length();
6648 const TypeArguments& type_params_clone = 6655 const TypeArguments& type_params_clone =
6649 TypeArguments::Handle(zone, TypeArguments::New(num_type_params)); 6656 TypeArguments::Handle(zone, TypeArguments::New(num_type_params));
6650 TypeParameter& type_param = TypeParameter::Handle(zone); 6657 TypeParameter& type_param = TypeParameter::Handle(zone);
6651 for (intptr_t i = 0; i < num_type_params; i++) { 6658 for (intptr_t i = 0; i < num_type_params; i++) {
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
6815 param_type = Type::DynamicType(); 6822 param_type = Type::DynamicType();
6816 closure_function.SetParameterTypeAt(0, param_type); 6823 closure_function.SetParameterTypeAt(0, param_type);
6817 closure_function.SetParameterNameAt(0, Symbols::ClosureParameter()); 6824 closure_function.SetParameterNameAt(0, Symbols::ClosureParameter());
6818 for (int i = kClosure; i < num_params; i++) { 6825 for (int i = kClosure; i < num_params; i++) {
6819 param_type = ParameterTypeAt(has_receiver - kClosure + i); 6826 param_type = ParameterTypeAt(has_receiver - kClosure + i);
6820 closure_function.SetParameterTypeAt(i, param_type); 6827 closure_function.SetParameterTypeAt(i, param_type);
6821 param_name = ParameterNameAt(has_receiver - kClosure + i); 6828 param_name = ParameterNameAt(has_receiver - kClosure + i);
6822 closure_function.SetParameterNameAt(i, param_name); 6829 closure_function.SetParameterNameAt(i, param_name);
6823 } 6830 }
6824 closure_function.set_kernel_offset(kernel_offset()); 6831 closure_function.set_kernel_offset(kernel_offset());
6832 closure_function.set_kernel_body(TypedData::Handle(zone, kernel_body()));
6825 6833
6826 const Type& signature_type = 6834 const Type& signature_type =
6827 Type::Handle(zone, closure_function.SignatureType()); 6835 Type::Handle(zone, closure_function.SignatureType());
6828 if (!signature_type.IsFinalized()) { 6836 if (!signature_type.IsFinalized()) {
6829 ClassFinalizer::FinalizeType(Class::Handle(zone, Owner()), signature_type); 6837 ClassFinalizer::FinalizeType(Class::Handle(zone, Owner()), signature_type);
6830 } 6838 }
6831 set_implicit_closure_function(closure_function); 6839 set_implicit_closure_function(closure_function);
6832 ASSERT(closure_function.IsImplicitClosureFunction()); 6840 ASSERT(closure_function.IsImplicitClosureFunction());
6833 return closure_function.raw(); 6841 return closure_function.raw();
6834 } 6842 }
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after
7690 bool Field::IsSetterName(const String& function_name) { 7698 bool Field::IsSetterName(const String& function_name) {
7691 return function_name.StartsWith(Symbols::SetterPrefix()); 7699 return function_name.StartsWith(Symbols::SetterPrefix());
7692 } 7700 }
7693 7701
7694 void Field::set_name(const String& value) const { 7702 void Field::set_name(const String& value) const {
7695 ASSERT(value.IsSymbol()); 7703 ASSERT(value.IsSymbol());
7696 ASSERT(IsOriginal()); 7704 ASSERT(IsOriginal());
7697 StorePointer(&raw_ptr()->name_, value.raw()); 7705 StorePointer(&raw_ptr()->name_, value.raw());
7698 } 7706 }
7699 7707
7708 void Field::set_kernel_body(const TypedData& data) const {
7709 StorePointer(&raw_ptr()->kernel_body_, data.raw());
7710 }
7711
7700 RawObject* Field::RawOwner() const { 7712 RawObject* Field::RawOwner() const {
7701 if (IsOriginal()) { 7713 if (IsOriginal()) {
7702 return raw_ptr()->owner_; 7714 return raw_ptr()->owner_;
7703 } else { 7715 } else {
7704 const Field& field = Field::Handle(Original()); 7716 const Field& field = Field::Handle(Original());
7705 ASSERT(field.IsOriginal()); 7717 ASSERT(field.IsOriginal());
7706 ASSERT(!Object::Handle(field.raw_ptr()->owner_).IsField()); 7718 ASSERT(!Object::Handle(field.raw_ptr()->owner_).IsField());
7707 return field.raw_ptr()->owner_; 7719 return field.raw_ptr()->owner_;
7708 } 7720 }
7709 } 7721 }
(...skipping 1244 matching lines...) Expand 10 before | Expand all | Expand 10 after
8954 ASSERT(kind < Token::kNumTokens); 8966 ASSERT(kind < Token::kNumTokens);
8955 return Symbols::Token(kind).raw(); 8967 return Symbols::Token(kind).raw();
8956 } else { 8968 } else {
8957 ASSERT(obj.IsLiteralToken()); // Must be a literal token. 8969 ASSERT(obj.IsLiteralToken()); // Must be a literal token.
8958 const LiteralToken& literal_token = LiteralToken::Cast(obj); 8970 const LiteralToken& literal_token = LiteralToken::Cast(obj);
8959 return literal_token.literal(); 8971 return literal_token.literal();
8960 } 8972 }
8961 } 8973 }
8962 8974
8963 bool Script::HasSource() const { 8975 bool Script::HasSource() const {
8964 #if !defined(DART_PRECOMPILED_RUNTIME)
8965 return kind() == RawScript::kKernelTag ||
8966 raw_ptr()->source_ != String::null();
8967 #else // !defined(DART_PRECOMPILED_RUNTIME)
8968 return raw_ptr()->source_ != String::null(); 8976 return raw_ptr()->source_ != String::null();
8969 #endif // !defined(DART_PRECOMPILED_RUNTIME)
8970 } 8977 }
8971 8978
8972 RawString* Script::Source() const { 8979 RawString* Script::Source() const {
8973 String& source = String::Handle(raw_ptr()->source_); 8980 String& source = String::Handle(raw_ptr()->source_);
8974 if (source.IsNull()) { 8981 if (source.IsNull()) {
8975 return GenerateSource(); 8982 return GenerateSource();
8976 } 8983 }
8977 return raw_ptr()->source_; 8984 return raw_ptr()->source_;
8978 } 8985 }
8979 8986
8980 RawString* Script::GenerateSource() const { 8987 RawString* Script::GenerateSource() const {
8981 #if !defined(DART_PRECOMPILED_RUNTIME)
8982 if (kind() == RawScript::kKernelTag) {
8983 String& source = String::Handle(raw_ptr()->source_);
8984 if (source.IsNull()) {
8985 // This is created lazily. Now we need it.
8986 set_source(kernel::GetSourceFor(*this));
8987 }
8988 return raw_ptr()->source_;
8989 }
8990 #endif // !defined(DART_PRECOMPILED_RUNTIME)
8991
8992 const TokenStream& token_stream = TokenStream::Handle(tokens()); 8988 const TokenStream& token_stream = TokenStream::Handle(tokens());
8993 if (token_stream.IsNull()) { 8989 if (token_stream.IsNull()) {
8994 ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT); 8990 ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT);
8995 return String::null(); 8991 return String::null();
8996 } 8992 }
8997 return token_stream.GenerateSource(); 8993 return token_stream.GenerateSource();
8998 } 8994 }
8999 8995
9000 void Script::set_compile_time_constants(const Array& value) const { 8996 void Script::set_compile_time_constants(const Array& value) const {
9001 StorePointer(&raw_ptr()->compile_time_constants_, value.raw()); 8997 StorePointer(&raw_ptr()->compile_time_constants_, value.raw());
9002 } 8998 }
9003 8999
9004 void Script::set_kernel_data(const uint8_t* kernel_data) const {
9005 StoreNonPointer(&raw_ptr()->kernel_data_, kernel_data);
9006 }
9007
9008 void Script::set_kernel_data_size(const intptr_t kernel_data_size) const {
9009 StoreNonPointer(&raw_ptr()->kernel_data_size_, kernel_data_size);
9010 }
9011
9012 void Script::set_kernel_script_index(const intptr_t kernel_script_index) const { 9000 void Script::set_kernel_script_index(const intptr_t kernel_script_index) const {
9013 StoreNonPointer(&raw_ptr()->kernel_script_index_, kernel_script_index); 9001 StoreNonPointer(&raw_ptr()->kernel_script_index_, kernel_script_index);
9014 } 9002 }
9015 9003
9016 void Script::set_kernel_string_offsets(const TypedData& offsets) const { 9004 void Script::set_kernel_string_offsets(const TypedData& offsets) const {
9017 StorePointer(&raw_ptr()->kernel_string_offsets_, offsets.raw()); 9005 StorePointer(&raw_ptr()->kernel_string_offsets_, offsets.raw());
9018 } 9006 }
9019 9007
9020 void Script::set_kernel_string_data(const TypedData& data) const { 9008 void Script::set_kernel_string_data(const TypedData& data) const {
9021 StorePointer(&raw_ptr()->kernel_string_data_, data.raw()); 9009 StorePointer(&raw_ptr()->kernel_string_data_, data.raw());
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
9204 Array& yields = Array::Handle(raw_ptr()->yield_positions_); 9192 Array& yields = Array::Handle(raw_ptr()->yield_positions_);
9205 if (yields.IsNull() && kind() == RawScript::kKernelTag) { 9193 if (yields.IsNull() && kind() == RawScript::kKernelTag) {
9206 // This is created lazily. Now we need it. 9194 // This is created lazily. Now we need it.
9207 kernel::CollectTokenPositionsFor(*this); 9195 kernel::CollectTokenPositionsFor(*this);
9208 } 9196 }
9209 #endif // !defined(DART_PRECOMPILED_RUNTIME) 9197 #endif // !defined(DART_PRECOMPILED_RUNTIME)
9210 return raw_ptr()->yield_positions_; 9198 return raw_ptr()->yield_positions_;
9211 } 9199 }
9212 9200
9213 RawArray* Script::line_starts() const { 9201 RawArray* Script::line_starts() const {
9214 #if !defined(DART_PRECOMPILED_RUNTIME)
9215 const Array& line_starts_array = Array::Handle(raw_ptr()->line_starts_);
9216 if (line_starts_array.IsNull() && kind() == RawScript::kKernelTag) {
9217 // This is created lazily. Now we need it.
9218 set_line_starts(kernel::GetLineStartsFor(*this));
9219 }
9220 #endif // !defined(DART_PRECOMPILED_RUNTIME)
9221 return raw_ptr()->line_starts_; 9202 return raw_ptr()->line_starts_;
9222 } 9203 }
9223 9204
9224 RawArray* Script::debug_positions() const { 9205 RawArray* Script::debug_positions() const {
9225 #if !defined(DART_PRECOMPILED_RUNTIME) 9206 #if !defined(DART_PRECOMPILED_RUNTIME)
9226 Array& debug_positions_array = Array::Handle(raw_ptr()->debug_positions_); 9207 Array& debug_positions_array = Array::Handle(raw_ptr()->debug_positions_);
9227 if (debug_positions_array.IsNull() && kind() == RawScript::kKernelTag) { 9208 if (debug_positions_array.IsNull() && kind() == RawScript::kKernelTag) {
9228 // This is created lazily. Now we need it. 9209 // This is created lazily. Now we need it.
9229 kernel::CollectTokenPositionsFor(*this); 9210 kernel::CollectTokenPositionsFor(*this);
9230 } 9211 }
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after
9952 GrowableHandlePtrArray<const String> pieces(zone, 3); 9933 GrowableHandlePtrArray<const String> pieces(zone, 3);
9953 pieces.Add(cname); 9934 pieces.Add(cname);
9954 pieces.Add(Symbols::At()); 9935 pieces.Add(Symbols::At());
9955 pieces.Add(String::Handle(param.name())); 9936 pieces.Add(String::Handle(param.name()));
9956 return Symbols::FromConcatAll(thread, pieces); 9937 return Symbols::FromConcatAll(thread, pieces);
9957 } 9938 }
9958 9939
9959 void Library::AddMetadata(const Object& owner, 9940 void Library::AddMetadata(const Object& owner,
9960 const String& name, 9941 const String& name,
9961 TokenPosition token_pos, 9942 TokenPosition token_pos,
9962 intptr_t kernel_offset) const { 9943 intptr_t kernel_offset,
9944 const TypedData* kernel_body) const {
9963 Thread* thread = Thread::Current(); 9945 Thread* thread = Thread::Current();
9964 ASSERT(thread->IsMutatorThread()); 9946 ASSERT(thread->IsMutatorThread());
9965 Zone* zone = thread->zone(); 9947 Zone* zone = thread->zone();
9966 const String& metaname = String::Handle(zone, Symbols::New(thread, name)); 9948 const String& metaname = String::Handle(zone, Symbols::New(thread, name));
9967 const Field& field = 9949 const Field& field =
9968 Field::Handle(zone, Field::NewTopLevel(metaname, 9950 Field::Handle(zone, Field::NewTopLevel(metaname,
9969 false, // is_final 9951 false, // is_final
9970 false, // is_const 9952 false, // is_const
9971 owner, token_pos)); 9953 owner, token_pos));
9972 field.SetFieldType(Object::dynamic_type()); 9954 field.SetFieldType(Object::dynamic_type());
9973 field.set_is_reflectable(false); 9955 field.set_is_reflectable(false);
9974 field.SetStaticValue(Array::empty_array(), true); 9956 field.SetStaticValue(Array::empty_array(), true);
9975 field.set_kernel_offset(kernel_offset); 9957 field.set_kernel_offset(kernel_offset);
9958 if (kernel_body != NULL) {
9959 field.set_kernel_body(*kernel_body);
9960 }
9976 GrowableObjectArray& metadata = 9961 GrowableObjectArray& metadata =
9977 GrowableObjectArray::Handle(zone, this->metadata()); 9962 GrowableObjectArray::Handle(zone, this->metadata());
9978 metadata.Add(field, Heap::kOld); 9963 metadata.Add(field, Heap::kOld);
9979 } 9964 }
9980 9965
9981 void Library::AddClassMetadata(const Class& cls, 9966 void Library::AddClassMetadata(const Class& cls,
9982 const Object& tl_owner, 9967 const Object& tl_owner,
9983 TokenPosition token_pos, 9968 TokenPosition token_pos,
9984 intptr_t kernel_offset) const { 9969 intptr_t kernel_offset,
9970 const TypedData* kernel_body) const {
9985 Thread* thread = Thread::Current(); 9971 Thread* thread = Thread::Current();
9986 Zone* zone = thread->zone(); 9972 Zone* zone = thread->zone();
9987 // We use the toplevel class as the owner of a class's metadata field because 9973 // We use the toplevel class as the owner of a class's metadata field because
9988 // a class's metadata is in scope of the library, not the class. 9974 // a class's metadata is in scope of the library, not the class.
9989 AddMetadata(tl_owner, 9975 AddMetadata(tl_owner,
9990 String::Handle(zone, MakeClassMetaName(thread, zone, cls)), 9976 String::Handle(zone, MakeClassMetaName(thread, zone, cls)),
9991 token_pos, kernel_offset); 9977 token_pos, kernel_offset, kernel_body);
9992 } 9978 }
9993 9979
9994 void Library::AddFieldMetadata(const Field& field, 9980 void Library::AddFieldMetadata(const Field& field,
9995 TokenPosition token_pos, 9981 TokenPosition token_pos,
9996 intptr_t kernel_offset) const { 9982 intptr_t kernel_offset,
9983 const TypedData* kernel_body) const {
9997 Thread* thread = Thread::Current(); 9984 Thread* thread = Thread::Current();
9998 Zone* zone = thread->zone(); 9985 Zone* zone = thread->zone();
9999 AddMetadata(Object::Handle(zone, field.RawOwner()), 9986 AddMetadata(Object::Handle(zone, field.RawOwner()),
10000 String::Handle(zone, MakeFieldMetaName(thread, zone, field)), 9987 String::Handle(zone, MakeFieldMetaName(thread, zone, field)),
10001 token_pos, kernel_offset); 9988 token_pos, kernel_offset, kernel_body);
10002 } 9989 }
10003 9990
10004 void Library::AddFunctionMetadata(const Function& func, 9991 void Library::AddFunctionMetadata(const Function& func,
10005 TokenPosition token_pos, 9992 TokenPosition token_pos,
10006 intptr_t kernel_offset) const { 9993 intptr_t kernel_offset,
9994 const TypedData* kernel_body) const {
10007 Thread* thread = Thread::Current(); 9995 Thread* thread = Thread::Current();
10008 Zone* zone = thread->zone(); 9996 Zone* zone = thread->zone();
10009 AddMetadata(Object::Handle(zone, func.RawOwner()), 9997 AddMetadata(Object::Handle(zone, func.RawOwner()),
10010 String::Handle(zone, MakeFunctionMetaName(thread, zone, func)), 9998 String::Handle(zone, MakeFunctionMetaName(thread, zone, func)),
10011 token_pos, kernel_offset); 9999 token_pos, kernel_offset, kernel_body);
10012 } 10000 }
10013 10001
10014 void Library::AddTypeParameterMetadata(const TypeParameter& param, 10002 void Library::AddTypeParameterMetadata(const TypeParameter& param,
10015 TokenPosition token_pos) const { 10003 TokenPosition token_pos) const {
10016 Thread* thread = Thread::Current(); 10004 Thread* thread = Thread::Current();
10017 Zone* zone = thread->zone(); 10005 Zone* zone = thread->zone();
10018 AddMetadata( 10006 AddMetadata(
10019 Class::Handle(zone, param.parameterized_class()), 10007 Class::Handle(zone, param.parameterized_class()),
10020 String::Handle(zone, MakeTypeParameterMetaName(thread, zone, param)), 10008 String::Handle(zone, MakeTypeParameterMetaName(thread, zone, param)),
10021 token_pos); 10009 token_pos);
(...skipping 12524 matching lines...) Expand 10 before | Expand all | Expand 10 after
22546 } 22534 }
22547 return UserTag::null(); 22535 return UserTag::null();
22548 } 22536 }
22549 22537
22550 const char* UserTag::ToCString() const { 22538 const char* UserTag::ToCString() const {
22551 const String& tag_label = String::Handle(label()); 22539 const String& tag_label = String::Handle(label());
22552 return tag_label.ToCString(); 22540 return tag_label.ToCString();
22553 } 22541 }
22554 22542
22555 } // namespace dart 22543 } // namespace dart
OLDNEW
« runtime/vm/kernel_reader.cc ('K') | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698