| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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/dart_entry.h" | 5 #include "vm/dart_entry.h" |
| 6 | 6 |
| 7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
| 8 #include "vm/code_generator.h" | 8 #include "vm/code_generator.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/debugger.h" | 10 #include "vm/debugger.h" |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 optional_arguments_names.IsNull() ? 0 : optional_arguments_names.Length(); | 315 optional_arguments_names.IsNull() ? 0 : optional_arguments_names.Length(); |
| 316 if (num_named_args == 0) { | 316 if (num_named_args == 0) { |
| 317 return ArgumentsDescriptor::New(num_arguments); | 317 return ArgumentsDescriptor::New(num_arguments); |
| 318 } | 318 } |
| 319 const intptr_t num_pos_args = num_arguments - num_named_args; | 319 const intptr_t num_pos_args = num_arguments - num_named_args; |
| 320 | 320 |
| 321 // Build the arguments descriptor array, which consists of the total | 321 // Build the arguments descriptor array, which consists of the total |
| 322 // argument count; the positional argument count; a sequence of (name, | 322 // argument count; the positional argument count; a sequence of (name, |
| 323 // position) pairs, sorted by name, for each named optional argument; and | 323 // position) pairs, sorted by name, for each named optional argument; and |
| 324 // a terminating null to simplify iterating in generated code. | 324 // a terminating null to simplify iterating in generated code. |
| 325 Thread* thread = Thread::Current(); |
| 326 Zone* zone = thread->zone(); |
| 325 const intptr_t descriptor_len = LengthFor(num_named_args); | 327 const intptr_t descriptor_len = LengthFor(num_named_args); |
| 326 Array& descriptor = Array::Handle(Array::New(descriptor_len, Heap::kOld)); | 328 Array& descriptor = Array::Handle( |
| 329 zone, Array::New(descriptor_len, Heap::kOld)); |
| 327 | 330 |
| 328 // Set total number of passed arguments. | 331 // Set total number of passed arguments. |
| 329 descriptor.SetAt(kCountIndex, Smi::Handle(Smi::New(num_arguments))); | 332 descriptor.SetAt(kCountIndex, Smi::Handle(Smi::New(num_arguments))); |
| 330 // Set number of positional arguments. | 333 // Set number of positional arguments. |
| 331 descriptor.SetAt(kPositionalCountIndex, Smi::Handle(Smi::New(num_pos_args))); | 334 descriptor.SetAt(kPositionalCountIndex, Smi::Handle(Smi::New(num_pos_args))); |
| 332 // Set alphabetically sorted entries for named arguments. | 335 // Set alphabetically sorted entries for named arguments. |
| 333 String& name = String::Handle(); | 336 String& name = String::Handle(zone); |
| 334 Smi& pos = Smi::Handle(); | 337 Smi& pos = Smi::Handle(zone); |
| 338 String& previous_name = String::Handle(zone); |
| 339 Smi& previous_pos = Smi::Handle(zone); |
| 335 for (intptr_t i = 0; i < num_named_args; i++) { | 340 for (intptr_t i = 0; i < num_named_args; i++) { |
| 336 name ^= optional_arguments_names.At(i); | 341 name ^= optional_arguments_names.At(i); |
| 337 pos = Smi::New(num_pos_args + i); | 342 pos = Smi::New(num_pos_args + i); |
| 338 intptr_t insert_index = kFirstNamedEntryIndex + (kNamedEntrySize * i); | 343 intptr_t insert_index = kFirstNamedEntryIndex + (kNamedEntrySize * i); |
| 339 // Shift already inserted pairs with "larger" names. | 344 // Shift already inserted pairs with "larger" names. |
| 340 String& previous_name = String::Handle(); | |
| 341 Smi& previous_pos = Smi::Handle(); | |
| 342 while (insert_index > kFirstNamedEntryIndex) { | 345 while (insert_index > kFirstNamedEntryIndex) { |
| 343 intptr_t previous_index = insert_index - kNamedEntrySize; | 346 intptr_t previous_index = insert_index - kNamedEntrySize; |
| 344 previous_name ^= descriptor.At(previous_index + kNameOffset); | 347 previous_name ^= descriptor.At(previous_index + kNameOffset); |
| 345 intptr_t result = name.CompareTo(previous_name); | 348 intptr_t result = name.CompareTo(previous_name); |
| 346 ASSERT(result != 0); // Duplicate argument names checked in parser. | 349 ASSERT(result != 0); // Duplicate argument names checked in parser. |
| 347 if (result > 0) break; | 350 if (result > 0) break; |
| 348 previous_pos ^= descriptor.At(previous_index + kPositionOffset); | 351 previous_pos ^= descriptor.At(previous_index + kPositionOffset); |
| 349 descriptor.SetAt(insert_index + kNameOffset, previous_name); | 352 descriptor.SetAt(insert_index + kNameOffset, previous_name); |
| 350 descriptor.SetAt(insert_index + kPositionOffset, previous_pos); | 353 descriptor.SetAt(insert_index + kPositionOffset, previous_pos); |
| 351 insert_index = previous_index; | 354 insert_index = previous_index; |
| 352 } | 355 } |
| 353 // Insert pair in descriptor array. | 356 // Insert pair in descriptor array. |
| 354 descriptor.SetAt(insert_index + kNameOffset, name); | 357 descriptor.SetAt(insert_index + kNameOffset, name); |
| 355 descriptor.SetAt(insert_index + kPositionOffset, pos); | 358 descriptor.SetAt(insert_index + kPositionOffset, pos); |
| 356 } | 359 } |
| 357 // Set terminating null. | 360 // Set terminating null. |
| 358 descriptor.SetAt(descriptor_len - 1, Object::null_object()); | 361 descriptor.SetAt(descriptor_len - 1, Object::null_object()); |
| 359 | 362 |
| 360 // Share the immutable descriptor when possible by canonicalizing it. | 363 // Share the immutable descriptor when possible by canonicalizing it. |
| 361 descriptor.MakeImmutable(); | 364 descriptor.MakeImmutable(); |
| 362 descriptor ^= descriptor.CheckAndCanonicalize(NULL); | 365 descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL); |
| 363 ASSERT(!descriptor.IsNull()); | 366 ASSERT(!descriptor.IsNull()); |
| 364 return descriptor.raw(); | 367 return descriptor.raw(); |
| 365 } | 368 } |
| 366 | 369 |
| 367 | 370 |
| 368 RawArray* ArgumentsDescriptor::New(intptr_t num_arguments) { | 371 RawArray* ArgumentsDescriptor::New(intptr_t num_arguments) { |
| 369 ASSERT(num_arguments >= 0); | 372 ASSERT(num_arguments >= 0); |
| 370 if (num_arguments < kCachedDescriptorCount) { | 373 if (num_arguments < kCachedDescriptorCount) { |
| 371 return cached_args_descriptors_[num_arguments]; | 374 return cached_args_descriptors_[num_arguments]; |
| 372 } | 375 } |
| 373 return NewNonCached(num_arguments); | 376 return NewNonCached(num_arguments); |
| 374 } | 377 } |
| 375 | 378 |
| 376 | 379 |
| 377 RawArray* ArgumentsDescriptor::NewNonCached(intptr_t num_arguments, | 380 RawArray* ArgumentsDescriptor::NewNonCached(intptr_t num_arguments, |
| 378 bool canonicalize) { | 381 bool canonicalize) { |
| 379 // Build the arguments descriptor array, which consists of the total | 382 // Build the arguments descriptor array, which consists of the total |
| 380 // argument count; the positional argument count; and | 383 // argument count; the positional argument count; and |
| 381 // a terminating null to simplify iterating in generated code. | 384 // a terminating null to simplify iterating in generated code. |
| 385 Thread* thread = Thread::Current(); |
| 386 Zone* zone = thread->zone(); |
| 382 const intptr_t descriptor_len = LengthFor(0); | 387 const intptr_t descriptor_len = LengthFor(0); |
| 383 Array& descriptor = Array::Handle(Array::New(descriptor_len, Heap::kOld)); | 388 Array& descriptor = Array::Handle( |
| 384 const Smi& arg_count = Smi::Handle(Smi::New(num_arguments)); | 389 zone, Array::New(descriptor_len, Heap::kOld)); |
| 390 const Smi& arg_count = Smi::Handle(zone, Smi::New(num_arguments)); |
| 385 | 391 |
| 386 // Set total number of passed arguments. | 392 // Set total number of passed arguments. |
| 387 descriptor.SetAt(kCountIndex, arg_count); | 393 descriptor.SetAt(kCountIndex, arg_count); |
| 388 | 394 |
| 389 // Set number of positional arguments. | 395 // Set number of positional arguments. |
| 390 descriptor.SetAt(kPositionalCountIndex, arg_count); | 396 descriptor.SetAt(kPositionalCountIndex, arg_count); |
| 391 | 397 |
| 392 // Set terminating null. | 398 // Set terminating null. |
| 393 descriptor.SetAt((descriptor_len - 1), Object::null_object()); | 399 descriptor.SetAt((descriptor_len - 1), Object::null_object()); |
| 394 | 400 |
| 395 // Share the immutable descriptor when possible by canonicalizing it. | 401 // Share the immutable descriptor when possible by canonicalizing it. |
| 396 descriptor.MakeImmutable(); | 402 descriptor.MakeImmutable(); |
| 397 if (canonicalize) { | 403 if (canonicalize) { |
| 398 descriptor ^= descriptor.CheckAndCanonicalize(NULL); | 404 descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL); |
| 399 } | 405 } |
| 400 ASSERT(!descriptor.IsNull()); | 406 ASSERT(!descriptor.IsNull()); |
| 401 return descriptor.raw(); | 407 return descriptor.raw(); |
| 402 } | 408 } |
| 403 | 409 |
| 404 | 410 |
| 405 void ArgumentsDescriptor::InitOnce() { | 411 void ArgumentsDescriptor::InitOnce() { |
| 406 for (int i = 0; i < kCachedDescriptorCount; i++) { | 412 for (int i = 0; i < kCachedDescriptorCount; i++) { |
| 407 cached_args_descriptors_[i] = ArgumentsDescriptor::NewNonCached(i, false); | 413 cached_args_descriptors_[i] = ArgumentsDescriptor::NewNonCached(i, false); |
| 408 } | 414 } |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 const Array& args = Array::Handle(Array::New(kNumArguments)); | 601 const Array& args = Array::Handle(Array::New(kNumArguments)); |
| 596 args.SetAt(0, map); | 602 args.SetAt(0, map); |
| 597 args.SetAt(1, key); | 603 args.SetAt(1, key); |
| 598 args.SetAt(2, value); | 604 args.SetAt(2, value); |
| 599 const Object& result = Object::Handle(DartEntry::InvokeFunction(function, | 605 const Object& result = Object::Handle(DartEntry::InvokeFunction(function, |
| 600 args)); | 606 args)); |
| 601 return result.raw(); | 607 return result.raw(); |
| 602 } | 608 } |
| 603 | 609 |
| 604 } // namespace dart | 610 } // namespace dart |
| OLD | NEW |