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/code_generator.h" | 7 #include "vm/code_generator.h" |
8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
9 #include "vm/object_store.h" | 9 #include "vm/object_store.h" |
10 #include "vm/resolver.h" | 10 #include "vm/resolver.h" |
11 #include "vm/stub_code.h" | 11 #include "vm/stub_code.h" |
12 #include "vm/symbols.h" | 12 #include "vm/symbols.h" |
13 | 13 |
14 namespace dart { | 14 namespace dart { |
15 | 15 |
16 RawObject* DartEntry::InvokeDynamic( | 16 RawObject* DartEntry::InvokeDynamic(const Function& function, |
17 const Instance& receiver, | 17 const Array& arguments) { |
18 const Function& function, | 18 const Array& arg_desc = |
19 const GrowableArray<const Object*>& arguments, | 19 Array::Handle(ArgumentsDescriptor::New(arguments.Length())); |
20 const Array& optional_arguments_names) { | 20 return InvokeDynamic(function, arguments, arg_desc); |
| 21 } |
| 22 |
| 23 |
| 24 RawObject* DartEntry::InvokeDynamic(const Function& function, |
| 25 const Array& arguments, |
| 26 const Array& arg_descriptor) { |
21 // Get the entrypoint corresponding to the function specified, this | 27 // Get the entrypoint corresponding to the function specified, this |
22 // will result in a compilation of the function if it is not already | 28 // will result in a compilation of the function if it is not already |
23 // compiled. | 29 // compiled. |
24 if (!function.HasCode()) { | 30 if (!function.HasCode()) { |
25 const Error& error = Error::Handle(Compiler::CompileFunction(function)); | 31 const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
26 if (!error.IsNull()) { | 32 if (!error.IsNull()) { |
27 return error.raw(); | 33 return error.raw(); |
28 } | 34 } |
29 } | 35 } |
30 | 36 |
31 // Set up arguments to include the receiver as the first argument. | |
32 const int num_arguments = arguments.length() + 1; | |
33 GrowableArray<const Object*> args(num_arguments); | |
34 const Object& arg0 = Object::ZoneHandle(receiver.raw()); | |
35 args.Add(&arg0); | |
36 for (int i = 1; i < num_arguments; i++) { | |
37 args.Add(arguments[i - 1]); | |
38 } | |
39 // Now Call the invoke stub which will invoke the dart function. | 37 // Now Call the invoke stub which will invoke the dart function. |
40 invokestub entrypoint = reinterpret_cast<invokestub>( | 38 invokestub entrypoint = reinterpret_cast<invokestub>( |
41 StubCode::InvokeDartCodeEntryPoint()); | 39 StubCode::InvokeDartCodeEntryPoint()); |
42 const Context& context = | 40 const Context& context = |
43 Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); | 41 Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); |
44 ASSERT(context.isolate() == Isolate::Current()); | 42 ASSERT(context.isolate() == Isolate::Current()); |
45 const Code& code = Code::Handle(function.CurrentCode()); | 43 const Code& code = Code::Handle(function.CurrentCode()); |
46 ASSERT(!code.IsNull()); | 44 ASSERT(!code.IsNull()); |
47 const Array& arg_descriptor = | 45 return entrypoint(code.EntryPoint(), arg_descriptor, arguments, context); |
48 Array::Handle(ArgumentsDescriptor::New(num_arguments, | |
49 optional_arguments_names)); | |
50 return entrypoint(code.EntryPoint(), arg_descriptor, args.data(), context); | |
51 } | 46 } |
52 | 47 |
53 | 48 |
54 RawObject* DartEntry::InvokeStatic( | 49 RawObject* DartEntry::InvokeStatic(const Function& function, |
55 const Function& function, | 50 const Array& arguments) { |
56 const GrowableArray<const Object*>& arguments, | 51 const Array& arg_desc = |
57 const Array& optional_arguments_names) { | 52 Array::Handle(ArgumentsDescriptor::New(arguments.Length())); |
| 53 return InvokeStatic(function, arguments, arg_desc); |
| 54 } |
| 55 |
| 56 |
| 57 RawObject* DartEntry::InvokeStatic(const Function& function, |
| 58 const Array& arguments, |
| 59 const Array& arg_descriptor) { |
58 // Get the entrypoint corresponding to the function specified, this | 60 // Get the entrypoint corresponding to the function specified, this |
59 // will result in a compilation of the function if it is not already | 61 // will result in a compilation of the function if it is not already |
60 // compiled. | 62 // compiled. |
61 ASSERT(!function.IsNull()); | 63 ASSERT(!function.IsNull()); |
62 if (!function.HasCode()) { | 64 if (!function.HasCode()) { |
63 const Error& error = Error::Handle(Compiler::CompileFunction(function)); | 65 const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
64 if (!error.IsNull()) { | 66 if (!error.IsNull()) { |
65 return error.raw(); | 67 return error.raw(); |
66 } | 68 } |
67 } | 69 } |
68 // Now Call the invoke stub which will invoke the dart function. | 70 // Now Call the invoke stub which will invoke the dart function. |
69 invokestub entrypoint = reinterpret_cast<invokestub>( | 71 invokestub entrypoint = reinterpret_cast<invokestub>( |
70 StubCode::InvokeDartCodeEntryPoint()); | 72 StubCode::InvokeDartCodeEntryPoint()); |
71 const Context& context = | 73 const Context& context = |
72 Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); | 74 Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); |
73 ASSERT(context.isolate() == Isolate::Current()); | 75 ASSERT(context.isolate() == Isolate::Current()); |
74 const Code& code = Code::Handle(function.CurrentCode()); | 76 const Code& code = Code::Handle(function.CurrentCode()); |
75 ASSERT(!code.IsNull()); | 77 ASSERT(!code.IsNull()); |
76 const Array& arg_descriptor = | 78 return entrypoint(code.EntryPoint(), arg_descriptor, arguments, context); |
77 Array::Handle(ArgumentsDescriptor::New(arguments.length(), | |
78 optional_arguments_names)); | |
79 return entrypoint(code.EntryPoint(), arg_descriptor, arguments.data(), | |
80 context); | |
81 } | 79 } |
82 | 80 |
83 | 81 |
84 // TODO(regis): Pass arguments as an Array including the receiver. | 82 RawObject* DartEntry::InvokeClosure(const Instance& closure, |
85 RawObject* DartEntry::InvokeClosure( | 83 const Array& arguments) { |
86 const Instance& instance, | 84 const Array& arg_desc = |
87 const GrowableArray<const Object*>& arguments, | 85 Array::Handle(ArgumentsDescriptor::New(arguments.Length())); |
88 const Array& optional_arguments_names) { | 86 return InvokeClosure(closure, arguments, arg_desc); |
| 87 } |
| 88 |
| 89 |
| 90 RawObject* DartEntry::InvokeClosure(const Instance& instance, |
| 91 const Array& arguments, |
| 92 const Array& arg_descriptor) { |
| 93 ASSERT(instance.raw() == arguments.At(0)); |
89 // Get the entrypoint corresponding to the closure function or to the call | 94 // Get the entrypoint corresponding to the closure function or to the call |
90 // method of the instance. This will result in a compilation of the function | 95 // method of the instance. This will result in a compilation of the function |
91 // if it is not already compiled. | 96 // if it is not already compiled. |
92 Function& function = Function::Handle(); | 97 Function& function = Function::Handle(); |
93 Context& context = Context::Handle(); | 98 Context& context = Context::Handle(); |
94 if (!instance.IsCallable(&function, &context)) { | 99 if (!instance.IsCallable(&function, &context)) { |
95 // Set up arguments to include the receiver as the first argument. | 100 // Set up arguments to include the receiver as the first argument. |
96 const int num_arguments = arguments.length() + 1; | |
97 const Array& args = Array::Handle(Array::New(num_arguments)); | |
98 args.SetAt(0, instance); | |
99 for (int i = 1; i < num_arguments; i++) { | |
100 args.SetAt(i, *arguments[i - 1]); | |
101 } | |
102 const String& call_symbol = String::Handle(Symbols::Call()); | 101 const String& call_symbol = String::Handle(Symbols::Call()); |
103 const Object& null_object = Object::Handle(); | 102 const Object& null_object = Object::Handle(); |
104 GrowableArray<const Object*> dart_arguments(5); | 103 GrowableArray<const Object*> dart_arguments(5); |
105 dart_arguments.Add(&instance); | 104 dart_arguments.Add(&instance); |
106 dart_arguments.Add(&call_symbol); | 105 dart_arguments.Add(&call_symbol); |
107 dart_arguments.Add(&args); // Including instance. | 106 dart_arguments.Add(&arguments); // Includes instance. |
108 dart_arguments.Add(&null_object); // TODO(regis): Provide names. | 107 dart_arguments.Add(&null_object); // TODO(regis): Provide names. |
109 // If a function "call" with different arguments exists, it will have been | 108 // If a function "call" with different arguments exists, it will have been |
110 // invoked above, so no need to handle this case here. | 109 // invoked above, so no need to handle this case here. |
111 Exceptions::ThrowByType(Exceptions::kNoSuchMethod, dart_arguments); | 110 Exceptions::ThrowByType(Exceptions::kNoSuchMethod, dart_arguments); |
112 UNREACHABLE(); | 111 UNREACHABLE(); |
113 return Object::null(); | 112 return Object::null(); |
114 } | 113 } |
115 ASSERT(!function.IsNull()); | 114 ASSERT(!function.IsNull()); |
116 if (!function.HasCode()) { | 115 if (!function.HasCode()) { |
117 const Error& error = Error::Handle(Compiler::CompileFunction(function)); | 116 const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
118 if (!error.IsNull()) { | 117 if (!error.IsNull()) { |
119 return error.raw(); | 118 return error.raw(); |
120 } | 119 } |
121 } | 120 } |
122 // Set up arguments to include the receiver as the first argument. | |
123 const int num_arguments = arguments.length() + 1; | |
124 GrowableArray<const Object*> args(num_arguments); | |
125 const Object& arg0 = Object::ZoneHandle(instance.raw()); | |
126 args.Add(&arg0); | |
127 for (int i = 1; i < num_arguments; i++) { | |
128 args.Add(arguments[i - 1]); | |
129 } | |
130 // Now call the invoke stub which will invoke the closure. | 121 // Now call the invoke stub which will invoke the closure. |
131 invokestub entrypoint = reinterpret_cast<invokestub>( | 122 invokestub entrypoint = reinterpret_cast<invokestub>( |
132 StubCode::InvokeDartCodeEntryPoint()); | 123 StubCode::InvokeDartCodeEntryPoint()); |
133 ASSERT(context.isolate() == Isolate::Current()); | 124 ASSERT(context.isolate() == Isolate::Current()); |
134 const Code& code = Code::Handle(function.CurrentCode()); | 125 const Code& code = Code::Handle(function.CurrentCode()); |
135 ASSERT(!code.IsNull()); | 126 ASSERT(!code.IsNull()); |
136 const Array& arg_descriptor = | 127 return entrypoint(code.EntryPoint(), arg_descriptor, arguments, context); |
137 Array::Handle(ArgumentsDescriptor::New(num_arguments, | |
138 optional_arguments_names)); | |
139 return entrypoint(code.EntryPoint(), arg_descriptor, args.data(), context); | |
140 } | 128 } |
141 | 129 |
142 | 130 |
143 ArgumentsDescriptor::ArgumentsDescriptor(const Array& array) | 131 ArgumentsDescriptor::ArgumentsDescriptor(const Array& array) |
144 : array_(array) { | 132 : array_(array) { |
145 } | 133 } |
146 | 134 |
147 | 135 |
148 intptr_t ArgumentsDescriptor::Count() const { | 136 intptr_t ArgumentsDescriptor::Count() const { |
149 return Smi::CheckedHandle(array_.At(kCountIndex)).Value(); | 137 return Smi::CheckedHandle(array_.At(kCountIndex)).Value(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 // Set terminating null. | 212 // Set terminating null. |
225 descriptor.SetAt(descriptor_len - 1, Object::Handle()); | 213 descriptor.SetAt(descriptor_len - 1, Object::Handle()); |
226 | 214 |
227 // Share the immutable descriptor when possible by canonicalizing it. | 215 // Share the immutable descriptor when possible by canonicalizing it. |
228 descriptor.MakeImmutable(); | 216 descriptor.MakeImmutable(); |
229 descriptor ^= descriptor.Canonicalize(); | 217 descriptor ^= descriptor.Canonicalize(); |
230 return descriptor.raw(); | 218 return descriptor.raw(); |
231 } | 219 } |
232 | 220 |
233 | 221 |
| 222 RawArray* ArgumentsDescriptor::New(intptr_t num_arguments) { |
| 223 // Build the arguments descriptor array, which consists of the total |
| 224 // argument count; the positional argument count; and |
| 225 // a terminating null to simplify iterating in generated code. |
| 226 const intptr_t descriptor_len = LengthFor(0); |
| 227 Array& descriptor = Array::Handle(Array::New(descriptor_len, Heap::kOld)); |
| 228 const Smi& arg_count = Smi::Handle(Smi::New(num_arguments)); |
| 229 |
| 230 // Set total number of passed arguments. |
| 231 descriptor.SetAt(kCountIndex, arg_count); |
| 232 |
| 233 // Set number of positional arguments. |
| 234 descriptor.SetAt(kPositionalCountIndex, arg_count); |
| 235 |
| 236 // Set terminating null. |
| 237 descriptor.SetAt((descriptor_len - 1), Object::Handle()); |
| 238 |
| 239 // Share the immutable descriptor when possible by canonicalizing it. |
| 240 descriptor.MakeImmutable(); |
| 241 descriptor ^= descriptor.Canonicalize(); |
| 242 return descriptor.raw(); |
| 243 } |
| 244 |
| 245 |
234 RawObject* DartLibraryCalls::ExceptionCreate( | 246 RawObject* DartLibraryCalls::ExceptionCreate( |
235 const Library& lib, | 247 const Library& lib, |
236 const String& class_name, | 248 const String& class_name, |
237 const GrowableArray<const Object*>& arguments) { | 249 const GrowableArray<const Object*>& arguments) { |
238 const Class& cls = Class::Handle(lib.LookupClassAllowPrivate(class_name)); | 250 const Class& cls = Class::Handle(lib.LookupClassAllowPrivate(class_name)); |
239 ASSERT(!cls.IsNull()); | 251 ASSERT(!cls.IsNull()); |
240 // For now, we only support a non-parameterized or raw type. | 252 // For now, we only support a non-parameterized or raw type. |
| 253 const int kNumExtraArgs = 2; // implicit rcvr and construction phase args. |
241 const Instance& exception_object = Instance::Handle(Instance::New(cls)); | 254 const Instance& exception_object = Instance::Handle(Instance::New(cls)); |
242 GrowableArray<const Object*> constructor_arguments(arguments.length() + 2); | 255 const Array& constructor_arguments = |
243 constructor_arguments.Add(&exception_object); | 256 Array::Handle(Array::New(arguments.length() + kNumExtraArgs)); |
244 constructor_arguments.Add(&Smi::Handle(Smi::New(Function::kCtorPhaseAll))); | 257 constructor_arguments.SetAt(0, exception_object); |
245 constructor_arguments.AddArray(arguments); | 258 constructor_arguments.SetAt( |
| 259 1, Smi::Handle(Smi::New(Function::kCtorPhaseAll))); |
| 260 for (intptr_t i = 0; i < arguments.length(); i++) { |
| 261 constructor_arguments.SetAt((i + kNumExtraArgs), *(arguments[i])); |
| 262 } |
246 | 263 |
247 String& constructor_name = String::Handle( | 264 String& constructor_name = String::Handle( |
248 String::Concat(class_name, Symbols::DotHandle())); | 265 String::Concat(class_name, Symbols::DotHandle())); |
249 Function& constructor = | 266 Function& constructor = |
250 Function::Handle(cls.LookupConstructor(constructor_name)); | 267 Function::Handle(cls.LookupConstructor(constructor_name)); |
251 ASSERT(!constructor.IsNull()); | 268 ASSERT(!constructor.IsNull()); |
252 const Array& kNoArgumentNames = Array::Handle(); | 269 const Object& retval = |
253 const Object& retval = Object::Handle( | 270 Object::Handle(DartEntry::InvokeStatic(constructor, constructor_arguments)); |
254 DartEntry::InvokeStatic(constructor, constructor_arguments, | |
255 kNoArgumentNames)); | |
256 ASSERT(retval.IsNull() || retval.IsError()); | 271 ASSERT(retval.IsNull() || retval.IsError()); |
257 if (retval.IsError()) { | 272 if (retval.IsError()) { |
258 return retval.raw(); | 273 return retval.raw(); |
259 } | 274 } |
260 return exception_object.raw(); | 275 return exception_object.raw(); |
261 } | 276 } |
262 | 277 |
263 | 278 |
264 RawObject* DartLibraryCalls::ToString(const Instance& receiver) { | 279 RawObject* DartLibraryCalls::ToString(const Instance& receiver) { |
265 const String& function_name = | 280 const String& function_name = |
266 String::Handle(Symbols::New("toString")); | 281 String::Handle(Symbols::New("toString")); |
267 GrowableArray<const Object*> arguments; | |
268 const int kNumArguments = 1; // Receiver. | 282 const int kNumArguments = 1; // Receiver. |
269 const int kNumNamedArguments = 0; // None. | 283 const int kNumNamedArguments = 0; // None. |
270 const Array& kNoArgumentNames = Array::Handle(); | |
271 const Function& function = Function::Handle( | 284 const Function& function = Function::Handle( |
272 Resolver::ResolveDynamic(receiver, | 285 Resolver::ResolveDynamic(receiver, |
273 function_name, | 286 function_name, |
274 kNumArguments, | 287 kNumArguments, |
275 kNumNamedArguments)); | 288 kNumNamedArguments)); |
276 ASSERT(!function.IsNull()); | 289 ASSERT(!function.IsNull()); |
277 const Object& result = Object::Handle( | 290 const Array& args = Array::Handle(Array::New(kNumArguments)); |
278 DartEntry::InvokeDynamic(receiver, | 291 args.SetAt(0, receiver); |
279 function, | 292 const Object& result = Object::Handle(DartEntry::InvokeDynamic(function, |
280 arguments, | 293 args)); |
281 kNoArgumentNames)); | |
282 ASSERT(result.IsInstance() || result.IsError()); | 294 ASSERT(result.IsInstance() || result.IsError()); |
283 return result.raw(); | 295 return result.raw(); |
284 } | 296 } |
285 | 297 |
286 | 298 |
287 RawObject* DartLibraryCalls::Equals(const Instance& left, | 299 RawObject* DartLibraryCalls::Equals(const Instance& left, |
288 const Instance& right) { | 300 const Instance& right) { |
289 GrowableArray<const Object*> arguments; | |
290 arguments.Add(&right); | |
291 const int kNumArguments = 2; | 301 const int kNumArguments = 2; |
292 const int kNumNamedArguments = 0; | 302 const int kNumNamedArguments = 0; |
293 const Array& kNoArgumentNames = Array::Handle(); | |
294 const Function& function = Function::Handle( | 303 const Function& function = Function::Handle( |
295 Resolver::ResolveDynamic(left, | 304 Resolver::ResolveDynamic(left, |
296 Symbols::EqualOperatorHandle(), | 305 Symbols::EqualOperatorHandle(), |
297 kNumArguments, | 306 kNumArguments, |
298 kNumNamedArguments)); | 307 kNumNamedArguments)); |
299 ASSERT(!function.IsNull()); | 308 ASSERT(!function.IsNull()); |
300 const Object& result = Object::Handle( | 309 |
301 DartEntry::InvokeDynamic(left, function, arguments, kNoArgumentNames)); | 310 const Array& args = Array::Handle(Array::New(kNumArguments)); |
| 311 args.SetAt(0, left); |
| 312 args.SetAt(1, right); |
| 313 const Object& result = Object::Handle(DartEntry::InvokeDynamic(function, |
| 314 args)); |
302 ASSERT(result.IsInstance() || result.IsError()); | 315 ASSERT(result.IsInstance() || result.IsError()); |
303 return result.raw(); | 316 return result.raw(); |
304 } | 317 } |
305 | 318 |
306 | 319 |
307 RawObject* DartLibraryCalls::HandleMessage(Dart_Port dest_port_id, | 320 RawObject* DartLibraryCalls::HandleMessage(Dart_Port dest_port_id, |
308 Dart_Port reply_port_id, | 321 Dart_Port reply_port_id, |
309 const Instance& message) { | 322 const Instance& message) { |
310 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | 323 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
311 ASSERT(!isolate_lib.IsNull()); | 324 ASSERT(!isolate_lib.IsNull()); |
312 const String& public_class_name = | 325 const String& public_class_name = |
313 String::Handle(Symbols::New("_ReceivePortImpl")); | 326 String::Handle(Symbols::New("_ReceivePortImpl")); |
314 const String& class_name = | 327 const String& class_name = |
315 String::Handle(isolate_lib.PrivateName(public_class_name)); | 328 String::Handle(isolate_lib.PrivateName(public_class_name)); |
316 const String& function_name = | 329 const String& function_name = |
317 String::Handle(Symbols::New("_handleMessage")); | 330 String::Handle(Symbols::New("_handleMessage")); |
318 const int kNumArguments = 3; | 331 const int kNumArguments = 3; |
319 const Array& kNoArgumentNames = Array::Handle(); | 332 const Array& kNoArgumentNames = Array::Handle(); |
320 const Function& function = Function::Handle( | 333 const Function& function = Function::Handle( |
321 Resolver::ResolveStatic(isolate_lib, | 334 Resolver::ResolveStatic(isolate_lib, |
322 class_name, | 335 class_name, |
323 function_name, | 336 function_name, |
324 kNumArguments, | 337 kNumArguments, |
325 kNoArgumentNames, | 338 kNoArgumentNames, |
326 Resolver::kIsQualified)); | 339 Resolver::kIsQualified)); |
327 GrowableArray<const Object*> arguments(kNumArguments); | 340 const Array& args = Array::Handle(Array::New(kNumArguments)); |
328 arguments.Add(&Integer::Handle(Integer::New(dest_port_id))); | 341 args.SetAt(0, Integer::Handle(Integer::New(dest_port_id))); |
329 arguments.Add(&Integer::Handle(Integer::New(reply_port_id))); | 342 args.SetAt(1, Integer::Handle(Integer::New(reply_port_id))); |
330 arguments.Add(&message); | 343 args.SetAt(2, message); |
331 const Object& result = Object::Handle( | 344 const Object& result = Object::Handle(DartEntry::InvokeStatic(function, |
332 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); | 345 args)); |
333 ASSERT(result.IsNull() || result.IsError()); | 346 ASSERT(result.IsNull() || result.IsError()); |
334 return result.raw(); | 347 return result.raw(); |
335 } | 348 } |
336 | 349 |
337 | 350 |
338 RawObject* DartLibraryCalls::NewSendPort(intptr_t port_id) { | 351 RawObject* DartLibraryCalls::NewSendPort(intptr_t port_id) { |
339 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | 352 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
340 ASSERT(!isolate_lib.IsNull()); | 353 ASSERT(!isolate_lib.IsNull()); |
341 const String& public_class_name = | 354 const String& public_class_name = |
342 String::Handle(String::New("_SendPortImpl")); | 355 String::Handle(String::New("_SendPortImpl")); |
343 const String& class_name = | 356 const String& class_name = |
344 String::Handle(isolate_lib.PrivateName(public_class_name)); | 357 String::Handle(isolate_lib.PrivateName(public_class_name)); |
345 const String& function_name = String::Handle(Symbols::New("_create")); | 358 const String& function_name = String::Handle(Symbols::New("_create")); |
346 const int kNumArguments = 1; | 359 const int kNumArguments = 1; |
347 const Array& kNoArgumentNames = Array::Handle(); | 360 const Array& kNoArgumentNames = Array::Handle(); |
348 const Function& function = Function::Handle( | 361 const Function& function = Function::Handle( |
349 Resolver::ResolveStatic(isolate_lib, | 362 Resolver::ResolveStatic(isolate_lib, |
350 class_name, | 363 class_name, |
351 function_name, | 364 function_name, |
352 kNumArguments, | 365 kNumArguments, |
353 kNoArgumentNames, | 366 kNoArgumentNames, |
354 Resolver::kIsQualified)); | 367 Resolver::kIsQualified)); |
355 GrowableArray<const Object*> arguments(kNumArguments); | 368 const Array& args = Array::Handle(Array::New(kNumArguments)); |
356 arguments.Add(&Integer::Handle(Integer::New(port_id))); | 369 args.SetAt(0, Integer::Handle(Integer::New(port_id))); |
357 return DartEntry::InvokeStatic(function, arguments, kNoArgumentNames); | 370 return DartEntry::InvokeStatic(function, args); |
358 } | 371 } |
359 | 372 |
360 | 373 |
361 RawObject* DartLibraryCalls::MapSetAt(const Instance& map, | 374 RawObject* DartLibraryCalls::MapSetAt(const Instance& map, |
362 const Instance& key, | 375 const Instance& key, |
363 const Instance& value) { | 376 const Instance& value) { |
364 String& name = String::Handle(Symbols::AssignIndexToken()); | 377 String& name = String::Handle(Symbols::AssignIndexToken()); |
| 378 const int kNumArguments = 3; |
365 const Function& function = Function::Handle( | 379 const Function& function = Function::Handle( |
366 Resolver::ResolveDynamic(map, name, 3, 0)); | 380 Resolver::ResolveDynamic(map, name, kNumArguments, 0)); |
367 ASSERT(!function.IsNull()); | 381 ASSERT(!function.IsNull()); |
368 GrowableArray<const Object*> args(2); | 382 const Array& args = Array::Handle(Array::New(kNumArguments)); |
369 args.Add(&key); | 383 args.SetAt(0, map); |
370 args.Add(&value); | 384 args.SetAt(1, key); |
371 const Array& kNoArgumentNames = Array::Handle(); | 385 args.SetAt(2, value); |
372 const Object& result = Object::Handle( | 386 const Object& result = Object::Handle(DartEntry::InvokeDynamic(function, |
373 DartEntry::InvokeDynamic(map, function, args, kNoArgumentNames)); | 387 args)); |
374 return result.raw(); | 388 return result.raw(); |
375 } | 389 } |
376 | 390 |
377 | 391 |
378 RawObject* DartLibraryCalls::PortGetId(const Instance& port) { | 392 RawObject* DartLibraryCalls::PortGetId(const Instance& port) { |
379 const String& field_name = String::Handle(Symbols::New("_id")); | 393 const String& field_name = String::Handle(Symbols::New("_id")); |
380 const Class& cls = Class::Handle(port.clazz()); | 394 const Class& cls = Class::Handle(port.clazz()); |
381 const String& func_name = String::Handle(Field::GetterName(field_name)); | 395 const String& func_name = String::Handle(Field::GetterName(field_name)); |
382 const Function& func = Function::Handle(cls.LookupDynamicFunction(func_name)); | 396 const Function& func = Function::Handle(cls.LookupDynamicFunction(func_name)); |
383 ASSERT(!func.IsNull()); | 397 ASSERT(!func.IsNull()); |
384 GrowableArray<const Object*> arguments; | 398 const Array& args = Array::Handle(Array::New(1)); |
385 const Array& kNoArgumentNames = Array::Handle(); | 399 args.SetAt(0, port); |
386 return DartEntry::InvokeDynamic(port, func, arguments, kNoArgumentNames); | 400 return DartEntry::InvokeDynamic(func, args); |
387 } | 401 } |
388 | 402 |
389 | 403 |
390 } // namespace dart | 404 } // namespace dart |
OLD | NEW |