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/compiler.h" | 8 #include "vm/compiler.h" |
9 #include "vm/debugger.h" | 9 #include "vm/debugger.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
11 #include "vm/resolver.h" | 11 #include "vm/resolver.h" |
12 #include "vm/runtime_entry.h" | 12 #include "vm/runtime_entry.h" |
13 #include "vm/safepoint.h" | 13 #include "vm/safepoint.h" |
14 #include "vm/simulator.h" | 14 #include "vm/simulator.h" |
15 #include "vm/stub_code.h" | 15 #include "vm/stub_code.h" |
16 #include "vm/symbols.h" | 16 #include "vm/symbols.h" |
17 | 17 |
18 namespace dart { | 18 namespace dart { |
19 | 19 |
20 // A cache of VM heap allocated arguments descriptors. | 20 // A cache of VM heap allocated arguments descriptors. |
21 RawArray* ArgumentsDescriptor::cached_args_descriptors_[kCachedDescriptorCount]; | 21 RawArray* ArgumentsDescriptor::cached_args_descriptors_[kCachedDescriptorCount]; |
22 | 22 |
23 | |
24 RawObject* DartEntry::InvokeFunction(const Function& function, | 23 RawObject* DartEntry::InvokeFunction(const Function& function, |
25 const Array& arguments) { | 24 const Array& arguments) { |
26 ASSERT(Thread::Current()->IsMutatorThread()); | 25 ASSERT(Thread::Current()->IsMutatorThread()); |
27 const int kTypeArgsLen = 0; // No support to pass type args to generic func. | 26 const int kTypeArgsLen = 0; // No support to pass type args to generic func. |
28 const Array& arguments_descriptor = | 27 const Array& arguments_descriptor = |
29 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length())); | 28 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length())); |
30 return InvokeFunction(function, arguments, arguments_descriptor); | 29 return InvokeFunction(function, arguments, arguments_descriptor); |
31 } | 30 } |
32 | 31 |
33 | |
34 class ScopedIsolateStackLimits : public ValueObject { | 32 class ScopedIsolateStackLimits : public ValueObject { |
35 public: | 33 public: |
36 explicit ScopedIsolateStackLimits(Thread* thread, uword current_sp) | 34 explicit ScopedIsolateStackLimits(Thread* thread, uword current_sp) |
37 : thread_(thread), saved_stack_limit_(0) { | 35 : thread_(thread), saved_stack_limit_(0) { |
38 ASSERT(thread != NULL); | 36 ASSERT(thread != NULL); |
39 // Set the thread's stack_base based on the current | 37 // Set the thread's stack_base based on the current |
40 // stack pointer, we keep refining this value as we | 38 // stack pointer, we keep refining this value as we |
41 // see higher stack pointers (Note: we assume the stack | 39 // see higher stack pointers (Note: we assume the stack |
42 // grows from high to low addresses). | 40 // grows from high to low addresses). |
43 OSThread* os_thread = thread->os_thread(); | 41 OSThread* os_thread = thread->os_thread(); |
(...skipping 14 matching lines...) Expand all Loading... |
58 // to a stack limit of 0 when all nested invocations are done and | 56 // to a stack limit of 0 when all nested invocations are done and |
59 // we have bottomed out. | 57 // we have bottomed out. |
60 thread_->SetStackLimit(saved_stack_limit_); | 58 thread_->SetStackLimit(saved_stack_limit_); |
61 } | 59 } |
62 | 60 |
63 private: | 61 private: |
64 Thread* thread_; | 62 Thread* thread_; |
65 uword saved_stack_limit_; | 63 uword saved_stack_limit_; |
66 }; | 64 }; |
67 | 65 |
68 | |
69 // Clears/restores Thread::long_jump_base on construction/destruction. | 66 // Clears/restores Thread::long_jump_base on construction/destruction. |
70 // Ensures that we do not attempt to long jump across Dart frames. | 67 // Ensures that we do not attempt to long jump across Dart frames. |
71 class SuspendLongJumpScope : public StackResource { | 68 class SuspendLongJumpScope : public StackResource { |
72 public: | 69 public: |
73 explicit SuspendLongJumpScope(Thread* thread) | 70 explicit SuspendLongJumpScope(Thread* thread) |
74 : StackResource(thread), saved_long_jump_base_(thread->long_jump_base()) { | 71 : StackResource(thread), saved_long_jump_base_(thread->long_jump_base()) { |
75 thread->set_long_jump_base(NULL); | 72 thread->set_long_jump_base(NULL); |
76 } | 73 } |
77 | 74 |
78 ~SuspendLongJumpScope() { | 75 ~SuspendLongJumpScope() { |
79 ASSERT(thread()->long_jump_base() == NULL); | 76 ASSERT(thread()->long_jump_base() == NULL); |
80 thread()->set_long_jump_base(saved_long_jump_base_); | 77 thread()->set_long_jump_base(saved_long_jump_base_); |
81 } | 78 } |
82 | 79 |
83 private: | 80 private: |
84 LongJumpScope* saved_long_jump_base_; | 81 LongJumpScope* saved_long_jump_base_; |
85 }; | 82 }; |
86 | 83 |
87 | |
88 RawObject* DartEntry::InvokeFunction(const Function& function, | 84 RawObject* DartEntry::InvokeFunction(const Function& function, |
89 const Array& arguments, | 85 const Array& arguments, |
90 const Array& arguments_descriptor, | 86 const Array& arguments_descriptor, |
91 uword current_sp) { | 87 uword current_sp) { |
92 // Get the entrypoint corresponding to the function specified, this | 88 // Get the entrypoint corresponding to the function specified, this |
93 // will result in a compilation of the function if it is not already | 89 // will result in a compilation of the function if it is not already |
94 // compiled. | 90 // compiled. |
95 Thread* thread = Thread::Current(); | 91 Thread* thread = Thread::Current(); |
96 Zone* zone = thread->zone(); | 92 Zone* zone = thread->zone(); |
97 ASSERT(thread->IsMutatorThread()); | 93 ASSERT(thread->IsMutatorThread()); |
(...skipping 27 matching lines...) Expand all Loading... |
125 return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call( | 121 return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call( |
126 reinterpret_cast<intptr_t>(entrypoint), reinterpret_cast<intptr_t>(&code), | 122 reinterpret_cast<intptr_t>(entrypoint), reinterpret_cast<intptr_t>(&code), |
127 reinterpret_cast<intptr_t>(&arguments_descriptor), | 123 reinterpret_cast<intptr_t>(&arguments_descriptor), |
128 reinterpret_cast<intptr_t>(&arguments), | 124 reinterpret_cast<intptr_t>(&arguments), |
129 reinterpret_cast<intptr_t>(thread))); | 125 reinterpret_cast<intptr_t>(thread))); |
130 #else | 126 #else |
131 return entrypoint(code, arguments_descriptor, arguments, thread); | 127 return entrypoint(code, arguments_descriptor, arguments, thread); |
132 #endif | 128 #endif |
133 } | 129 } |
134 | 130 |
135 | |
136 RawObject* DartEntry::InvokeClosure(const Array& arguments) { | 131 RawObject* DartEntry::InvokeClosure(const Array& arguments) { |
137 const int kTypeArgsLen = 0; // No support to pass type args to generic func. | 132 const int kTypeArgsLen = 0; // No support to pass type args to generic func. |
138 const Array& arguments_descriptor = | 133 const Array& arguments_descriptor = |
139 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length())); | 134 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length())); |
140 return InvokeClosure(arguments, arguments_descriptor); | 135 return InvokeClosure(arguments, arguments_descriptor); |
141 } | 136 } |
142 | 137 |
143 | |
144 RawObject* DartEntry::InvokeClosure(const Array& arguments, | 138 RawObject* DartEntry::InvokeClosure(const Array& arguments, |
145 const Array& arguments_descriptor) { | 139 const Array& arguments_descriptor) { |
146 Thread* thread = Thread::Current(); | 140 Thread* thread = Thread::Current(); |
147 Zone* zone = thread->zone(); | 141 Zone* zone = thread->zone(); |
148 const ArgumentsDescriptor args_desc(arguments_descriptor); | 142 const ArgumentsDescriptor args_desc(arguments_descriptor); |
149 const intptr_t instance_index = args_desc.TypeArgsLen() == 0 ? 0 : 1; | 143 const intptr_t instance_index = args_desc.TypeArgsLen() == 0 ? 0 : 1; |
150 Instance& instance = Instance::Handle(zone); | 144 Instance& instance = Instance::Handle(zone); |
151 instance ^= arguments.At(instance_index); | 145 instance ^= arguments.At(instance_index); |
152 // Get the entrypoint corresponding to the closure function or to the call | 146 // Get the entrypoint corresponding to the closure function or to the call |
153 // method of the instance. This will result in a compilation of the function | 147 // method of the instance. This will result in a compilation of the function |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 } | 202 } |
209 cls = cls.SuperClass(); | 203 cls = cls.SuperClass(); |
210 } | 204 } |
211 } | 205 } |
212 | 206 |
213 // No compatible method or getter so invoke noSuchMethod. | 207 // No compatible method or getter so invoke noSuchMethod. |
214 return InvokeNoSuchMethod(instance, Symbols::Call(), arguments, | 208 return InvokeNoSuchMethod(instance, Symbols::Call(), arguments, |
215 arguments_descriptor); | 209 arguments_descriptor); |
216 } | 210 } |
217 | 211 |
218 | |
219 RawObject* DartEntry::InvokeNoSuchMethod(const Instance& receiver, | 212 RawObject* DartEntry::InvokeNoSuchMethod(const Instance& receiver, |
220 const String& target_name, | 213 const String& target_name, |
221 const Array& arguments, | 214 const Array& arguments, |
222 const Array& arguments_descriptor) { | 215 const Array& arguments_descriptor) { |
223 ASSERT(receiver.raw() == arguments.At(0)); | 216 ASSERT(receiver.raw() == arguments.At(0)); |
224 // Allocate an Invocation object. | 217 // Allocate an Invocation object. |
225 const Library& core_lib = Library::Handle(Library::CoreLibrary()); | 218 const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
226 | 219 |
227 Class& invocation_mirror_class = Class::Handle(core_lib.LookupClass( | 220 Class& invocation_mirror_class = Class::Handle(core_lib.LookupClass( |
228 String::Handle(core_lib.PrivateName(Symbols::InvocationMirror())))); | 221 String::Handle(core_lib.PrivateName(Symbols::InvocationMirror())))); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 thread->isolate()->object_store()->object_class()), | 254 thread->isolate()->object_store()->object_class()), |
262 Symbols::NoSuchMethod(), args_desc); | 255 Symbols::NoSuchMethod(), args_desc); |
263 } | 256 } |
264 ASSERT(!function.IsNull()); | 257 ASSERT(!function.IsNull()); |
265 const Array& args = Array::Handle(Array::New(kNumArguments)); | 258 const Array& args = Array::Handle(Array::New(kNumArguments)); |
266 args.SetAt(0, receiver); | 259 args.SetAt(0, receiver); |
267 args.SetAt(1, invocation_mirror); | 260 args.SetAt(1, invocation_mirror); |
268 return InvokeFunction(function, args); | 261 return InvokeFunction(function, args); |
269 } | 262 } |
270 | 263 |
271 | |
272 ArgumentsDescriptor::ArgumentsDescriptor(const Array& array) : array_(array) {} | 264 ArgumentsDescriptor::ArgumentsDescriptor(const Array& array) : array_(array) {} |
273 | 265 |
274 intptr_t ArgumentsDescriptor::TypeArgsLen() const { | 266 intptr_t ArgumentsDescriptor::TypeArgsLen() const { |
275 return Smi::Cast(Object::Handle(array_.At(kTypeArgsLenIndex))).Value(); | 267 return Smi::Cast(Object::Handle(array_.At(kTypeArgsLenIndex))).Value(); |
276 } | 268 } |
277 | 269 |
278 | |
279 intptr_t ArgumentsDescriptor::Count() const { | 270 intptr_t ArgumentsDescriptor::Count() const { |
280 return Smi::Cast(Object::Handle(array_.At(kCountIndex))).Value(); | 271 return Smi::Cast(Object::Handle(array_.At(kCountIndex))).Value(); |
281 } | 272 } |
282 | 273 |
283 | |
284 intptr_t ArgumentsDescriptor::PositionalCount() const { | 274 intptr_t ArgumentsDescriptor::PositionalCount() const { |
285 return Smi::Cast(Object::Handle(array_.At(kPositionalCountIndex))).Value(); | 275 return Smi::Cast(Object::Handle(array_.At(kPositionalCountIndex))).Value(); |
286 } | 276 } |
287 | 277 |
288 | |
289 RawString* ArgumentsDescriptor::NameAt(intptr_t index) const { | 278 RawString* ArgumentsDescriptor::NameAt(intptr_t index) const { |
290 const intptr_t offset = | 279 const intptr_t offset = |
291 kFirstNamedEntryIndex + (index * kNamedEntrySize) + kNameOffset; | 280 kFirstNamedEntryIndex + (index * kNamedEntrySize) + kNameOffset; |
292 String& result = String::Handle(); | 281 String& result = String::Handle(); |
293 result ^= array_.At(offset); | 282 result ^= array_.At(offset); |
294 return result.raw(); | 283 return result.raw(); |
295 } | 284 } |
296 | 285 |
297 | |
298 intptr_t ArgumentsDescriptor::PositionAt(intptr_t index) const { | 286 intptr_t ArgumentsDescriptor::PositionAt(intptr_t index) const { |
299 const intptr_t offset = | 287 const intptr_t offset = |
300 kFirstNamedEntryIndex + (index * kNamedEntrySize) + kPositionOffset; | 288 kFirstNamedEntryIndex + (index * kNamedEntrySize) + kPositionOffset; |
301 return Smi::Value(Smi::RawCast(array_.At(offset))); | 289 return Smi::Value(Smi::RawCast(array_.At(offset))); |
302 } | 290 } |
303 | 291 |
304 | |
305 bool ArgumentsDescriptor::MatchesNameAt(intptr_t index, | 292 bool ArgumentsDescriptor::MatchesNameAt(intptr_t index, |
306 const String& other) const { | 293 const String& other) const { |
307 return NameAt(index) == other.raw(); | 294 return NameAt(index) == other.raw(); |
308 } | 295 } |
309 | 296 |
310 | |
311 intptr_t ArgumentsDescriptor::type_args_len_offset() { | 297 intptr_t ArgumentsDescriptor::type_args_len_offset() { |
312 return Array::element_offset(kTypeArgsLenIndex); | 298 return Array::element_offset(kTypeArgsLenIndex); |
313 } | 299 } |
314 | 300 |
315 | |
316 intptr_t ArgumentsDescriptor::count_offset() { | 301 intptr_t ArgumentsDescriptor::count_offset() { |
317 return Array::element_offset(kCountIndex); | 302 return Array::element_offset(kCountIndex); |
318 } | 303 } |
319 | 304 |
320 | |
321 intptr_t ArgumentsDescriptor::positional_count_offset() { | 305 intptr_t ArgumentsDescriptor::positional_count_offset() { |
322 return Array::element_offset(kPositionalCountIndex); | 306 return Array::element_offset(kPositionalCountIndex); |
323 } | 307 } |
324 | 308 |
325 | |
326 intptr_t ArgumentsDescriptor::first_named_entry_offset() { | 309 intptr_t ArgumentsDescriptor::first_named_entry_offset() { |
327 return Array::element_offset(kFirstNamedEntryIndex); | 310 return Array::element_offset(kFirstNamedEntryIndex); |
328 } | 311 } |
329 | 312 |
330 | |
331 RawArray* ArgumentsDescriptor::New(intptr_t type_args_len, | 313 RawArray* ArgumentsDescriptor::New(intptr_t type_args_len, |
332 intptr_t num_arguments, | 314 intptr_t num_arguments, |
333 const Array& optional_arguments_names) { | 315 const Array& optional_arguments_names) { |
334 const intptr_t num_named_args = | 316 const intptr_t num_named_args = |
335 optional_arguments_names.IsNull() ? 0 : optional_arguments_names.Length(); | 317 optional_arguments_names.IsNull() ? 0 : optional_arguments_names.Length(); |
336 if (num_named_args == 0) { | 318 if (num_named_args == 0) { |
337 return ArgumentsDescriptor::New(type_args_len, num_arguments); | 319 return ArgumentsDescriptor::New(type_args_len, num_arguments); |
338 } | 320 } |
339 ASSERT(type_args_len >= 0); | 321 ASSERT(type_args_len >= 0); |
340 ASSERT(num_arguments >= 0); | 322 ASSERT(num_arguments >= 0); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 // Set terminating null. | 367 // Set terminating null. |
386 descriptor.SetAt(descriptor_len - 1, Object::null_object()); | 368 descriptor.SetAt(descriptor_len - 1, Object::null_object()); |
387 | 369 |
388 // Share the immutable descriptor when possible by canonicalizing it. | 370 // Share the immutable descriptor when possible by canonicalizing it. |
389 descriptor.MakeImmutable(); | 371 descriptor.MakeImmutable(); |
390 descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL); | 372 descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL); |
391 ASSERT(!descriptor.IsNull()); | 373 ASSERT(!descriptor.IsNull()); |
392 return descriptor.raw(); | 374 return descriptor.raw(); |
393 } | 375 } |
394 | 376 |
395 | |
396 RawArray* ArgumentsDescriptor::New(intptr_t type_args_len, | 377 RawArray* ArgumentsDescriptor::New(intptr_t type_args_len, |
397 intptr_t num_arguments) { | 378 intptr_t num_arguments) { |
398 ASSERT(type_args_len >= 0); | 379 ASSERT(type_args_len >= 0); |
399 ASSERT(num_arguments >= 0); | 380 ASSERT(num_arguments >= 0); |
400 if ((type_args_len == 0) && (num_arguments < kCachedDescriptorCount)) { | 381 if ((type_args_len == 0) && (num_arguments < kCachedDescriptorCount)) { |
401 return cached_args_descriptors_[num_arguments]; | 382 return cached_args_descriptors_[num_arguments]; |
402 } | 383 } |
403 return NewNonCached(type_args_len, num_arguments); | 384 return NewNonCached(type_args_len, num_arguments); |
404 } | 385 } |
405 | 386 |
406 | |
407 RawArray* ArgumentsDescriptor::NewNonCached(intptr_t type_args_len, | 387 RawArray* ArgumentsDescriptor::NewNonCached(intptr_t type_args_len, |
408 intptr_t num_arguments, | 388 intptr_t num_arguments, |
409 bool canonicalize) { | 389 bool canonicalize) { |
410 // Build the arguments descriptor array, which consists of the length of the | 390 // Build the arguments descriptor array, which consists of the length of the |
411 // type argument vector, total argument count; the positional argument count; | 391 // type argument vector, total argument count; the positional argument count; |
412 // and a terminating null to simplify iterating in generated code. | 392 // and a terminating null to simplify iterating in generated code. |
413 Thread* thread = Thread::Current(); | 393 Thread* thread = Thread::Current(); |
414 Zone* zone = thread->zone(); | 394 Zone* zone = thread->zone(); |
415 const intptr_t descriptor_len = LengthFor(0); | 395 const intptr_t descriptor_len = LengthFor(0); |
416 Array& descriptor = | 396 Array& descriptor = |
(...skipping 15 matching lines...) Expand all Loading... |
432 | 412 |
433 // Share the immutable descriptor when possible by canonicalizing it. | 413 // Share the immutable descriptor when possible by canonicalizing it. |
434 descriptor.MakeImmutable(); | 414 descriptor.MakeImmutable(); |
435 if (canonicalize) { | 415 if (canonicalize) { |
436 descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL); | 416 descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL); |
437 } | 417 } |
438 ASSERT(!descriptor.IsNull()); | 418 ASSERT(!descriptor.IsNull()); |
439 return descriptor.raw(); | 419 return descriptor.raw(); |
440 } | 420 } |
441 | 421 |
442 | |
443 void ArgumentsDescriptor::InitOnce() { | 422 void ArgumentsDescriptor::InitOnce() { |
444 for (int i = 0; i < kCachedDescriptorCount; i++) { | 423 for (int i = 0; i < kCachedDescriptorCount; i++) { |
445 cached_args_descriptors_[i] = | 424 cached_args_descriptors_[i] = |
446 ArgumentsDescriptor::NewNonCached(/*type_args_len=*/0, i, false); | 425 ArgumentsDescriptor::NewNonCached(/*type_args_len=*/0, i, false); |
447 } | 426 } |
448 } | 427 } |
449 | 428 |
450 | |
451 RawObject* DartLibraryCalls::InstanceCreate(const Library& lib, | 429 RawObject* DartLibraryCalls::InstanceCreate(const Library& lib, |
452 const String& class_name, | 430 const String& class_name, |
453 const String& constructor_name, | 431 const String& constructor_name, |
454 const Array& arguments) { | 432 const Array& arguments) { |
455 const Class& cls = Class::Handle(lib.LookupClassAllowPrivate(class_name)); | 433 const Class& cls = Class::Handle(lib.LookupClassAllowPrivate(class_name)); |
456 ASSERT(!cls.IsNull()); | 434 ASSERT(!cls.IsNull()); |
457 // For now, we only support a non-parameterized or raw type. | 435 // For now, we only support a non-parameterized or raw type. |
458 const int kNumExtraArgs = 1; // implicit rcvr arg. | 436 const int kNumExtraArgs = 1; // implicit rcvr arg. |
459 const Instance& exception_object = Instance::Handle(Instance::New(cls)); | 437 const Instance& exception_object = Instance::Handle(Instance::New(cls)); |
460 const Array& constructor_arguments = | 438 const Array& constructor_arguments = |
(...skipping 12 matching lines...) Expand all Loading... |
473 ASSERT(!constructor.IsNull()); | 451 ASSERT(!constructor.IsNull()); |
474 const Object& retval = Object::Handle( | 452 const Object& retval = Object::Handle( |
475 DartEntry::InvokeFunction(constructor, constructor_arguments)); | 453 DartEntry::InvokeFunction(constructor, constructor_arguments)); |
476 ASSERT(retval.IsNull() || retval.IsError()); | 454 ASSERT(retval.IsNull() || retval.IsError()); |
477 if (retval.IsError()) { | 455 if (retval.IsError()) { |
478 return retval.raw(); | 456 return retval.raw(); |
479 } | 457 } |
480 return exception_object.raw(); | 458 return exception_object.raw(); |
481 } | 459 } |
482 | 460 |
483 | |
484 RawObject* DartLibraryCalls::ToString(const Instance& receiver) { | 461 RawObject* DartLibraryCalls::ToString(const Instance& receiver) { |
485 const int kTypeArgsLen = 0; | 462 const int kTypeArgsLen = 0; |
486 const int kNumArguments = 1; // Receiver. | 463 const int kNumArguments = 1; // Receiver. |
487 ArgumentsDescriptor args_desc( | 464 ArgumentsDescriptor args_desc( |
488 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); | 465 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
489 const Function& function = Function::Handle( | 466 const Function& function = Function::Handle( |
490 Resolver::ResolveDynamic(receiver, Symbols::toString(), args_desc)); | 467 Resolver::ResolveDynamic(receiver, Symbols::toString(), args_desc)); |
491 ASSERT(!function.IsNull()); | 468 ASSERT(!function.IsNull()); |
492 const Array& args = Array::Handle(Array::New(kNumArguments)); | 469 const Array& args = Array::Handle(Array::New(kNumArguments)); |
493 args.SetAt(0, receiver); | 470 args.SetAt(0, receiver); |
494 const Object& result = | 471 const Object& result = |
495 Object::Handle(DartEntry::InvokeFunction(function, args)); | 472 Object::Handle(DartEntry::InvokeFunction(function, args)); |
496 ASSERT(result.IsInstance() || result.IsError()); | 473 ASSERT(result.IsInstance() || result.IsError()); |
497 return result.raw(); | 474 return result.raw(); |
498 } | 475 } |
499 | 476 |
500 | |
501 RawObject* DartLibraryCalls::HashCode(const Instance& receiver) { | 477 RawObject* DartLibraryCalls::HashCode(const Instance& receiver) { |
502 const int kTypeArgsLen = 0; | 478 const int kTypeArgsLen = 0; |
503 const int kNumArguments = 1; // Receiver. | 479 const int kNumArguments = 1; // Receiver. |
504 ArgumentsDescriptor args_desc( | 480 ArgumentsDescriptor args_desc( |
505 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); | 481 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
506 const Function& function = Function::Handle( | 482 const Function& function = Function::Handle( |
507 Resolver::ResolveDynamic(receiver, Symbols::hashCode(), args_desc)); | 483 Resolver::ResolveDynamic(receiver, Symbols::hashCode(), args_desc)); |
508 ASSERT(!function.IsNull()); | 484 ASSERT(!function.IsNull()); |
509 const Array& args = Array::Handle(Array::New(kNumArguments)); | 485 const Array& args = Array::Handle(Array::New(kNumArguments)); |
510 args.SetAt(0, receiver); | 486 args.SetAt(0, receiver); |
511 const Object& result = | 487 const Object& result = |
512 Object::Handle(DartEntry::InvokeFunction(function, args)); | 488 Object::Handle(DartEntry::InvokeFunction(function, args)); |
513 ASSERT(result.IsInstance() || result.IsError()); | 489 ASSERT(result.IsInstance() || result.IsError()); |
514 return result.raw(); | 490 return result.raw(); |
515 } | 491 } |
516 | 492 |
517 | |
518 RawObject* DartLibraryCalls::Equals(const Instance& left, | 493 RawObject* DartLibraryCalls::Equals(const Instance& left, |
519 const Instance& right) { | 494 const Instance& right) { |
520 const int kTypeArgsLen = 0; | 495 const int kTypeArgsLen = 0; |
521 const int kNumArguments = 2; | 496 const int kNumArguments = 2; |
522 ArgumentsDescriptor args_desc( | 497 ArgumentsDescriptor args_desc( |
523 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); | 498 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
524 const Function& function = Function::Handle( | 499 const Function& function = Function::Handle( |
525 Resolver::ResolveDynamic(left, Symbols::EqualOperator(), args_desc)); | 500 Resolver::ResolveDynamic(left, Symbols::EqualOperator(), args_desc)); |
526 ASSERT(!function.IsNull()); | 501 ASSERT(!function.IsNull()); |
527 | 502 |
528 const Array& args = Array::Handle(Array::New(kNumArguments)); | 503 const Array& args = Array::Handle(Array::New(kNumArguments)); |
529 args.SetAt(0, left); | 504 args.SetAt(0, left); |
530 args.SetAt(1, right); | 505 args.SetAt(1, right); |
531 const Object& result = | 506 const Object& result = |
532 Object::Handle(DartEntry::InvokeFunction(function, args)); | 507 Object::Handle(DartEntry::InvokeFunction(function, args)); |
533 ASSERT(result.IsInstance() || result.IsError()); | 508 ASSERT(result.IsInstance() || result.IsError()); |
534 return result.raw(); | 509 return result.raw(); |
535 } | 510 } |
536 | 511 |
537 | |
538 RawObject* DartLibraryCalls::LookupHandler(Dart_Port port_id) { | 512 RawObject* DartLibraryCalls::LookupHandler(Dart_Port port_id) { |
539 Thread* thread = Thread::Current(); | 513 Thread* thread = Thread::Current(); |
540 Zone* zone = thread->zone(); | 514 Zone* zone = thread->zone(); |
541 Function& function = Function::Handle( | 515 Function& function = Function::Handle( |
542 zone, thread->isolate()->object_store()->lookup_port_handler()); | 516 zone, thread->isolate()->object_store()->lookup_port_handler()); |
543 const int kTypeArgsLen = 0; | 517 const int kTypeArgsLen = 0; |
544 const int kNumArguments = 1; | 518 const int kNumArguments = 1; |
545 if (function.IsNull()) { | 519 if (function.IsNull()) { |
546 Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary()); | 520 Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary()); |
547 ASSERT(!isolate_lib.IsNull()); | 521 ASSERT(!isolate_lib.IsNull()); |
548 const String& class_name = String::Handle( | 522 const String& class_name = String::Handle( |
549 zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl())); | 523 zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl())); |
550 const String& function_name = String::Handle( | 524 const String& function_name = String::Handle( |
551 zone, isolate_lib.PrivateName(Symbols::_lookupHandler())); | 525 zone, isolate_lib.PrivateName(Symbols::_lookupHandler())); |
552 function = Resolver::ResolveStatic(isolate_lib, class_name, function_name, | 526 function = Resolver::ResolveStatic(isolate_lib, class_name, function_name, |
553 kTypeArgsLen, kNumArguments, | 527 kTypeArgsLen, kNumArguments, |
554 Object::empty_array()); | 528 Object::empty_array()); |
555 ASSERT(!function.IsNull()); | 529 ASSERT(!function.IsNull()); |
556 thread->isolate()->object_store()->set_lookup_port_handler(function); | 530 thread->isolate()->object_store()->set_lookup_port_handler(function); |
557 } | 531 } |
558 const Array& args = Array::Handle(zone, Array::New(kNumArguments)); | 532 const Array& args = Array::Handle(zone, Array::New(kNumArguments)); |
559 args.SetAt(0, Integer::Handle(zone, Integer::New(port_id))); | 533 args.SetAt(0, Integer::Handle(zone, Integer::New(port_id))); |
560 const Object& result = | 534 const Object& result = |
561 Object::Handle(zone, DartEntry::InvokeFunction(function, args)); | 535 Object::Handle(zone, DartEntry::InvokeFunction(function, args)); |
562 return result.raw(); | 536 return result.raw(); |
563 } | 537 } |
564 | 538 |
565 | |
566 RawObject* DartLibraryCalls::HandleMessage(const Object& handler, | 539 RawObject* DartLibraryCalls::HandleMessage(const Object& handler, |
567 const Instance& message) { | 540 const Instance& message) { |
568 Thread* thread = Thread::Current(); | 541 Thread* thread = Thread::Current(); |
569 Zone* zone = thread->zone(); | 542 Zone* zone = thread->zone(); |
570 Isolate* isolate = thread->isolate(); | 543 Isolate* isolate = thread->isolate(); |
571 Function& function = Function::Handle( | 544 Function& function = Function::Handle( |
572 zone, isolate->object_store()->handle_message_function()); | 545 zone, isolate->object_store()->handle_message_function()); |
573 const int kTypeArgsLen = 0; | 546 const int kTypeArgsLen = 0; |
574 const int kNumArguments = 2; | 547 const int kNumArguments = 2; |
575 if (function.IsNull()) { | 548 if (function.IsNull()) { |
(...skipping 17 matching lines...) Expand all Loading... |
593 // through code, enable single stepping so debugger will stop | 566 // through code, enable single stepping so debugger will stop |
594 // at the first location the user is interested in. | 567 // at the first location the user is interested in. |
595 isolate->debugger()->SetResumeAction(Debugger::kStepInto); | 568 isolate->debugger()->SetResumeAction(Debugger::kStepInto); |
596 } | 569 } |
597 const Object& result = | 570 const Object& result = |
598 Object::Handle(zone, DartEntry::InvokeFunction(function, args)); | 571 Object::Handle(zone, DartEntry::InvokeFunction(function, args)); |
599 ASSERT(result.IsNull() || result.IsError()); | 572 ASSERT(result.IsNull() || result.IsError()); |
600 return result.raw(); | 573 return result.raw(); |
601 } | 574 } |
602 | 575 |
603 | |
604 RawObject* DartLibraryCalls::DrainMicrotaskQueue() { | 576 RawObject* DartLibraryCalls::DrainMicrotaskQueue() { |
605 Zone* zone = Thread::Current()->zone(); | 577 Zone* zone = Thread::Current()->zone(); |
606 Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary()); | 578 Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary()); |
607 ASSERT(!isolate_lib.IsNull()); | 579 ASSERT(!isolate_lib.IsNull()); |
608 Function& function = | 580 Function& function = |
609 Function::Handle(zone, isolate_lib.LookupFunctionAllowPrivate( | 581 Function::Handle(zone, isolate_lib.LookupFunctionAllowPrivate( |
610 Symbols::_runPendingImmediateCallback())); | 582 Symbols::_runPendingImmediateCallback())); |
611 const Object& result = Object::Handle( | 583 const Object& result = Object::Handle( |
612 zone, DartEntry::InvokeFunction(function, Object::empty_array())); | 584 zone, DartEntry::InvokeFunction(function, Object::empty_array())); |
613 ASSERT(result.IsNull() || result.IsError()); | 585 ASSERT(result.IsNull() || result.IsError()); |
614 return result.raw(); | 586 return result.raw(); |
615 } | 587 } |
616 | 588 |
617 | |
618 RawObject* DartLibraryCalls::MapSetAt(const Instance& map, | 589 RawObject* DartLibraryCalls::MapSetAt(const Instance& map, |
619 const Instance& key, | 590 const Instance& key, |
620 const Instance& value) { | 591 const Instance& value) { |
621 const int kTypeArgsLen = 0; | 592 const int kTypeArgsLen = 0; |
622 const int kNumArguments = 3; | 593 const int kNumArguments = 3; |
623 ArgumentsDescriptor args_desc( | 594 ArgumentsDescriptor args_desc( |
624 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); | 595 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments))); |
625 const Function& function = Function::Handle( | 596 const Function& function = Function::Handle( |
626 Resolver::ResolveDynamic(map, Symbols::AssignIndexToken(), args_desc)); | 597 Resolver::ResolveDynamic(map, Symbols::AssignIndexToken(), args_desc)); |
627 ASSERT(!function.IsNull()); | 598 ASSERT(!function.IsNull()); |
628 const Array& args = Array::Handle(Array::New(kNumArguments)); | 599 const Array& args = Array::Handle(Array::New(kNumArguments)); |
629 args.SetAt(0, map); | 600 args.SetAt(0, map); |
630 args.SetAt(1, key); | 601 args.SetAt(1, key); |
631 args.SetAt(2, value); | 602 args.SetAt(2, value); |
632 const Object& result = | 603 const Object& result = |
633 Object::Handle(DartEntry::InvokeFunction(function, args)); | 604 Object::Handle(DartEntry::InvokeFunction(function, args)); |
634 return result.raw(); | 605 return result.raw(); |
635 } | 606 } |
636 | 607 |
637 } // namespace dart | 608 } // namespace dart |
OLD | NEW |