Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 2655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2666 Function& invocation = Function::Handle( | 2666 Function& invocation = Function::Handle( |
| 2667 zone, Function::New( | 2667 zone, Function::New( |
| 2668 String::Handle(zone, Symbols::New(thread, target_name)), kind, | 2668 String::Handle(zone, Symbols::New(thread, target_name)), kind, |
| 2669 false, // Not static. | 2669 false, // Not static. |
| 2670 false, // Not const. | 2670 false, // Not const. |
| 2671 false, // Not abstract. | 2671 false, // Not abstract. |
| 2672 false, // Not external. | 2672 false, // Not external. |
| 2673 false, // Not native. | 2673 false, // Not native. |
| 2674 *this, TokenPosition::kMinSource)); | 2674 *this, TokenPosition::kMinSource)); |
| 2675 ArgumentsDescriptor desc(args_desc); | 2675 ArgumentsDescriptor desc(args_desc); |
| 2676 if (desc.TypeArgsLen() > 0) { | |
| 2677 // Make dispatcher function generic, since type arguments are passed. | |
| 2678 const TypeArguments& type_params = | |
| 2679 TypeArguments::Handle(zone, TypeArguments::New(desc.TypeArgsLen())); | |
| 2680 // TODO(regis): Can we leave the array uninitialized to save memory? | |
| 2681 invocation.set_type_parameters(type_params); | |
| 2682 } | |
| 2683 | |
| 2676 invocation.set_num_fixed_parameters(desc.PositionalCount()); | 2684 invocation.set_num_fixed_parameters(desc.PositionalCount()); |
| 2677 invocation.SetNumOptionalParameters(desc.NamedCount(), | 2685 invocation.SetNumOptionalParameters(desc.NamedCount(), |
| 2678 false); // Not positional. | 2686 false); // Not positional. |
| 2679 invocation.set_parameter_types( | 2687 invocation.set_parameter_types( |
| 2680 Array::Handle(zone, Array::New(desc.Count(), Heap::kOld))); | 2688 Array::Handle(zone, Array::New(desc.Count(), Heap::kOld))); |
| 2681 invocation.set_parameter_names( | 2689 invocation.set_parameter_names( |
| 2682 Array::Handle(zone, Array::New(desc.Count(), Heap::kOld))); | 2690 Array::Handle(zone, Array::New(desc.Count(), Heap::kOld))); |
| 2683 // Receiver. | 2691 // Receiver. |
| 2684 invocation.SetParameterTypeAt(0, Object::dynamic_type()); | 2692 invocation.SetParameterTypeAt(0, Object::dynamic_type()); |
| 2685 invocation.SetParameterNameAt(0, Symbols::This()); | 2693 invocation.SetParameterNameAt(0, Symbols::This()); |
| (...skipping 2142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4828 } | 4836 } |
| 4829 | 4837 |
| 4830 | 4838 |
| 4831 void TypeArguments::SetTypeAt(intptr_t index, const AbstractType& value) const { | 4839 void TypeArguments::SetTypeAt(intptr_t index, const AbstractType& value) const { |
| 4832 ASSERT(!IsCanonical()); | 4840 ASSERT(!IsCanonical()); |
| 4833 StorePointer(TypeAddr(index), value.raw()); | 4841 StorePointer(TypeAddr(index), value.raw()); |
| 4834 } | 4842 } |
| 4835 | 4843 |
| 4836 | 4844 |
| 4837 bool TypeArguments::IsResolved() const { | 4845 bool TypeArguments::IsResolved() const { |
| 4846 if (IsCanonical()) { | |
| 4847 return true; | |
| 4848 } | |
| 4838 AbstractType& type = AbstractType::Handle(); | 4849 AbstractType& type = AbstractType::Handle(); |
| 4839 const intptr_t num_types = Length(); | 4850 const intptr_t num_types = Length(); |
| 4840 for (intptr_t i = 0; i < num_types; i++) { | 4851 for (intptr_t i = 0; i < num_types; i++) { |
| 4841 type = TypeAt(i); | 4852 type = TypeAt(i); |
| 4842 if (!type.IsResolved()) { | 4853 if (!type.IsResolved()) { |
| 4843 return false; | 4854 return false; |
| 4844 } | 4855 } |
| 4845 } | 4856 } |
| 4846 return true; | 4857 return true; |
| 4847 } | 4858 } |
| (...skipping 8202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13050 void ICData::ResetSwitchable(Zone* zone) const { | 13061 void ICData::ResetSwitchable(Zone* zone) const { |
| 13051 ASSERT(NumArgsTested() == 1); | 13062 ASSERT(NumArgsTested() == 1); |
| 13052 set_ic_data_array(Array::Handle(zone, CachedEmptyICDataArray(1))); | 13063 set_ic_data_array(Array::Handle(zone, CachedEmptyICDataArray(1))); |
| 13053 } | 13064 } |
| 13054 | 13065 |
| 13055 | 13066 |
| 13056 const char* ICData::ToCString() const { | 13067 const char* ICData::ToCString() const { |
| 13057 const String& name = String::Handle(target_name()); | 13068 const String& name = String::Handle(target_name()); |
| 13058 const intptr_t num_args = NumArgsTested(); | 13069 const intptr_t num_args = NumArgsTested(); |
| 13059 const intptr_t num_checks = NumberOfChecks(); | 13070 const intptr_t num_checks = NumberOfChecks(); |
| 13071 const intptr_t type_args_len = TypeArgsLen(); | |
| 13060 return OS::SCreate(Thread::Current()->zone(), | 13072 return OS::SCreate(Thread::Current()->zone(), |
| 13061 "ICData target:'%s' num-args: %" Pd " num-checks: %" Pd "", | 13073 "ICData target:'%s' num-args: %" Pd " num-checks: %" Pd |
| 13062 name.ToCString(), num_args, num_checks); | 13074 " " |
| 13075 "type-args-len: %" Pd "", | |
| 13076 name.ToCString(), num_args, num_checks, type_args_len); | |
| 13063 } | 13077 } |
| 13064 | 13078 |
| 13065 | 13079 |
| 13066 RawFunction* ICData::Owner() const { | 13080 RawFunction* ICData::Owner() const { |
| 13067 Object& obj = Object::Handle(raw_ptr()->owner_); | 13081 Object& obj = Object::Handle(raw_ptr()->owner_); |
| 13068 if (obj.IsNull()) { | 13082 if (obj.IsNull()) { |
| 13069 ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT); | 13083 ASSERT(Dart::vm_snapshot_kind() == Snapshot::kFullAOT); |
| 13070 return Function::null(); | 13084 return Function::null(); |
| 13071 } else if (obj.IsFunction()) { | 13085 } else if (obj.IsFunction()) { |
| 13072 return Function::Cast(obj).raw(); | 13086 return Function::Cast(obj).raw(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13135 void ICData::set_tag(intptr_t value) const { | 13149 void ICData::set_tag(intptr_t value) const { |
| 13136 StoreNonPointer(&raw_ptr()->tag_, value); | 13150 StoreNonPointer(&raw_ptr()->tag_, value); |
| 13137 } | 13151 } |
| 13138 #endif | 13152 #endif |
| 13139 | 13153 |
| 13140 intptr_t ICData::NumArgsTested() const { | 13154 intptr_t ICData::NumArgsTested() const { |
| 13141 return NumArgsTestedBits::decode(raw_ptr()->state_bits_); | 13155 return NumArgsTestedBits::decode(raw_ptr()->state_bits_); |
| 13142 } | 13156 } |
| 13143 | 13157 |
| 13144 | 13158 |
| 13159 intptr_t ICData::TypeArgsLen() const { | |
| 13160 ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor())); | |
| 13161 return args_desc.TypeArgsLen(); | |
| 13162 } | |
| 13163 | |
| 13164 | |
| 13145 void ICData::SetNumArgsTested(intptr_t value) const { | 13165 void ICData::SetNumArgsTested(intptr_t value) const { |
| 13146 ASSERT(Utils::IsUint(2, value)); | 13166 ASSERT(Utils::IsUint(2, value)); |
| 13147 StoreNonPointer(&raw_ptr()->state_bits_, | 13167 StoreNonPointer(&raw_ptr()->state_bits_, |
| 13148 NumArgsTestedBits::update(value, raw_ptr()->state_bits_)); | 13168 NumArgsTestedBits::update(value, raw_ptr()->state_bits_)); |
| 13149 } | 13169 } |
| 13150 | 13170 |
| 13151 | 13171 |
| 13152 uint32_t ICData::DeoptReasons() const { | 13172 uint32_t ICData::DeoptReasons() const { |
| 13153 return DeoptReasonBits::decode(raw_ptr()->state_bits_); | 13173 return DeoptReasonBits::decode(raw_ptr()->state_bits_); |
| 13154 } | 13174 } |
| (...skipping 1519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14674 return Thread::Current()->zone()->PrintToString("Code(%s)", QualifiedName()); | 14694 return Thread::Current()->zone()->PrintToString("Code(%s)", QualifiedName()); |
| 14675 } | 14695 } |
| 14676 | 14696 |
| 14677 | 14697 |
| 14678 const char* Code::Name() const { | 14698 const char* Code::Name() const { |
| 14679 Zone* zone = Thread::Current()->zone(); | 14699 Zone* zone = Thread::Current()->zone(); |
| 14680 const Object& obj = Object::Handle(zone, owner()); | 14700 const Object& obj = Object::Handle(zone, owner()); |
| 14681 if (obj.IsNull()) { | 14701 if (obj.IsNull()) { |
| 14682 // Regular stub. | 14702 // Regular stub. |
| 14683 const char* name = StubCode::NameOfStub(UncheckedEntryPoint()); | 14703 const char* name = StubCode::NameOfStub(UncheckedEntryPoint()); |
| 14684 ASSERT(name != NULL); | 14704 if (name == NULL) { |
| 14705 return zone->PrintToString("[this stub]"); // Not yet recorded. | |
|
rmacnak
2017/06/14 00:14:20
ASSERT stub code not initialized? I think there's
regis
2017/06/14 21:02:04
I found this in the profiler:
StubCode::HasBeenIni
| |
| 14706 } | |
| 14685 return zone->PrintToString("[Stub] %s", name); | 14707 return zone->PrintToString("[Stub] %s", name); |
| 14686 } else if (obj.IsClass()) { | 14708 } else if (obj.IsClass()) { |
| 14687 // Allocation stub. | 14709 // Allocation stub. |
| 14688 String& cls_name = String::Handle(zone, Class::Cast(obj).ScrubbedName()); | 14710 String& cls_name = String::Handle(zone, Class::Cast(obj).ScrubbedName()); |
| 14689 ASSERT(!cls_name.IsNull()); | 14711 ASSERT(!cls_name.IsNull()); |
| 14690 return zone->PrintToString("[Stub] Allocate %s", cls_name.ToCString()); | 14712 return zone->PrintToString("[Stub] Allocate %s", cls_name.ToCString()); |
| 14691 } else { | 14713 } else { |
| 14692 ASSERT(obj.IsFunction()); | 14714 ASSERT(obj.IsFunction()); |
| 14693 // Dart function. | 14715 // Dart function. |
| 14694 const char* opt = is_optimized() ? "*" : ""; | 14716 const char* opt = is_optimized() ? "*" : ""; |
| (...skipping 1263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15958 const bool other_is_dart_function = instantiated_other.IsDartFunctionType(); | 15980 const bool other_is_dart_function = instantiated_other.IsDartFunctionType(); |
| 15959 if (other_is_dart_function || instantiated_other.IsFunctionType()) { | 15981 if (other_is_dart_function || instantiated_other.IsFunctionType()) { |
| 15960 // Check if this instance understands a call() method of a compatible type. | 15982 // Check if this instance understands a call() method of a compatible type. |
| 15961 Function& sig_fun = | 15983 Function& sig_fun = |
| 15962 Function::Handle(zone, cls.LookupCallFunctionForTypeTest()); | 15984 Function::Handle(zone, cls.LookupCallFunctionForTypeTest()); |
| 15963 if (!sig_fun.IsNull()) { | 15985 if (!sig_fun.IsNull()) { |
| 15964 if (other_is_dart_function) { | 15986 if (other_is_dart_function) { |
| 15965 return true; | 15987 return true; |
| 15966 } | 15988 } |
| 15967 if (!sig_fun.HasInstantiatedSignature()) { | 15989 if (!sig_fun.HasInstantiatedSignature()) { |
| 15990 // The following signature instantiation of sig_fun with its own type | |
| 15991 // parameters only works if sig_fun has no generic parent, which is | |
| 15992 // guaranteed to be the case, since the looked up call() function | |
| 15993 // cannot be nested. It is most probably not even generic. | |
| 15994 ASSERT(!sig_fun.HasGenericParent()); | |
| 15968 const TypeArguments& function_type_arguments = | 15995 const TypeArguments& function_type_arguments = |
| 15969 TypeArguments::Handle(zone, sig_fun.type_parameters()); | 15996 TypeArguments::Handle(zone, sig_fun.type_parameters()); |
| 15970 // No bound error possible, since the instance exists. | 15997 // No bound error possible, since the instance exists. |
| 15971 sig_fun = sig_fun.InstantiateSignatureFrom( | 15998 sig_fun = sig_fun.InstantiateSignatureFrom( |
| 15972 type_arguments, function_type_arguments, Heap::kOld); | 15999 type_arguments, function_type_arguments, Heap::kOld); |
| 15973 } | 16000 } |
| 15974 const Function& other_signature = | 16001 const Function& other_signature = |
| 15975 Function::Handle(zone, Type::Cast(instantiated_other).signature()); | 16002 Function::Handle(zone, Type::Cast(instantiated_other).signature()); |
| 15976 if (sig_fun.IsSubtypeOf(other_signature, bound_error, NULL, Heap::kOld)) { | 16003 if (sig_fun.IsSubtypeOf(other_signature, bound_error, NULL, Heap::kOld)) { |
| 15977 return true; | 16004 return true; |
| (...skipping 7398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 23376 return UserTag::null(); | 23403 return UserTag::null(); |
| 23377 } | 23404 } |
| 23378 | 23405 |
| 23379 | 23406 |
| 23380 const char* UserTag::ToCString() const { | 23407 const char* UserTag::ToCString() const { |
| 23381 const String& tag_label = String::Handle(label()); | 23408 const String& tag_label = String::Handle(label()); |
| 23382 return tag_label.ToCString(); | 23409 return tag_label.ToCString(); |
| 23383 } | 23410 } |
| 23384 | 23411 |
| 23385 } // namespace dart | 23412 } // namespace dart |
| OLD | NEW |