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 3048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3059 // Do not preserve the original implicit constructor, if any. | 3059 // Do not preserve the original implicit constructor, if any. |
3060 orig_implicit_ctor = Function::null(); | 3060 orig_implicit_ctor = Function::null(); |
3061 } | 3061 } |
3062 func.set_owner(patch_class); | 3062 func.set_owner(patch_class); |
3063 new_functions.Add(func); | 3063 new_functions.Add(func); |
3064 } | 3064 } |
3065 if (!orig_implicit_ctor.IsNull()) { | 3065 if (!orig_implicit_ctor.IsNull()) { |
3066 // Preserve the original implicit constructor. | 3066 // Preserve the original implicit constructor. |
3067 new_functions.Add(orig_implicit_ctor); | 3067 new_functions.Add(orig_implicit_ctor); |
3068 } | 3068 } |
3069 Array& new_list = Array::Handle(Array::MakeFixedLength(new_functions)); | 3069 Array& new_list = Array::Handle(Array::MakeArray(new_functions)); |
3070 SetFunctions(new_list); | 3070 SetFunctions(new_list); |
3071 | 3071 |
3072 // Merge the two list of fields. Raise an error when duplicates are found or | 3072 // Merge the two list of fields. Raise an error when duplicates are found or |
3073 // when a public field is being added. | 3073 // when a public field is being added. |
3074 orig_list = fields(); | 3074 orig_list = fields(); |
3075 orig_len = orig_list.Length(); | 3075 orig_len = orig_list.Length(); |
3076 patch_list = patch.fields(); | 3076 patch_list = patch.fields(); |
3077 patch_len = patch_list.Length(); | 3077 patch_len = patch_list.Length(); |
3078 | 3078 |
3079 Field& field = Field::Handle(); | 3079 Field& field = Field::Handle(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3123 for (intptr_t i = 0; i < num_formals; i++) { | 3123 for (intptr_t i = 0; i < num_formals; i++) { |
3124 if (i > 0) { | 3124 if (i > 0) { |
3125 src_pieces.Add(Symbols::CommaSpace()); | 3125 src_pieces.Add(Symbols::CommaSpace()); |
3126 } | 3126 } |
3127 piece ^= formal_params.At(i); | 3127 piece ^= formal_params.At(i); |
3128 src_pieces.Add(piece); | 3128 src_pieces.Add(piece); |
3129 } | 3129 } |
3130 src_pieces.Add(Symbols::RParenArrow()); | 3130 src_pieces.Add(Symbols::RParenArrow()); |
3131 src_pieces.Add(expr); | 3131 src_pieces.Add(expr); |
3132 src_pieces.Add(Symbols::Semicolon()); | 3132 src_pieces.Add(Symbols::Semicolon()); |
3133 return String::ConcatAll(Array::Handle(Array::MakeFixedLength(src_pieces))); | 3133 return String::ConcatAll(Array::Handle(Array::MakeArray(src_pieces))); |
3134 } | 3134 } |
3135 | 3135 |
3136 | 3136 |
3137 RawFunction* Function::EvaluateHelper(const Class& cls, | 3137 RawFunction* Function::EvaluateHelper(const Class& cls, |
3138 const String& expr, | 3138 const String& expr, |
3139 const Array& param_names, | 3139 const Array& param_names, |
3140 bool is_static) { | 3140 bool is_static) { |
3141 const String& func_src = | 3141 const String& func_src = |
3142 String::Handle(BuildClosureSource(param_names, expr)); | 3142 String::Handle(BuildClosureSource(param_names, expr)); |
3143 Script& script = Script::Handle(); | 3143 Script& script = Script::Handle(); |
(...skipping 5629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8773 if (curr == Token::kNEWLINE) { | 8773 if (curr == Token::kNEWLINE) { |
8774 for (int i = 0; i < indent; i++) { | 8774 for (int i = 0; i < indent; i++) { |
8775 literals.Add(Symbols::TwoSpaces()); | 8775 literals.Add(Symbols::TwoSpaces()); |
8776 } | 8776 } |
8777 } | 8777 } |
8778 | 8778 |
8779 // Setup for next iteration. | 8779 // Setup for next iteration. |
8780 prev = curr; | 8780 prev = curr; |
8781 curr = next; | 8781 curr = next; |
8782 } | 8782 } |
8783 const Array& source = Array::Handle(Array::MakeFixedLength(literals)); | 8783 const Array& source = Array::Handle(Array::MakeArray(literals)); |
8784 return String::ConcatAll(source); | 8784 return String::ConcatAll(source); |
8785 } | 8785 } |
8786 | 8786 |
8787 | 8787 |
8788 intptr_t TokenStream::ComputeSourcePosition(TokenPosition tok_pos) const { | 8788 intptr_t TokenStream::ComputeSourcePosition(TokenPosition tok_pos) const { |
8789 Zone* zone = Thread::Current()->zone(); | 8789 Zone* zone = Thread::Current()->zone(); |
8790 Iterator iterator(zone, *this, TokenPosition::kMinSource, | 8790 Iterator iterator(zone, *this, TokenPosition::kMinSource, |
8791 Iterator::kAllTokens); | 8791 Iterator::kAllTokens); |
8792 intptr_t src_pos = 0; | 8792 intptr_t src_pos = 0; |
8793 Token::Kind kind = iterator.CurrentTokenKind(); | 8793 Token::Kind kind = iterator.CurrentTokenKind(); |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9545 token_pos = Smi::New(0); | 9545 token_pos = Smi::New(0); |
9546 line_starts_list.Add(token_pos); | 9546 line_starts_list.Add(token_pos); |
9547 while (tkit.CurrentTokenKind() != Token::kEOS) { | 9547 while (tkit.CurrentTokenKind() != Token::kEOS) { |
9548 if (tkit.CurrentTokenKind() == Token::kNEWLINE) { | 9548 if (tkit.CurrentTokenKind() == Token::kNEWLINE) { |
9549 cur_line++; | 9549 cur_line++; |
9550 token_pos = Smi::New(tkit.CurrentPosition().value() + 1); | 9550 token_pos = Smi::New(tkit.CurrentPosition().value() + 1); |
9551 line_starts_list.Add(token_pos); | 9551 line_starts_list.Add(token_pos); |
9552 } | 9552 } |
9553 tkit.Advance(); | 9553 tkit.Advance(); |
9554 } | 9554 } |
9555 line_starts_array = Array::MakeFixedLength(line_starts_list); | 9555 line_starts_array = Array::MakeArray(line_starts_list); |
9556 set_line_starts(line_starts_array); | 9556 set_line_starts(line_starts_array); |
9557 } | 9557 } |
9558 | 9558 |
9559 ASSERT(line_starts_array.Length() > 0); | 9559 ASSERT(line_starts_array.Length() > 0); |
9560 intptr_t offset = target_token_pos.Pos(); | 9560 intptr_t offset = target_token_pos.Pos(); |
9561 intptr_t min = 0; | 9561 intptr_t min = 0; |
9562 intptr_t max = line_starts_array.Length() - 1; | 9562 intptr_t max = line_starts_array.Length() - 1; |
9563 | 9563 |
9564 // Binary search to find the line containing this offset. | 9564 // Binary search to find the line containing this offset. |
9565 while (min < max) { | 9565 while (min < max) { |
(...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10793 for (intptr_t j = 0; j < functions.Length(); j++) { | 10793 for (intptr_t j = 0; j < functions.Length(); j++) { |
10794 func ^= functions.At(j); | 10794 func ^= functions.At(j); |
10795 if (func.is_external()) { | 10795 if (func.is_external()) { |
10796 owner_script = func.script(); | 10796 owner_script = func.script(); |
10797 AddScriptIfUnique(scripts, owner_script); | 10797 AddScriptIfUnique(scripts, owner_script); |
10798 } | 10798 } |
10799 } | 10799 } |
10800 } | 10800 } |
10801 | 10801 |
10802 // Create the array of scripts and cache it in loaded_scripts_. | 10802 // Create the array of scripts and cache it in loaded_scripts_. |
10803 const Array& scripts_array = Array::Handle(Array::MakeFixedLength(scripts)); | 10803 const Array& scripts_array = Array::Handle(Array::MakeArray(scripts)); |
10804 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); | 10804 StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw()); |
10805 } | 10805 } |
10806 return loaded_scripts(); | 10806 return loaded_scripts(); |
10807 } | 10807 } |
10808 | 10808 |
10809 | 10809 |
10810 // TODO(hausner): we might want to add a script dictionary to the | 10810 // TODO(hausner): we might want to add a script dictionary to the |
10811 // library class to make this lookup faster. | 10811 // library class to make this lookup faster. |
10812 RawScript* Library::LookupScript(const String& url) const { | 10812 RawScript* Library::LookupScript(const String& url) const { |
10813 const intptr_t url_length = url.Length(); | 10813 const intptr_t url_length = url.Length(); |
(...skipping 11444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22258 ASSERT(new_length != len); // Unnecessary copying of array. | 22258 ASSERT(new_length != len); // Unnecessary copying of array. |
22259 PassiveObject& obj = PassiveObject::Handle(zone); | 22259 PassiveObject& obj = PassiveObject::Handle(zone); |
22260 for (int i = 0; i < len; i++) { | 22260 for (int i = 0; i < len; i++) { |
22261 obj = source.At(i); | 22261 obj = source.At(i); |
22262 result.SetAt(i, obj); | 22262 result.SetAt(i, obj); |
22263 } | 22263 } |
22264 return result.raw(); | 22264 return result.raw(); |
22265 } | 22265 } |
22266 | 22266 |
22267 | 22267 |
22268 RawArray* Array::MakeFixedLength(const GrowableObjectArray& growable_array, | 22268 RawArray* Array::MakeArray(const GrowableObjectArray& growable_array) { |
22269 bool unique) { | |
22270 ASSERT(!growable_array.IsNull()); | 22269 ASSERT(!growable_array.IsNull()); |
22271 Thread* thread = Thread::Current(); | |
22272 Zone* zone = thread->zone(); | |
22273 intptr_t used_len = growable_array.Length(); | 22270 intptr_t used_len = growable_array.Length(); |
22274 // Get the type arguments and prepare to copy them. | 22271 // Get the type arguments and prepare to copy them. |
22275 const TypeArguments& type_arguments = | 22272 const TypeArguments& type_arguments = |
22276 TypeArguments::Handle(growable_array.GetTypeArguments()); | 22273 TypeArguments::Handle(growable_array.GetTypeArguments()); |
22277 if (used_len == 0) { | 22274 if ((used_len == 0) && (type_arguments.IsNull())) { |
22278 if (type_arguments.IsNull() && !unique) { | 22275 // This is a raw List (as in no type arguments), so we can return the |
22279 // This is a raw List (as in no type arguments), so we can return the | 22276 // simple empty array. |
22280 // simple empty array. | 22277 return Object::empty_array().raw(); |
22281 return Object::empty_array().raw(); | |
22282 } | |
22283 | |
22284 // The backing array may be a shared instance, or may not have correct | |
22285 // type parameters. Create a new empty array. | |
22286 Heap::Space space = thread->IsMutatorThread() ? Heap::kNew : Heap::kOld; | |
22287 Array& array = Array::Handle(zone, Array::New(0, space)); | |
22288 array.SetTypeArguments(type_arguments); | |
22289 return array.raw(); | |
22290 } | 22278 } |
22291 intptr_t capacity_len = growable_array.Capacity(); | 22279 intptr_t capacity_len = growable_array.Capacity(); |
| 22280 Zone* zone = Thread::Current()->zone(); |
22292 const Array& array = Array::Handle(zone, growable_array.data()); | 22281 const Array& array = Array::Handle(zone, growable_array.data()); |
22293 ASSERT(array.IsArray()); | 22282 ASSERT(array.IsArray()); |
22294 array.SetTypeArguments(type_arguments); | 22283 array.SetTypeArguments(type_arguments); |
22295 intptr_t capacity_size = Array::InstanceSize(capacity_len); | 22284 intptr_t capacity_size = Array::InstanceSize(capacity_len); |
22296 intptr_t used_size = Array::InstanceSize(used_len); | 22285 intptr_t used_size = Array::InstanceSize(used_len); |
22297 NoSafepointScope no_safepoint; | 22286 NoSafepointScope no_safepoint; |
22298 | 22287 |
22299 // If there is any left over space fill it with either an Array object or | 22288 // If there is any left over space fill it with either an Array object or |
22300 // just a plain object (depending on the amount of left over space) so | 22289 // just a plain object (depending on the amount of left over space) so |
22301 // that it can be traversed over successfully during garbage collection. | 22290 // that it can be traversed over successfully during garbage collection. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22361 RawImmutableArray* ImmutableArray::New(intptr_t len, Heap::Space space) { | 22350 RawImmutableArray* ImmutableArray::New(intptr_t len, Heap::Space space) { |
22362 ASSERT(Isolate::Current()->object_store()->immutable_array_class() != | 22351 ASSERT(Isolate::Current()->object_store()->immutable_array_class() != |
22363 Class::null()); | 22352 Class::null()); |
22364 return reinterpret_cast<RawImmutableArray*>(Array::New(kClassId, len, space)); | 22353 return reinterpret_cast<RawImmutableArray*>(Array::New(kClassId, len, space)); |
22365 } | 22354 } |
22366 | 22355 |
22367 | 22356 |
22368 void GrowableObjectArray::Add(const Object& value, Heap::Space space) const { | 22357 void GrowableObjectArray::Add(const Object& value, Heap::Space space) const { |
22369 ASSERT(!IsNull()); | 22358 ASSERT(!IsNull()); |
22370 if (Length() == Capacity()) { | 22359 if (Length() == Capacity()) { |
22371 // Grow from 0 to 3, and then double + 1. | 22360 // TODO(Issue 2500): Need a better growth strategy. |
22372 intptr_t new_capacity = (Capacity() * 2) | 3; | 22361 intptr_t new_capacity = (Capacity() == 0) ? 4 : Capacity() * 2; |
22373 if (new_capacity <= Capacity()) { | 22362 if (new_capacity <= Capacity()) { |
22374 Exceptions::ThrowOOM(); | 22363 Exceptions::ThrowOOM(); |
22375 UNREACHABLE(); | 22364 UNREACHABLE(); |
22376 } | 22365 } |
22377 Grow(new_capacity, space); | 22366 Grow(new_capacity, space); |
22378 } | 22367 } |
22379 ASSERT(Length() < Capacity()); | 22368 ASSERT(Length() < Capacity()); |
22380 intptr_t index = Length(); | 22369 intptr_t index = Length(); |
22381 SetLength(index + 1); | 22370 SetLength(index + 1); |
22382 SetAt(index, value); | 22371 SetAt(index, value); |
(...skipping 16 matching lines...) Expand all Loading... |
22399 const Array& contents = Array::Handle(data()); | 22388 const Array& contents = Array::Handle(data()); |
22400 const PassiveObject& obj = PassiveObject::Handle(contents.At(index)); | 22389 const PassiveObject& obj = PassiveObject::Handle(contents.At(index)); |
22401 contents.SetAt(index, Object::null_object()); | 22390 contents.SetAt(index, Object::null_object()); |
22402 SetLength(index); | 22391 SetLength(index); |
22403 return obj.raw(); | 22392 return obj.raw(); |
22404 } | 22393 } |
22405 | 22394 |
22406 | 22395 |
22407 RawGrowableObjectArray* GrowableObjectArray::New(intptr_t capacity, | 22396 RawGrowableObjectArray* GrowableObjectArray::New(intptr_t capacity, |
22408 Heap::Space space) { | 22397 Heap::Space space) { |
22409 RawArray* raw_data = (capacity == 0) ? Object::empty_array().raw() | 22398 const Array& data = Array::Handle(Array::New(capacity, space)); |
22410 : Array::New(capacity, space); | |
22411 const Array& data = Array::Handle(raw_data); | |
22412 return New(data, space); | 22399 return New(data, space); |
22413 } | 22400 } |
22414 | 22401 |
22415 | 22402 |
22416 RawGrowableObjectArray* GrowableObjectArray::New(const Array& array, | 22403 RawGrowableObjectArray* GrowableObjectArray::New(const Array& array, |
22417 Heap::Space space) { | 22404 Heap::Space space) { |
22418 ASSERT(Isolate::Current()->object_store()->growable_object_array_class() != | 22405 ASSERT(Isolate::Current()->object_store()->growable_object_array_class() != |
22419 Class::null()); | 22406 Class::null()); |
22420 GrowableObjectArray& result = GrowableObjectArray::Handle(); | 22407 GrowableObjectArray& result = GrowableObjectArray::Handle(); |
22421 { | 22408 { |
(...skipping 1214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
23636 return UserTag::null(); | 23623 return UserTag::null(); |
23637 } | 23624 } |
23638 | 23625 |
23639 | 23626 |
23640 const char* UserTag::ToCString() const { | 23627 const char* UserTag::ToCString() const { |
23641 const String& tag_label = String::Handle(label()); | 23628 const String& tag_label = String::Handle(label()); |
23642 return tag_label.ToCString(); | 23629 return tag_label.ToCString(); |
23643 } | 23630 } |
23644 | 23631 |
23645 } // namespace dart | 23632 } // namespace dart |
OLD | NEW |