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/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 1869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1880 invocation.set_parameter_names(Array::Handle(Array::New(desc.Count(), | 1880 invocation.set_parameter_names(Array::Handle(Array::New(desc.Count(), |
1881 Heap::kOld))); | 1881 Heap::kOld))); |
1882 // Receiver. | 1882 // Receiver. |
1883 invocation.SetParameterTypeAt(0, Type::Handle(Type::DynamicType())); | 1883 invocation.SetParameterTypeAt(0, Type::Handle(Type::DynamicType())); |
1884 invocation.SetParameterNameAt(0, Symbols::This()); | 1884 invocation.SetParameterNameAt(0, Symbols::This()); |
1885 // Remaining positional parameters. | 1885 // Remaining positional parameters. |
1886 intptr_t i = 1; | 1886 intptr_t i = 1; |
1887 for (; i < desc.PositionalCount(); i++) { | 1887 for (; i < desc.PositionalCount(); i++) { |
1888 invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); | 1888 invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); |
1889 char name[64]; | 1889 char name[64]; |
1890 OS::SNPrint(name, 64, ":p%"Pd, i); | 1890 OS::SNPrint(name, 64, ":p%" Pd, i); |
1891 invocation.SetParameterNameAt(i, String::Handle(Symbols::New(name))); | 1891 invocation.SetParameterNameAt(i, String::Handle(Symbols::New(name))); |
1892 } | 1892 } |
1893 | 1893 |
1894 // Named parameters. | 1894 // Named parameters. |
1895 for (; i < desc.Count(); i++) { | 1895 for (; i < desc.Count(); i++) { |
1896 invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); | 1896 invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); |
1897 intptr_t index = i - desc.PositionalCount(); | 1897 intptr_t index = i - desc.PositionalCount(); |
1898 invocation.SetParameterNameAt(i, String::Handle(desc.NameAt(index))); | 1898 invocation.SetParameterNameAt(i, String::Handle(desc.NameAt(index))); |
1899 } | 1899 } |
1900 invocation.set_result_type(Type::Handle(Type::DynamicType())); | 1900 invocation.set_result_type(Type::Handle(Type::DynamicType())); |
(...skipping 1461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3362 } | 3362 } |
3363 instantiated_array.SetTypeAt(i, type); | 3363 instantiated_array.SetTypeAt(i, type); |
3364 } | 3364 } |
3365 return instantiated_array.raw(); | 3365 return instantiated_array.raw(); |
3366 } | 3366 } |
3367 | 3367 |
3368 | 3368 |
3369 RawTypeArguments* TypeArguments::New(intptr_t len, Heap::Space space) { | 3369 RawTypeArguments* TypeArguments::New(intptr_t len, Heap::Space space) { |
3370 if (len < 0 || len > kMaxElements) { | 3370 if (len < 0 || len > kMaxElements) { |
3371 // This should be caught before we reach here. | 3371 // This should be caught before we reach here. |
3372 FATAL1("Fatal error in TypeArguments::New: invalid len %"Pd"\n", len); | 3372 FATAL1("Fatal error in TypeArguments::New: invalid len %" Pd "\n", len); |
3373 } | 3373 } |
3374 TypeArguments& result = TypeArguments::Handle(); | 3374 TypeArguments& result = TypeArguments::Handle(); |
3375 { | 3375 { |
3376 RawObject* raw = Object::Allocate(TypeArguments::kClassId, | 3376 RawObject* raw = Object::Allocate(TypeArguments::kClassId, |
3377 TypeArguments::InstanceSize(len), | 3377 TypeArguments::InstanceSize(len), |
3378 space); | 3378 space); |
3379 NoGCScope no_gc; | 3379 NoGCScope no_gc; |
3380 result ^= raw; | 3380 result ^= raw; |
3381 // Length must be set before we start storing into the array. | 3381 // Length must be set before we start storing into the array. |
3382 result.SetLength(len); | 3382 result.SetLength(len); |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3690 // Optimized code object might have been actually fully produced by the | 3690 // Optimized code object might have been actually fully produced by the |
3691 // intrinsifier in this case nothing has to be done. In fact an attempt to | 3691 // intrinsifier in this case nothing has to be done. In fact an attempt to |
3692 // patch such code will cause crash. | 3692 // patch such code will cause crash. |
3693 // TODO(vegorov): if intrisifier can fully intrisify the function then we | 3693 // TODO(vegorov): if intrisifier can fully intrisify the function then we |
3694 // should not later try to optimize it. | 3694 // should not later try to optimize it. |
3695 if (PcDescriptors::Handle(current_code.pc_descriptors()).Length() == 0) { | 3695 if (PcDescriptors::Handle(current_code.pc_descriptors()).Length() == 0) { |
3696 return; | 3696 return; |
3697 } | 3697 } |
3698 | 3698 |
3699 if (FLAG_trace_disabling_optimized_code) { | 3699 if (FLAG_trace_disabling_optimized_code) { |
3700 OS::Print("Disabling optimized code: '%s' entry: %#"Px"\n", | 3700 OS::Print("Disabling optimized code: '%s' entry: %#" Px "\n", |
3701 ToFullyQualifiedCString(), | 3701 ToFullyQualifiedCString(), |
3702 current_code.EntryPoint()); | 3702 current_code.EntryPoint()); |
3703 } | 3703 } |
3704 // Patch entry of the optimized code. | 3704 // Patch entry of the optimized code. |
3705 CodePatcher::PatchEntry(current_code); | 3705 CodePatcher::PatchEntry(current_code); |
3706 // Use previously compiled unoptimized code. | 3706 // Use previously compiled unoptimized code. |
3707 SetCode(Code::Handle(unoptimized_code())); | 3707 SetCode(Code::Handle(unoptimized_code())); |
3708 CodePatcher::RestoreEntry(Code::Handle(unoptimized_code())); | 3708 CodePatcher::RestoreEntry(Code::Handle(unoptimized_code())); |
3709 } | 3709 } |
3710 | 3710 |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4166 | 4166 |
4167 bool Function::AreValidArgumentCounts(intptr_t num_arguments, | 4167 bool Function::AreValidArgumentCounts(intptr_t num_arguments, |
4168 intptr_t num_named_arguments, | 4168 intptr_t num_named_arguments, |
4169 String* error_message) const { | 4169 String* error_message) const { |
4170 if (num_named_arguments > NumOptionalNamedParameters()) { | 4170 if (num_named_arguments > NumOptionalNamedParameters()) { |
4171 if (error_message != NULL) { | 4171 if (error_message != NULL) { |
4172 const intptr_t kMessageBufferSize = 64; | 4172 const intptr_t kMessageBufferSize = 64; |
4173 char message_buffer[kMessageBufferSize]; | 4173 char message_buffer[kMessageBufferSize]; |
4174 OS::SNPrint(message_buffer, | 4174 OS::SNPrint(message_buffer, |
4175 kMessageBufferSize, | 4175 kMessageBufferSize, |
4176 "%"Pd" named passed, at most %"Pd" expected", | 4176 "%" Pd " named passed, at most %" Pd " expected", |
4177 num_named_arguments, | 4177 num_named_arguments, |
4178 NumOptionalNamedParameters()); | 4178 NumOptionalNamedParameters()); |
4179 *error_message = String::New(message_buffer); | 4179 *error_message = String::New(message_buffer); |
4180 } | 4180 } |
4181 return false; // Too many named arguments. | 4181 return false; // Too many named arguments. |
4182 } | 4182 } |
4183 const int num_pos_args = num_arguments - num_named_arguments; | 4183 const int num_pos_args = num_arguments - num_named_arguments; |
4184 const int num_opt_pos_params = NumOptionalPositionalParameters(); | 4184 const int num_opt_pos_params = NumOptionalPositionalParameters(); |
4185 const int num_pos_params = num_fixed_parameters() + num_opt_pos_params; | 4185 const int num_pos_params = num_fixed_parameters() + num_opt_pos_params; |
4186 if (num_pos_args > num_pos_params) { | 4186 if (num_pos_args > num_pos_params) { |
4187 if (error_message != NULL) { | 4187 if (error_message != NULL) { |
4188 const intptr_t kMessageBufferSize = 64; | 4188 const intptr_t kMessageBufferSize = 64; |
4189 char message_buffer[kMessageBufferSize]; | 4189 char message_buffer[kMessageBufferSize]; |
4190 // Hide implicit parameters to the user. | 4190 // Hide implicit parameters to the user. |
4191 const intptr_t num_hidden_params = NumImplicitParameters(); | 4191 const intptr_t num_hidden_params = NumImplicitParameters(); |
4192 OS::SNPrint(message_buffer, | 4192 OS::SNPrint(message_buffer, |
4193 kMessageBufferSize, | 4193 kMessageBufferSize, |
4194 "%"Pd"%s passed, %s%"Pd" expected", | 4194 "%" Pd "%s passed, %s%" Pd " expected", |
4195 num_pos_args - num_hidden_params, | 4195 num_pos_args - num_hidden_params, |
4196 num_opt_pos_params > 0 ? " positional" : "", | 4196 num_opt_pos_params > 0 ? " positional" : "", |
4197 num_opt_pos_params > 0 ? "at most " : "", | 4197 num_opt_pos_params > 0 ? "at most " : "", |
4198 num_pos_params - num_hidden_params); | 4198 num_pos_params - num_hidden_params); |
4199 *error_message = String::New(message_buffer); | 4199 *error_message = String::New(message_buffer); |
4200 } | 4200 } |
4201 return false; // Too many fixed and/or positional arguments. | 4201 return false; // Too many fixed and/or positional arguments. |
4202 } | 4202 } |
4203 if (num_pos_args < num_fixed_parameters()) { | 4203 if (num_pos_args < num_fixed_parameters()) { |
4204 if (error_message != NULL) { | 4204 if (error_message != NULL) { |
4205 const intptr_t kMessageBufferSize = 64; | 4205 const intptr_t kMessageBufferSize = 64; |
4206 char message_buffer[kMessageBufferSize]; | 4206 char message_buffer[kMessageBufferSize]; |
4207 // Hide implicit parameters to the user. | 4207 // Hide implicit parameters to the user. |
4208 const intptr_t num_hidden_params = NumImplicitParameters(); | 4208 const intptr_t num_hidden_params = NumImplicitParameters(); |
4209 OS::SNPrint(message_buffer, | 4209 OS::SNPrint(message_buffer, |
4210 kMessageBufferSize, | 4210 kMessageBufferSize, |
4211 "%"Pd"%s passed, %s%"Pd" expected", | 4211 "%" Pd "%s passed, %s%" Pd " expected", |
4212 num_pos_args - num_hidden_params, | 4212 num_pos_args - num_hidden_params, |
4213 num_opt_pos_params > 0 ? " positional" : "", | 4213 num_opt_pos_params > 0 ? " positional" : "", |
4214 num_opt_pos_params > 0 ? "at least " : "", | 4214 num_opt_pos_params > 0 ? "at least " : "", |
4215 num_fixed_parameters() - num_hidden_params); | 4215 num_fixed_parameters() - num_hidden_params); |
4216 *error_message = String::New(message_buffer); | 4216 *error_message = String::New(message_buffer); |
4217 } | 4217 } |
4218 return false; // Too few fixed and/or positional arguments. | 4218 return false; // Too few fixed and/or positional arguments. |
4219 } | 4219 } |
4220 return true; | 4220 return true; |
4221 } | 4221 } |
(...skipping 1520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5742 RawObject* raw = Object::Allocate(TokenStream::kClassId, | 5742 RawObject* raw = Object::Allocate(TokenStream::kClassId, |
5743 TokenStream::InstanceSize(), | 5743 TokenStream::InstanceSize(), |
5744 Heap::kOld); | 5744 Heap::kOld); |
5745 return reinterpret_cast<RawTokenStream*>(raw); | 5745 return reinterpret_cast<RawTokenStream*>(raw); |
5746 } | 5746 } |
5747 | 5747 |
5748 | 5748 |
5749 RawTokenStream* TokenStream::New(intptr_t len) { | 5749 RawTokenStream* TokenStream::New(intptr_t len) { |
5750 if (len < 0 || len > kMaxElements) { | 5750 if (len < 0 || len > kMaxElements) { |
5751 // This should be caught before we reach here. | 5751 // This should be caught before we reach here. |
5752 FATAL1("Fatal error in TokenStream::New: invalid len %"Pd"\n", len); | 5752 FATAL1("Fatal error in TokenStream::New: invalid len %" Pd "\n", len); |
5753 } | 5753 } |
5754 uint8_t* data = reinterpret_cast<uint8_t*>(::malloc(len)); | 5754 uint8_t* data = reinterpret_cast<uint8_t*>(::malloc(len)); |
5755 ASSERT(data != NULL); | 5755 ASSERT(data != NULL); |
5756 const ExternalTypedData& stream = ExternalTypedData::Handle( | 5756 const ExternalTypedData& stream = ExternalTypedData::Handle( |
5757 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, | 5757 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, |
5758 data, len, Heap::kOld)); | 5758 data, len, Heap::kOld)); |
5759 stream.AddFinalizer(data, DataFinalizer); | 5759 stream.AddFinalizer(data, DataFinalizer); |
5760 const TokenStream& result = TokenStream::Handle(TokenStream::New()); | 5760 const TokenStream& result = TokenStream::Handle(TokenStream::New()); |
5761 result.SetStream(stream); | 5761 result.SetStream(stream); |
5762 return result.raw(); | 5762 return result.raw(); |
(...skipping 1950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7713 OS::Print("\n"); | 7713 OS::Print("\n"); |
7714 FATAL("Fingerprint mismatch."); | 7714 FATAL("Fingerprint mismatch."); |
7715 } | 7715 } |
7716 } | 7716 } |
7717 | 7717 |
7718 | 7718 |
7719 RawInstructions* Instructions::New(intptr_t size) { | 7719 RawInstructions* Instructions::New(intptr_t size) { |
7720 ASSERT(Object::instructions_class() != Class::null()); | 7720 ASSERT(Object::instructions_class() != Class::null()); |
7721 if (size < 0 || size > kMaxElements) { | 7721 if (size < 0 || size > kMaxElements) { |
7722 // This should be caught before we reach here. | 7722 // This should be caught before we reach here. |
7723 FATAL1("Fatal error in Instructions::New: invalid size %"Pd"\n", size); | 7723 FATAL1("Fatal error in Instructions::New: invalid size %" Pd "\n", size); |
7724 } | 7724 } |
7725 Instructions& result = Instructions::Handle(); | 7725 Instructions& result = Instructions::Handle(); |
7726 { | 7726 { |
7727 uword aligned_size = Instructions::InstanceSize(size); | 7727 uword aligned_size = Instructions::InstanceSize(size); |
7728 RawObject* raw = Object::Allocate(Instructions::kClassId, | 7728 RawObject* raw = Object::Allocate(Instructions::kClassId, |
7729 aligned_size, | 7729 aligned_size, |
7730 Heap::kCode); | 7730 Heap::kCode); |
7731 NoGCScope no_gc; | 7731 NoGCScope no_gc; |
7732 result ^= raw; | 7732 result ^= raw; |
7733 result.set_size(size); | 7733 result.set_size(size); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7807 void PcDescriptors::SetTryIndex(intptr_t index, intptr_t value) const { | 7807 void PcDescriptors::SetTryIndex(intptr_t index, intptr_t value) const { |
7808 *(EntryAddr(index, kTryIndexEntry)) = value; | 7808 *(EntryAddr(index, kTryIndexEntry)) = value; |
7809 } | 7809 } |
7810 | 7810 |
7811 | 7811 |
7812 RawPcDescriptors* PcDescriptors::New(intptr_t num_descriptors) { | 7812 RawPcDescriptors* PcDescriptors::New(intptr_t num_descriptors) { |
7813 ASSERT(Object::pc_descriptors_class() != Class::null()); | 7813 ASSERT(Object::pc_descriptors_class() != Class::null()); |
7814 if (num_descriptors < 0 || num_descriptors > kMaxElements) { | 7814 if (num_descriptors < 0 || num_descriptors > kMaxElements) { |
7815 // This should be caught before we reach here. | 7815 // This should be caught before we reach here. |
7816 FATAL1("Fatal error in PcDescriptors::New: " | 7816 FATAL1("Fatal error in PcDescriptors::New: " |
7817 "invalid num_descriptors %"Pd"\n", num_descriptors); | 7817 "invalid num_descriptors %" Pd "\n", num_descriptors); |
7818 } | 7818 } |
7819 PcDescriptors& result = PcDescriptors::Handle(); | 7819 PcDescriptors& result = PcDescriptors::Handle(); |
7820 { | 7820 { |
7821 uword size = PcDescriptors::InstanceSize(num_descriptors); | 7821 uword size = PcDescriptors::InstanceSize(num_descriptors); |
7822 RawObject* raw = Object::Allocate(PcDescriptors::kClassId, | 7822 RawObject* raw = Object::Allocate(PcDescriptors::kClassId, |
7823 size, | 7823 size, |
7824 Heap::kOld); | 7824 Heap::kOld); |
7825 NoGCScope no_gc; | 7825 NoGCScope no_gc; |
7826 result ^= raw; | 7826 result ^= raw; |
7827 result.SetLength(num_descriptors); | 7827 result.SetLength(num_descriptors); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7862 | 7862 |
7863 const char* PcDescriptors::ToCString() const { | 7863 const char* PcDescriptors::ToCString() const { |
7864 if (Length() == 0) { | 7864 if (Length() == 0) { |
7865 return "No pc descriptors\n"; | 7865 return "No pc descriptors\n"; |
7866 } | 7866 } |
7867 // 4 bits per hex digit. | 7867 // 4 bits per hex digit. |
7868 const int addr_width = kBitsPerWord / 4; | 7868 const int addr_width = kBitsPerWord / 4; |
7869 // "*" in a printf format specifier tells it to read the field width from | 7869 // "*" in a printf format specifier tells it to read the field width from |
7870 // the printf argument list. | 7870 // the printf argument list. |
7871 const char* kFormat = | 7871 const char* kFormat = |
7872 "%#-*"Px"\t%s\t%"Pd"\t\t%"Pd"\t%"Pd"\n"; | 7872 "%#-*" Px "\t%s\t%" Pd "\t\t%" Pd "\t%" Pd "\n"; |
7873 // First compute the buffer size required. | 7873 // First compute the buffer size required. |
7874 intptr_t len = 1; // Trailing '\0'. | 7874 intptr_t len = 1; // Trailing '\0'. |
7875 for (intptr_t i = 0; i < Length(); i++) { | 7875 for (intptr_t i = 0; i < Length(); i++) { |
7876 len += OS::SNPrint(NULL, 0, kFormat, addr_width, | 7876 len += OS::SNPrint(NULL, 0, kFormat, addr_width, |
7877 PC(i), | 7877 PC(i), |
7878 KindAsStr(i), | 7878 KindAsStr(i), |
7879 DeoptId(i), | 7879 DeoptId(i), |
7880 TokenPos(i), | 7880 TokenPos(i), |
7881 TryIndex(i)); | 7881 TryIndex(i)); |
7882 } | 7882 } |
(...skipping 23 matching lines...) Expand all Loading... |
7906 // - No two deopt descriptors have the same deoptimization id. | 7906 // - No two deopt descriptors have the same deoptimization id. |
7907 // - No two ic-call descriptors have the same deoptimization id (type feedback). | 7907 // - No two ic-call descriptors have the same deoptimization id (type feedback). |
7908 // A function without unique ids is marked as non-optimizable (e.g., because of | 7908 // A function without unique ids is marked as non-optimizable (e.g., because of |
7909 // finally blocks). | 7909 // finally blocks). |
7910 void PcDescriptors::Verify(const Function& function) const { | 7910 void PcDescriptors::Verify(const Function& function) const { |
7911 #if defined(DEBUG) | 7911 #if defined(DEBUG) |
7912 // TODO(srdjan): Implement a more efficient way to check, currently drop | 7912 // TODO(srdjan): Implement a more efficient way to check, currently drop |
7913 // the check for too large number of descriptors. | 7913 // the check for too large number of descriptors. |
7914 if (Length() > 3000) { | 7914 if (Length() > 3000) { |
7915 if (FLAG_trace_compiler) { | 7915 if (FLAG_trace_compiler) { |
7916 OS::Print("Not checking pc decriptors, length %"Pd"\n", Length()); | 7916 OS::Print("Not checking pc decriptors, length %" Pd "\n", Length()); |
7917 } | 7917 } |
7918 return; | 7918 return; |
7919 } | 7919 } |
7920 // Only check ids for unoptimized code that is optimizable. | 7920 // Only check ids for unoptimized code that is optimizable. |
7921 if (!function.is_optimizable()) return; | 7921 if (!function.is_optimizable()) return; |
7922 for (intptr_t i = 0; i < Length(); i++) { | 7922 for (intptr_t i = 0; i < Length(); i++) { |
7923 PcDescriptors::Kind kind = DescriptorKind(i); | 7923 PcDescriptors::Kind kind = DescriptorKind(i); |
7924 // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind. | 7924 // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind. |
7925 intptr_t deopt_id = Isolate::kNoDeoptId; | 7925 intptr_t deopt_id = Isolate::kNoDeoptId; |
7926 if ((DescriptorKind(i) != PcDescriptors::kDeopt) || | 7926 if ((DescriptorKind(i) != PcDescriptors::kDeopt) || |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7994 ASSERT(bmap != NULL); | 7994 ASSERT(bmap != NULL); |
7995 Stackmap& result = Stackmap::Handle(); | 7995 Stackmap& result = Stackmap::Handle(); |
7996 // Guard against integer overflow of the instance size computation. | 7996 // Guard against integer overflow of the instance size computation. |
7997 intptr_t length = bmap->Length(); | 7997 intptr_t length = bmap->Length(); |
7998 intptr_t payload_size = | 7998 intptr_t payload_size = |
7999 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; | 7999 Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte; |
8000 if ((payload_size < 0) || | 8000 if ((payload_size < 0) || |
8001 (payload_size > | 8001 (payload_size > |
8002 (kSmiMax - static_cast<intptr_t>(sizeof(RawStackmap))))) { | 8002 (kSmiMax - static_cast<intptr_t>(sizeof(RawStackmap))))) { |
8003 // This should be caught before we reach here. | 8003 // This should be caught before we reach here. |
8004 FATAL1("Fatal error in Stackmap::New: invalid length %"Pd"\n", | 8004 FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n", |
8005 length); | 8005 length); |
8006 } | 8006 } |
8007 { | 8007 { |
8008 // Stackmap data objects are associated with a code object, allocate them | 8008 // Stackmap data objects are associated with a code object, allocate them |
8009 // in old generation. | 8009 // in old generation. |
8010 RawObject* raw = Object::Allocate(Stackmap::kClassId, | 8010 RawObject* raw = Object::Allocate(Stackmap::kClassId, |
8011 Stackmap::InstanceSize(length), | 8011 Stackmap::InstanceSize(length), |
8012 Heap::kOld); | 8012 Heap::kOld); |
8013 NoGCScope no_gc; | 8013 NoGCScope no_gc; |
8014 result ^= raw; | 8014 result ^= raw; |
8015 result.SetLength(length); | 8015 result.SetLength(length); |
8016 } | 8016 } |
8017 // When constructing a stackmap we store the pc offset in the stackmap's | 8017 // When constructing a stackmap we store the pc offset in the stackmap's |
8018 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc | 8018 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc |
8019 // address. | 8019 // address. |
8020 ASSERT(pc_offset >= 0); | 8020 ASSERT(pc_offset >= 0); |
8021 result.SetPC(pc_offset); | 8021 result.SetPC(pc_offset); |
8022 for (intptr_t i = 0; i < length; ++i) { | 8022 for (intptr_t i = 0; i < length; ++i) { |
8023 result.SetBit(i, bmap->Get(i)); | 8023 result.SetBit(i, bmap->Get(i)); |
8024 } | 8024 } |
8025 result.SetRegisterBitCount(register_bit_count); | 8025 result.SetRegisterBitCount(register_bit_count); |
8026 return result.raw(); | 8026 return result.raw(); |
8027 } | 8027 } |
8028 | 8028 |
8029 | 8029 |
8030 const char* Stackmap::ToCString() const { | 8030 const char* Stackmap::ToCString() const { |
8031 if (IsNull()) { | 8031 if (IsNull()) { |
8032 return "{null}"; | 8032 return "{null}"; |
8033 } else { | 8033 } else { |
8034 const char* kFormat = "%#"Px": "; | 8034 const char* kFormat = "%#" Px ": "; |
8035 intptr_t fixed_length = OS::SNPrint(NULL, 0, kFormat, PC()) + 1; | 8035 intptr_t fixed_length = OS::SNPrint(NULL, 0, kFormat, PC()) + 1; |
8036 Isolate* isolate = Isolate::Current(); | 8036 Isolate* isolate = Isolate::Current(); |
8037 // Guard against integer overflow in the computation of alloc_size. | 8037 // Guard against integer overflow in the computation of alloc_size. |
8038 // | 8038 // |
8039 // TODO(kmillikin): We could just truncate the string if someone | 8039 // TODO(kmillikin): We could just truncate the string if someone |
8040 // tries to print a 2 billion plus entry stackmap. | 8040 // tries to print a 2 billion plus entry stackmap. |
8041 if (Length() > (kIntptrMax - fixed_length)) { | 8041 if (Length() > (kIntptrMax - fixed_length)) { |
8042 FATAL1("Length() is unexpectedly large (%"Pd")", Length()); | 8042 FATAL1("Length() is unexpectedly large (%" Pd ")", Length()); |
8043 } | 8043 } |
8044 intptr_t alloc_size = fixed_length + Length(); | 8044 intptr_t alloc_size = fixed_length + Length(); |
8045 char* chars = isolate->current_zone()->Alloc<char>(alloc_size); | 8045 char* chars = isolate->current_zone()->Alloc<char>(alloc_size); |
8046 intptr_t index = OS::SNPrint(chars, alloc_size, kFormat, PC()); | 8046 intptr_t index = OS::SNPrint(chars, alloc_size, kFormat, PC()); |
8047 for (intptr_t i = 0; i < Length(); i++) { | 8047 for (intptr_t i = 0; i < Length(); i++) { |
8048 chars[index++] = IsObject(i) ? '1' : '0'; | 8048 chars[index++] = IsObject(i) ? '1' : '0'; |
8049 } | 8049 } |
8050 chars[index] = '\0'; | 8050 chars[index] = '\0'; |
8051 return chars; | 8051 return chars; |
8052 } | 8052 } |
(...skipping 30 matching lines...) Expand all Loading... |
8083 void LocalVarDescriptors::GetInfo(intptr_t var_index, | 8083 void LocalVarDescriptors::GetInfo(intptr_t var_index, |
8084 RawLocalVarDescriptors::VarInfo* info) const { | 8084 RawLocalVarDescriptors::VarInfo* info) const { |
8085 ASSERT(var_index < Length()); | 8085 ASSERT(var_index < Length()); |
8086 *info = raw_ptr()->data_[var_index]; | 8086 *info = raw_ptr()->data_[var_index]; |
8087 } | 8087 } |
8088 | 8088 |
8089 | 8089 |
8090 const char* LocalVarDescriptors::ToCString() const { | 8090 const char* LocalVarDescriptors::ToCString() const { |
8091 intptr_t len = 1; // Trailing '\0'. | 8091 intptr_t len = 1; // Trailing '\0'. |
8092 const char* kFormat = | 8092 const char* kFormat = |
8093 "%2"Pd" kind=%d scope=0x%04x begin=%"Pd" end=%"Pd" name=%s\n"; | 8093 "%2" Pd " kind=%d scope=0x%04x begin=%" Pd " end=%" Pd " name=%s\n"; |
8094 for (intptr_t i = 0; i < Length(); i++) { | 8094 for (intptr_t i = 0; i < Length(); i++) { |
8095 String& var_name = String::Handle(GetName(i)); | 8095 String& var_name = String::Handle(GetName(i)); |
8096 RawLocalVarDescriptors::VarInfo info; | 8096 RawLocalVarDescriptors::VarInfo info; |
8097 GetInfo(i, &info); | 8097 GetInfo(i, &info); |
8098 len += OS::SNPrint(NULL, 0, kFormat, | 8098 len += OS::SNPrint(NULL, 0, kFormat, |
8099 i, | 8099 i, |
8100 info.kind, | 8100 info.kind, |
8101 info.scope_id, | 8101 info.scope_id, |
8102 info.begin_pos, | 8102 info.begin_pos, |
8103 info.end_pos, | 8103 info.end_pos, |
(...skipping 24 matching lines...) Expand all Loading... |
8128 stream->OpenObject(); | 8128 stream->OpenObject(); |
8129 stream->CloseObject(); | 8129 stream->CloseObject(); |
8130 } | 8130 } |
8131 | 8131 |
8132 | 8132 |
8133 RawLocalVarDescriptors* LocalVarDescriptors::New(intptr_t num_variables) { | 8133 RawLocalVarDescriptors* LocalVarDescriptors::New(intptr_t num_variables) { |
8134 ASSERT(Object::var_descriptors_class() != Class::null()); | 8134 ASSERT(Object::var_descriptors_class() != Class::null()); |
8135 if (num_variables < 0 || num_variables > kMaxElements) { | 8135 if (num_variables < 0 || num_variables > kMaxElements) { |
8136 // This should be caught before we reach here. | 8136 // This should be caught before we reach here. |
8137 FATAL1("Fatal error in LocalVarDescriptors::New: " | 8137 FATAL1("Fatal error in LocalVarDescriptors::New: " |
8138 "invalid num_variables %"Pd"\n", num_variables); | 8138 "invalid num_variables %" Pd "\n", num_variables); |
8139 } | 8139 } |
8140 LocalVarDescriptors& result = LocalVarDescriptors::Handle(); | 8140 LocalVarDescriptors& result = LocalVarDescriptors::Handle(); |
8141 { | 8141 { |
8142 uword size = LocalVarDescriptors::InstanceSize(num_variables); | 8142 uword size = LocalVarDescriptors::InstanceSize(num_variables); |
8143 RawObject* raw = Object::Allocate(LocalVarDescriptors::kClassId, | 8143 RawObject* raw = Object::Allocate(LocalVarDescriptors::kClassId, |
8144 size, | 8144 size, |
8145 Heap::kOld); | 8145 Heap::kOld); |
8146 NoGCScope no_gc; | 8146 NoGCScope no_gc; |
8147 result ^= raw; | 8147 result ^= raw; |
8148 result.raw_ptr()->length_ = num_variables; | 8148 result.raw_ptr()->length_ = num_variables; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8214 | 8214 |
8215 void ExceptionHandlers::set_handled_types_data(const Array& value) const { | 8215 void ExceptionHandlers::set_handled_types_data(const Array& value) const { |
8216 StorePointer(&raw_ptr()->handled_types_data_, value.raw()); | 8216 StorePointer(&raw_ptr()->handled_types_data_, value.raw()); |
8217 } | 8217 } |
8218 | 8218 |
8219 | 8219 |
8220 RawExceptionHandlers* ExceptionHandlers::New(intptr_t num_handlers) { | 8220 RawExceptionHandlers* ExceptionHandlers::New(intptr_t num_handlers) { |
8221 ASSERT(Object::exception_handlers_class() != Class::null()); | 8221 ASSERT(Object::exception_handlers_class() != Class::null()); |
8222 if (num_handlers < 0 || num_handlers >= kMaxHandlers) { | 8222 if (num_handlers < 0 || num_handlers >= kMaxHandlers) { |
8223 FATAL1("Fatal error in ExceptionHandlers::New(): " | 8223 FATAL1("Fatal error in ExceptionHandlers::New(): " |
8224 "invalid num_handlers %"Pd"\n", | 8224 "invalid num_handlers %" Pd "\n", |
8225 num_handlers); | 8225 num_handlers); |
8226 } | 8226 } |
8227 ExceptionHandlers& result = ExceptionHandlers::Handle(); | 8227 ExceptionHandlers& result = ExceptionHandlers::Handle(); |
8228 { | 8228 { |
8229 uword size = ExceptionHandlers::InstanceSize(num_handlers); | 8229 uword size = ExceptionHandlers::InstanceSize(num_handlers); |
8230 RawObject* raw = Object::Allocate(ExceptionHandlers::kClassId, | 8230 RawObject* raw = Object::Allocate(ExceptionHandlers::kClassId, |
8231 size, | 8231 size, |
8232 Heap::kOld); | 8232 Heap::kOld); |
8233 NoGCScope no_gc; | 8233 NoGCScope no_gc; |
8234 result ^= raw; | 8234 result ^= raw; |
8235 result.raw_ptr()->length_ = num_handlers; | 8235 result.raw_ptr()->length_ = num_handlers; |
8236 } | 8236 } |
8237 const Array& handled_types_data = Array::Handle(Array::New(num_handlers)); | 8237 const Array& handled_types_data = Array::Handle(Array::New(num_handlers)); |
8238 result.set_handled_types_data(handled_types_data); | 8238 result.set_handled_types_data(handled_types_data); |
8239 return result.raw(); | 8239 return result.raw(); |
8240 } | 8240 } |
8241 | 8241 |
8242 | 8242 |
8243 const char* ExceptionHandlers::ToCString() const { | 8243 const char* ExceptionHandlers::ToCString() const { |
8244 if (Length() == 0) { | 8244 if (Length() == 0) { |
8245 return "No exception handlers\n"; | 8245 return "No exception handlers\n"; |
8246 } | 8246 } |
8247 Array& handled_types = Array::Handle(); | 8247 Array& handled_types = Array::Handle(); |
8248 Type& type = Type::Handle(); | 8248 Type& type = Type::Handle(); |
8249 RawExceptionHandlers::HandlerInfo info; | 8249 RawExceptionHandlers::HandlerInfo info; |
8250 // First compute the buffer size required. | 8250 // First compute the buffer size required. |
8251 const char* kFormat = "%"Pd" => %#"Px" (%"Pd" types) (outer %"Pd")\n"; | 8251 const char* kFormat = "%" Pd " => %#" Px " (%" Pd |
| 8252 " types) (outer %" Pd ")\n"; |
8252 const char* kFormat2 = " %d. %s\n"; | 8253 const char* kFormat2 = " %d. %s\n"; |
8253 intptr_t len = 1; // Trailing '\0'. | 8254 intptr_t len = 1; // Trailing '\0'. |
8254 for (intptr_t i = 0; i < Length(); i++) { | 8255 for (intptr_t i = 0; i < Length(); i++) { |
8255 GetHandlerInfo(i, &info); | 8256 GetHandlerInfo(i, &info); |
8256 handled_types = GetHandledTypes(i); | 8257 handled_types = GetHandledTypes(i); |
8257 ASSERT(!handled_types.IsNull()); | 8258 ASSERT(!handled_types.IsNull()); |
8258 intptr_t num_types = handled_types.Length(); | 8259 intptr_t num_types = handled_types.Length(); |
8259 len += OS::SNPrint(NULL, 0, kFormat, | 8260 len += OS::SNPrint(NULL, 0, kFormat, |
8260 i, | 8261 i, |
8261 info.handler_pc, | 8262 info.handler_pc, |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8427 intptr_t from_index) const { | 8428 intptr_t from_index) const { |
8428 *(EntryAddr(index, kInstruction)) = instr_kind; | 8429 *(EntryAddr(index, kInstruction)) = instr_kind; |
8429 *(EntryAddr(index, kFromIndex)) = from_index; | 8430 *(EntryAddr(index, kFromIndex)) = from_index; |
8430 } | 8431 } |
8431 | 8432 |
8432 | 8433 |
8433 Code::Comments& Code::Comments::New(intptr_t count) { | 8434 Code::Comments& Code::Comments::New(intptr_t count) { |
8434 Comments* comments; | 8435 Comments* comments; |
8435 if (count < 0 || count > (kIntptrMax / kNumberOfEntries)) { | 8436 if (count < 0 || count > (kIntptrMax / kNumberOfEntries)) { |
8436 // This should be caught before we reach here. | 8437 // This should be caught before we reach here. |
8437 FATAL1("Fatal error in Code::Comments::New: invalid count %"Pd"\n", count); | 8438 FATAL1("Fatal error in Code::Comments::New: invalid count %" Pd "\n", |
| 8439 count); |
8438 } | 8440 } |
8439 if (count == 0) { | 8441 if (count == 0) { |
8440 comments = new Comments(Object::empty_array()); | 8442 comments = new Comments(Object::empty_array()); |
8441 } else { | 8443 } else { |
8442 const Array& data = | 8444 const Array& data = |
8443 Array::Handle(Array::New(count * kNumberOfEntries, Heap::kOld)); | 8445 Array::Handle(Array::New(count * kNumberOfEntries, Heap::kOld)); |
8444 comments = new Comments(data); | 8446 comments = new Comments(data); |
8445 } | 8447 } |
8446 return *comments; | 8448 return *comments; |
8447 } | 8449 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8601 | 8603 |
8602 void Code::set_comments(const Code::Comments& comments) const { | 8604 void Code::set_comments(const Code::Comments& comments) const { |
8603 ASSERT(comments.comments_.IsOld()); | 8605 ASSERT(comments.comments_.IsOld()); |
8604 StorePointer(&raw_ptr()->comments_, comments.comments_.raw()); | 8606 StorePointer(&raw_ptr()->comments_, comments.comments_.raw()); |
8605 } | 8607 } |
8606 | 8608 |
8607 | 8609 |
8608 RawCode* Code::New(intptr_t pointer_offsets_length) { | 8610 RawCode* Code::New(intptr_t pointer_offsets_length) { |
8609 if (pointer_offsets_length < 0 || pointer_offsets_length > kMaxElements) { | 8611 if (pointer_offsets_length < 0 || pointer_offsets_length > kMaxElements) { |
8610 // This should be caught before we reach here. | 8612 // This should be caught before we reach here. |
8611 FATAL1("Fatal error in Code::New: invalid pointer_offsets_length %"Pd"\n", | 8613 FATAL1("Fatal error in Code::New: invalid pointer_offsets_length %" Pd "\n", |
8612 pointer_offsets_length); | 8614 pointer_offsets_length); |
8613 } | 8615 } |
8614 ASSERT(Object::code_class() != Class::null()); | 8616 ASSERT(Object::code_class() != Class::null()); |
8615 Code& result = Code::Handle(); | 8617 Code& result = Code::Handle(); |
8616 { | 8618 { |
8617 uword size = Code::InstanceSize(pointer_offsets_length); | 8619 uword size = Code::InstanceSize(pointer_offsets_length); |
8618 RawObject* raw = Object::Allocate(Code::kClassId, size, Heap::kOld); | 8620 RawObject* raw = Object::Allocate(Code::kClassId, size, Heap::kOld); |
8619 NoGCScope no_gc; | 8621 NoGCScope no_gc; |
8620 result ^= raw; | 8622 result ^= raw; |
8621 result.set_pointer_offsets_length(pointer_offsets_length); | 8623 result.set_pointer_offsets_length(pointer_offsets_length); |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8891 return Stackmap::null(); | 8893 return Stackmap::null(); |
8892 } | 8894 } |
8893 | 8895 |
8894 | 8896 |
8895 RawContext* Context::New(intptr_t num_variables, Heap::Space space) { | 8897 RawContext* Context::New(intptr_t num_variables, Heap::Space space) { |
8896 ASSERT(num_variables >= 0); | 8898 ASSERT(num_variables >= 0); |
8897 ASSERT(Object::context_class() != Class::null()); | 8899 ASSERT(Object::context_class() != Class::null()); |
8898 | 8900 |
8899 if (num_variables < 0 || num_variables > kMaxElements) { | 8901 if (num_variables < 0 || num_variables > kMaxElements) { |
8900 // This should be caught before we reach here. | 8902 // This should be caught before we reach here. |
8901 FATAL1("Fatal error in Context::New: invalid num_variables %"Pd"\n", | 8903 FATAL1("Fatal error in Context::New: invalid num_variables %" Pd "\n", |
8902 num_variables); | 8904 num_variables); |
8903 } | 8905 } |
8904 Context& result = Context::Handle(); | 8906 Context& result = Context::Handle(); |
8905 { | 8907 { |
8906 RawObject* raw = Object::Allocate(Context::kClassId, | 8908 RawObject* raw = Object::Allocate(Context::kClassId, |
8907 Context::InstanceSize(num_variables), | 8909 Context::InstanceSize(num_variables), |
8908 space); | 8910 space); |
8909 NoGCScope no_gc; | 8911 NoGCScope no_gc; |
8910 result ^= raw; | 8912 result ^= raw; |
8911 result.set_num_variables(num_variables); | 8913 result.set_num_variables(num_variables); |
(...skipping 11 matching lines...) Expand all Loading... |
8923 void Context::PrintToJSONStream(JSONStream* stream, bool ref) const { | 8925 void Context::PrintToJSONStream(JSONStream* stream, bool ref) const { |
8924 stream->OpenObject(); | 8926 stream->OpenObject(); |
8925 stream->CloseObject(); | 8927 stream->CloseObject(); |
8926 } | 8928 } |
8927 | 8929 |
8928 | 8930 |
8929 RawContextScope* ContextScope::New(intptr_t num_variables) { | 8931 RawContextScope* ContextScope::New(intptr_t num_variables) { |
8930 ASSERT(Object::context_scope_class() != Class::null()); | 8932 ASSERT(Object::context_scope_class() != Class::null()); |
8931 if (num_variables < 0 || num_variables > kMaxElements) { | 8933 if (num_variables < 0 || num_variables > kMaxElements) { |
8932 // This should be caught before we reach here. | 8934 // This should be caught before we reach here. |
8933 FATAL1("Fatal error in ContextScope::New: invalid num_variables %"Pd"\n", | 8935 FATAL1("Fatal error in ContextScope::New: invalid num_variables %" Pd "\n", |
8934 num_variables); | 8936 num_variables); |
8935 } | 8937 } |
8936 intptr_t size = ContextScope::InstanceSize(num_variables); | 8938 intptr_t size = ContextScope::InstanceSize(num_variables); |
8937 ContextScope& result = ContextScope::Handle(); | 8939 ContextScope& result = ContextScope::Handle(); |
8938 { | 8940 { |
8939 RawObject* raw = Object::Allocate(ContextScope::kClassId, | 8941 RawObject* raw = Object::Allocate(ContextScope::kClassId, |
8940 size, | 8942 size, |
8941 Heap::kOld); | 8943 Heap::kOld); |
8942 NoGCScope no_gc; | 8944 NoGCScope no_gc; |
8943 result ^= raw; | 8945 result ^= raw; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9040 } | 9042 } |
9041 | 9043 |
9042 | 9044 |
9043 void ContextScope::PrintToJSONStream(JSONStream* stream, bool ref) const { | 9045 void ContextScope::PrintToJSONStream(JSONStream* stream, bool ref) const { |
9044 stream->OpenObject(); | 9046 stream->OpenObject(); |
9045 stream->CloseObject(); | 9047 stream->CloseObject(); |
9046 } | 9048 } |
9047 | 9049 |
9048 | 9050 |
9049 const char* ICData::ToCString() const { | 9051 const char* ICData::ToCString() const { |
9050 const char* kFormat = "ICData target:'%s' num-args: %"Pd" num-checks: %"Pd""; | 9052 const char* kFormat = "ICData target:'%s' num-args: %" Pd |
| 9053 " num-checks: %" Pd ""; |
9051 const String& name = String::Handle(target_name()); | 9054 const String& name = String::Handle(target_name()); |
9052 const intptr_t num_args = num_args_tested(); | 9055 const intptr_t num_args = num_args_tested(); |
9053 const intptr_t num_checks = NumberOfChecks(); | 9056 const intptr_t num_checks = NumberOfChecks(); |
9054 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString(), | 9057 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString(), |
9055 num_args, num_checks) + 1; | 9058 num_args, num_checks) + 1; |
9056 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 9059 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
9057 OS::SNPrint(chars, len, kFormat, name.ToCString(), num_args, num_checks); | 9060 OS::SNPrint(chars, len, kFormat, name.ToCString(), num_args, num_checks); |
9058 return chars; | 9061 return chars; |
9059 } | 9062 } |
9060 | 9063 |
(...skipping 3215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12276 if (this->IsNegative() == other.IsNegative()) { | 12279 if (this->IsNegative() == other.IsNegative()) { |
12277 return this->IsNegative() ? -1 : 1; | 12280 return this->IsNegative() ? -1 : 1; |
12278 } | 12281 } |
12279 return this->IsNegative() ? -1 : 1; | 12282 return this->IsNegative() ? -1 : 1; |
12280 } | 12283 } |
12281 | 12284 |
12282 | 12285 |
12283 RawBigint* Bigint::Allocate(intptr_t length, Heap::Space space) { | 12286 RawBigint* Bigint::Allocate(intptr_t length, Heap::Space space) { |
12284 if (length < 0 || length > kMaxElements) { | 12287 if (length < 0 || length > kMaxElements) { |
12285 // This should be caught before we reach here. | 12288 // This should be caught before we reach here. |
12286 FATAL1("Fatal error in Bigint::Allocate: invalid length %"Pd"\n", length); | 12289 FATAL1("Fatal error in Bigint::Allocate: invalid length %" Pd "\n", length); |
12287 } | 12290 } |
12288 ASSERT(Isolate::Current()->object_store()->bigint_class() != Class::null()); | 12291 ASSERT(Isolate::Current()->object_store()->bigint_class() != Class::null()); |
12289 Bigint& result = Bigint::Handle(); | 12292 Bigint& result = Bigint::Handle(); |
12290 { | 12293 { |
12291 RawObject* raw = Object::Allocate(Bigint::kClassId, | 12294 RawObject* raw = Object::Allocate(Bigint::kClassId, |
12292 Bigint::InstanceSize(length), | 12295 Bigint::InstanceSize(length), |
12293 space); | 12296 space); |
12294 NoGCScope no_gc; | 12297 NoGCScope no_gc; |
12295 result ^= raw; | 12298 result ^= raw; |
12296 result.raw_ptr()->allocated_length_ = length; // Chunk length allocated. | 12299 result.raw_ptr()->allocated_length_ = length; // Chunk length allocated. |
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13199 } | 13202 } |
13200 | 13203 |
13201 | 13204 |
13202 RawOneByteString* OneByteString::New(intptr_t len, | 13205 RawOneByteString* OneByteString::New(intptr_t len, |
13203 Heap::Space space) { | 13206 Heap::Space space) { |
13204 ASSERT(Isolate::Current() == Dart::vm_isolate() || | 13207 ASSERT(Isolate::Current() == Dart::vm_isolate() || |
13205 Isolate::Current()->object_store()->one_byte_string_class() != | 13208 Isolate::Current()->object_store()->one_byte_string_class() != |
13206 Class::null()); | 13209 Class::null()); |
13207 if (len < 0 || len > kMaxElements) { | 13210 if (len < 0 || len > kMaxElements) { |
13208 // This should be caught before we reach here. | 13211 // This should be caught before we reach here. |
13209 FATAL1("Fatal error in OneByteString::New: invalid len %"Pd"\n", len); | 13212 FATAL1("Fatal error in OneByteString::New: invalid len %" Pd "\n", len); |
13210 } | 13213 } |
13211 { | 13214 { |
13212 RawObject* raw = Object::Allocate(OneByteString::kClassId, | 13215 RawObject* raw = Object::Allocate(OneByteString::kClassId, |
13213 OneByteString::InstanceSize(len), | 13216 OneByteString::InstanceSize(len), |
13214 space); | 13217 space); |
13215 NoGCScope no_gc; | 13218 NoGCScope no_gc; |
13216 RawOneByteString* result = reinterpret_cast<RawOneByteString*>(raw); | 13219 RawOneByteString* result = reinterpret_cast<RawOneByteString*>(raw); |
13217 result->ptr()->length_ = Smi::New(len); | 13220 result->ptr()->length_ = Smi::New(len); |
13218 result->ptr()->hash_ = 0; | 13221 result->ptr()->hash_ = 0; |
13219 return result; | 13222 return result; |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13376 } | 13379 } |
13377 return TwoByteString::null(); | 13380 return TwoByteString::null(); |
13378 } | 13381 } |
13379 | 13382 |
13380 | 13383 |
13381 RawTwoByteString* TwoByteString::New(intptr_t len, | 13384 RawTwoByteString* TwoByteString::New(intptr_t len, |
13382 Heap::Space space) { | 13385 Heap::Space space) { |
13383 ASSERT(Isolate::Current()->object_store()->two_byte_string_class()); | 13386 ASSERT(Isolate::Current()->object_store()->two_byte_string_class()); |
13384 if (len < 0 || len > kMaxElements) { | 13387 if (len < 0 || len > kMaxElements) { |
13385 // This should be caught before we reach here. | 13388 // This should be caught before we reach here. |
13386 FATAL1("Fatal error in TwoByteString::New: invalid len %"Pd"\n", len); | 13389 FATAL1("Fatal error in TwoByteString::New: invalid len %" Pd "\n", len); |
13387 } | 13390 } |
13388 String& result = String::Handle(); | 13391 String& result = String::Handle(); |
13389 { | 13392 { |
13390 RawObject* raw = Object::Allocate(TwoByteString::kClassId, | 13393 RawObject* raw = Object::Allocate(TwoByteString::kClassId, |
13391 TwoByteString::InstanceSize(len), | 13394 TwoByteString::InstanceSize(len), |
13392 space); | 13395 space); |
13393 NoGCScope no_gc; | 13396 NoGCScope no_gc; |
13394 result ^= raw; | 13397 result ^= raw; |
13395 result.SetLength(len); | 13398 result.SetLength(len); |
13396 result.SetHash(0); | 13399 result.SetHash(0); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13505 RawExternalOneByteString* ExternalOneByteString::New( | 13508 RawExternalOneByteString* ExternalOneByteString::New( |
13506 const uint8_t* data, | 13509 const uint8_t* data, |
13507 intptr_t len, | 13510 intptr_t len, |
13508 void* peer, | 13511 void* peer, |
13509 Dart_PeerFinalizer callback, | 13512 Dart_PeerFinalizer callback, |
13510 Heap::Space space) { | 13513 Heap::Space space) { |
13511 ASSERT(Isolate::Current()->object_store()-> | 13514 ASSERT(Isolate::Current()->object_store()-> |
13512 external_one_byte_string_class() != Class::null()); | 13515 external_one_byte_string_class() != Class::null()); |
13513 if (len < 0 || len > kMaxElements) { | 13516 if (len < 0 || len > kMaxElements) { |
13514 // This should be caught before we reach here. | 13517 // This should be caught before we reach here. |
13515 FATAL1("Fatal error in ExternalOneByteString::New: invalid len %"Pd"\n", | 13518 FATAL1("Fatal error in ExternalOneByteString::New: invalid len %" Pd "\n", |
13516 len); | 13519 len); |
13517 } | 13520 } |
13518 String& result = String::Handle(); | 13521 String& result = String::Handle(); |
13519 ExternalStringData<uint8_t>* external_data = | 13522 ExternalStringData<uint8_t>* external_data = |
13520 new ExternalStringData<uint8_t>(data, peer, callback); | 13523 new ExternalStringData<uint8_t>(data, peer, callback); |
13521 { | 13524 { |
13522 RawObject* raw = Object::Allocate(ExternalOneByteString::kClassId, | 13525 RawObject* raw = Object::Allocate(ExternalOneByteString::kClassId, |
13523 ExternalOneByteString::InstanceSize(), | 13526 ExternalOneByteString::InstanceSize(), |
13524 space); | 13527 space); |
13525 NoGCScope no_gc; | 13528 NoGCScope no_gc; |
(...skipping 17 matching lines...) Expand all Loading... |
13543 RawExternalTwoByteString* ExternalTwoByteString::New( | 13546 RawExternalTwoByteString* ExternalTwoByteString::New( |
13544 const uint16_t* data, | 13547 const uint16_t* data, |
13545 intptr_t len, | 13548 intptr_t len, |
13546 void* peer, | 13549 void* peer, |
13547 Dart_PeerFinalizer callback, | 13550 Dart_PeerFinalizer callback, |
13548 Heap::Space space) { | 13551 Heap::Space space) { |
13549 ASSERT(Isolate::Current()->object_store()->external_two_byte_string_class() != | 13552 ASSERT(Isolate::Current()->object_store()->external_two_byte_string_class() != |
13550 Class::null()); | 13553 Class::null()); |
13551 if (len < 0 || len > kMaxElements) { | 13554 if (len < 0 || len > kMaxElements) { |
13552 // This should be caught before we reach here. | 13555 // This should be caught before we reach here. |
13553 FATAL1("Fatal error in ExternalTwoByteString::New: invalid len %"Pd"\n", | 13556 FATAL1("Fatal error in ExternalTwoByteString::New: invalid len %" Pd "\n", |
13554 len); | 13557 len); |
13555 } | 13558 } |
13556 String& result = String::Handle(); | 13559 String& result = String::Handle(); |
13557 ExternalStringData<uint16_t>* external_data = | 13560 ExternalStringData<uint16_t>* external_data = |
13558 new ExternalStringData<uint16_t>(data, peer, callback); | 13561 new ExternalStringData<uint16_t>(data, peer, callback); |
13559 { | 13562 { |
13560 RawObject* raw = Object::Allocate(ExternalTwoByteString::kClassId, | 13563 RawObject* raw = Object::Allocate(ExternalTwoByteString::kClassId, |
13561 ExternalTwoByteString::InstanceSize(), | 13564 ExternalTwoByteString::InstanceSize(), |
13562 space); | 13565 space); |
13563 NoGCScope no_gc; | 13566 NoGCScope no_gc; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13642 | 13645 |
13643 RawArray* Array::New(intptr_t len, Heap::Space space) { | 13646 RawArray* Array::New(intptr_t len, Heap::Space space) { |
13644 ASSERT(Isolate::Current()->object_store()->array_class() != Class::null()); | 13647 ASSERT(Isolate::Current()->object_store()->array_class() != Class::null()); |
13645 return New(kClassId, len, space); | 13648 return New(kClassId, len, space); |
13646 } | 13649 } |
13647 | 13650 |
13648 | 13651 |
13649 RawArray* Array::New(intptr_t class_id, intptr_t len, Heap::Space space) { | 13652 RawArray* Array::New(intptr_t class_id, intptr_t len, Heap::Space space) { |
13650 if (len < 0 || len > Array::kMaxElements) { | 13653 if (len < 0 || len > Array::kMaxElements) { |
13651 // This should be caught before we reach here. | 13654 // This should be caught before we reach here. |
13652 FATAL1("Fatal error in Array::New: invalid len %"Pd"\n", len); | 13655 FATAL1("Fatal error in Array::New: invalid len %" Pd "\n", len); |
13653 } | 13656 } |
13654 Array& result = Array::Handle(); | 13657 Array& result = Array::Handle(); |
13655 { | 13658 { |
13656 RawObject* raw = Object::Allocate(class_id, | 13659 RawObject* raw = Object::Allocate(class_id, |
13657 Array::InstanceSize(len), | 13660 Array::InstanceSize(len), |
13658 space); | 13661 space); |
13659 NoGCScope no_gc; | 13662 NoGCScope no_gc; |
13660 result ^= raw; | 13663 result ^= raw; |
13661 result.SetLength(len); | 13664 result.SetLength(len); |
13662 } | 13665 } |
13663 return result.raw(); | 13666 return result.raw(); |
13664 } | 13667 } |
13665 | 13668 |
13666 | 13669 |
13667 void Array::MakeImmutable() const { | 13670 void Array::MakeImmutable() const { |
13668 NoGCScope no_gc; | 13671 NoGCScope no_gc; |
13669 uword tags = raw_ptr()->tags_; | 13672 uword tags = raw_ptr()->tags_; |
13670 tags = RawObject::ClassIdTag::update(kImmutableArrayCid, tags); | 13673 tags = RawObject::ClassIdTag::update(kImmutableArrayCid, tags); |
13671 raw_ptr()->tags_ = tags; | 13674 raw_ptr()->tags_ = tags; |
13672 } | 13675 } |
13673 | 13676 |
13674 | 13677 |
13675 const char* Array::ToCString() const { | 13678 const char* Array::ToCString() const { |
13676 if (IsNull()) { | 13679 if (IsNull()) { |
13677 return IsImmutable() ? "ImmutableArray NULL" : "Array NULL"; | 13680 return IsImmutable() ? "ImmutableArray NULL" : "Array NULL"; |
13678 } | 13681 } |
13679 const char* format = !IsImmutable() ? "Array len:%"Pd"" : | 13682 const char* format = !IsImmutable() ? "Array len:%" Pd "" : |
13680 "Immutable Array len:%"Pd""; | 13683 "Immutable Array len:%" Pd ""; |
13681 intptr_t len = OS::SNPrint(NULL, 0, format, Length()) + 1; | 13684 intptr_t len = OS::SNPrint(NULL, 0, format, Length()) + 1; |
13682 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 13685 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
13683 OS::SNPrint(chars, len, format, Length()); | 13686 OS::SNPrint(chars, len, format, Length()); |
13684 return chars; | 13687 return chars; |
13685 } | 13688 } |
13686 | 13689 |
13687 | 13690 |
13688 void Array::PrintToJSONStream(JSONStream* stream, bool ref) const { | 13691 void Array::PrintToJSONStream(JSONStream* stream, bool ref) const { |
13689 stream->OpenObject(); | 13692 stream->OpenObject(); |
13690 stream->CloseObject(); | 13693 stream->CloseObject(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13749 // other instances to be canonical otherwise report error (return false). | 13752 // other instances to be canonical otherwise report error (return false). |
13750 for (intptr_t i = 0; i < Length(); i++) { | 13753 for (intptr_t i = 0; i < Length(); i++) { |
13751 obj = At(i); | 13754 obj = At(i); |
13752 if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) { | 13755 if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) { |
13753 if (obj.IsNumber() || obj.IsString()) { | 13756 if (obj.IsNumber() || obj.IsString()) { |
13754 obj = Instance::Cast(obj).CheckAndCanonicalize(NULL); | 13757 obj = Instance::Cast(obj).CheckAndCanonicalize(NULL); |
13755 ASSERT(!obj.IsNull()); | 13758 ASSERT(!obj.IsNull()); |
13756 this->SetAt(i, obj); | 13759 this->SetAt(i, obj); |
13757 } else { | 13760 } else { |
13758 ASSERT(error_str != NULL); | 13761 ASSERT(error_str != NULL); |
13759 const char* kFormat = "element at index %"Pd": %s\n"; | 13762 const char* kFormat = "element at index %" Pd ": %s\n"; |
13760 const intptr_t len = | 13763 const intptr_t len = |
13761 OS::SNPrint(NULL, 0, kFormat, i, obj.ToCString()) + 1; | 13764 OS::SNPrint(NULL, 0, kFormat, i, obj.ToCString()) + 1; |
13762 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 13765 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
13763 OS::SNPrint(chars, len, kFormat, i, obj.ToCString()); | 13766 OS::SNPrint(chars, len, kFormat, i, obj.ToCString()); |
13764 *error_str = chars; | 13767 *error_str = chars; |
13765 return false; | 13768 return false; |
13766 } | 13769 } |
13767 } | 13770 } |
13768 } | 13771 } |
13769 return true; | 13772 return true; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13881 result.SetData(array); | 13884 result.SetData(array); |
13882 } | 13885 } |
13883 return result.raw(); | 13886 return result.raw(); |
13884 } | 13887 } |
13885 | 13888 |
13886 | 13889 |
13887 const char* GrowableObjectArray::ToCString() const { | 13890 const char* GrowableObjectArray::ToCString() const { |
13888 if (IsNull()) { | 13891 if (IsNull()) { |
13889 return "GrowableObjectArray NULL"; | 13892 return "GrowableObjectArray NULL"; |
13890 } | 13893 } |
13891 const char* format = "GrowableObjectArray len:%"Pd""; | 13894 const char* format = "GrowableObjectArray len:%" Pd ""; |
13892 intptr_t len = OS::SNPrint(NULL, 0, format, Length()) + 1; | 13895 intptr_t len = OS::SNPrint(NULL, 0, format, Length()) + 1; |
13893 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 13896 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
13894 OS::SNPrint(chars, len, format, Length()); | 13897 OS::SNPrint(chars, len, format, Length()); |
13895 return chars; | 13898 return chars; |
13896 } | 13899 } |
13897 | 13900 |
13898 | 13901 |
13899 void GrowableObjectArray::PrintToJSONStream(JSONStream* stream, | 13902 void GrowableObjectArray::PrintToJSONStream(JSONStream* stream, |
13900 bool ref) const { | 13903 bool ref) const { |
13901 stream->OpenObject(); | 13904 stream->OpenObject(); |
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14487 void JSRegExp::set_num_bracket_expressions(intptr_t value) const { | 14490 void JSRegExp::set_num_bracket_expressions(intptr_t value) const { |
14488 raw_ptr()->num_bracket_expressions_ = Smi::New(value); | 14491 raw_ptr()->num_bracket_expressions_ = Smi::New(value); |
14489 } | 14492 } |
14490 | 14493 |
14491 | 14494 |
14492 RawJSRegExp* JSRegExp::New(intptr_t len, Heap::Space space) { | 14495 RawJSRegExp* JSRegExp::New(intptr_t len, Heap::Space space) { |
14493 ASSERT(Isolate::Current()->object_store()->jsregexp_class() != | 14496 ASSERT(Isolate::Current()->object_store()->jsregexp_class() != |
14494 Class::null()); | 14497 Class::null()); |
14495 if (len < 0 || len > kMaxElements) { | 14498 if (len < 0 || len > kMaxElements) { |
14496 // This should be caught before we reach here. | 14499 // This should be caught before we reach here. |
14497 FATAL1("Fatal error in JSRegexp::New: invalid len %"Pd"\n", len); | 14500 FATAL1("Fatal error in JSRegexp::New: invalid len %" Pd "\n", len); |
14498 } | 14501 } |
14499 JSRegExp& result = JSRegExp::Handle(); | 14502 JSRegExp& result = JSRegExp::Handle(); |
14500 { | 14503 { |
14501 RawObject* raw = Object::Allocate(JSRegExp::kClassId, | 14504 RawObject* raw = Object::Allocate(JSRegExp::kClassId, |
14502 JSRegExp::InstanceSize(len), | 14505 JSRegExp::InstanceSize(len), |
14503 space); | 14506 space); |
14504 NoGCScope no_gc; | 14507 NoGCScope no_gc; |
14505 result ^= raw; | 14508 result ^= raw; |
14506 result.set_type(kUnitialized); | 14509 result.set_type(kUnitialized); |
14507 result.set_flags(0); | 14510 result.set_flags(0); |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14661 } | 14664 } |
14662 | 14665 |
14663 | 14666 |
14664 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { | 14667 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { |
14665 stream->OpenObject(); | 14668 stream->OpenObject(); |
14666 stream->CloseObject(); | 14669 stream->CloseObject(); |
14667 } | 14670 } |
14668 | 14671 |
14669 | 14672 |
14670 } // namespace dart | 14673 } // namespace dart |
OLD | NEW |