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