| 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 | 13 |
| 13 namespace dart { | 14 namespace dart { |
| 14 | 15 |
| 15 RawObject* DartEntry::InvokeDynamic( | 16 RawObject* DartEntry::InvokeDynamic( |
| 16 const Instance& receiver, | 17 const Instance& receiver, |
| 17 const Function& function, | 18 const Function& function, |
| 18 const GrowableArray<const Object*>& arguments, | 19 const GrowableArray<const Object*>& arguments, |
| 19 const Array& optional_arguments_names) { | 20 const Array& optional_arguments_names) { |
| 20 // Get the entrypoint corresponding to the function specified, this | 21 // Get the entrypoint corresponding to the function specified, this |
| 21 // will result in a compilation of the function if it is not already | 22 // will result in a compilation of the function if it is not already |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 const GrowableArray<const Object*>& arguments) { | 169 const GrowableArray<const Object*>& arguments) { |
| 169 const Class& cls = Class::Handle(lib.LookupClass(class_name)); | 170 const Class& cls = Class::Handle(lib.LookupClass(class_name)); |
| 170 ASSERT(!cls.IsNull()); | 171 ASSERT(!cls.IsNull()); |
| 171 // For now, we only support a non-parameterized or raw type. | 172 // For now, we only support a non-parameterized or raw type. |
| 172 const Instance& exception_object = Instance::Handle(Instance::New(cls)); | 173 const Instance& exception_object = Instance::Handle(Instance::New(cls)); |
| 173 GrowableArray<const Object*> constructor_arguments(arguments.length() + 2); | 174 GrowableArray<const Object*> constructor_arguments(arguments.length() + 2); |
| 174 constructor_arguments.Add(&exception_object); | 175 constructor_arguments.Add(&exception_object); |
| 175 constructor_arguments.Add(&Smi::Handle(Smi::New(Function::kCtorPhaseAll))); | 176 constructor_arguments.Add(&Smi::Handle(Smi::New(Function::kCtorPhaseAll))); |
| 176 constructor_arguments.AddArray(arguments); | 177 constructor_arguments.AddArray(arguments); |
| 177 | 178 |
| 178 const String& period = String::Handle(String::New(".")); | 179 const String& period = String::Handle(Symbols::Dot()); |
| 179 String& constructor_name = String::Handle(String::Concat(class_name, period)); | 180 String& constructor_name = String::Handle(String::Concat(class_name, period)); |
| 180 Function& constructor = | 181 Function& constructor = |
| 181 Function::Handle(cls.LookupConstructor(constructor_name)); | 182 Function::Handle(cls.LookupConstructor(constructor_name)); |
| 182 ASSERT(!constructor.IsNull()); | 183 ASSERT(!constructor.IsNull()); |
| 183 const Array& kNoArgumentNames = Array::Handle(); | 184 const Array& kNoArgumentNames = Array::Handle(); |
| 184 const Object& retval = Object::Handle( | 185 const Object& retval = Object::Handle( |
| 185 DartEntry::InvokeStatic(constructor, constructor_arguments, | 186 DartEntry::InvokeStatic(constructor, constructor_arguments, |
| 186 kNoArgumentNames)); | 187 kNoArgumentNames)); |
| 187 ASSERT(retval.IsNull() || retval.IsError()); | 188 ASSERT(retval.IsNull() || retval.IsError()); |
| 188 if (retval.IsError()) { | 189 if (retval.IsError()) { |
| 189 return retval.raw(); | 190 return retval.raw(); |
| 190 } | 191 } |
| 191 return exception_object.raw(); | 192 return exception_object.raw(); |
| 192 } | 193 } |
| 193 | 194 |
| 194 | 195 |
| 195 RawObject* DartLibraryCalls::ToString(const Instance& receiver) { | 196 RawObject* DartLibraryCalls::ToString(const Instance& receiver) { |
| 196 const String& function_name = | 197 const String& function_name = |
| 197 String::Handle(String::NewSymbol("toString")); | 198 String::Handle(Symbols::New("toString")); |
| 198 GrowableArray<const Object*> arguments; | 199 GrowableArray<const Object*> arguments; |
| 199 const int kNumArguments = 1; // Receiver. | 200 const int kNumArguments = 1; // Receiver. |
| 200 const int kNumNamedArguments = 0; // None. | 201 const int kNumNamedArguments = 0; // None. |
| 201 const Array& kNoArgumentNames = Array::Handle(); | 202 const Array& kNoArgumentNames = Array::Handle(); |
| 202 const Function& function = Function::Handle( | 203 const Function& function = Function::Handle( |
| 203 Resolver::ResolveDynamic(receiver, | 204 Resolver::ResolveDynamic(receiver, |
| 204 function_name, | 205 function_name, |
| 205 kNumArguments, | 206 kNumArguments, |
| 206 kNumNamedArguments)); | 207 kNumNamedArguments)); |
| 207 ASSERT(!function.IsNull()); | 208 ASSERT(!function.IsNull()); |
| 208 const Object& result = Object::Handle( | 209 const Object& result = Object::Handle( |
| 209 DartEntry::InvokeDynamic(receiver, | 210 DartEntry::InvokeDynamic(receiver, |
| 210 function, | 211 function, |
| 211 arguments, | 212 arguments, |
| 212 kNoArgumentNames)); | 213 kNoArgumentNames)); |
| 213 ASSERT(result.IsInstance() || result.IsError()); | 214 ASSERT(result.IsInstance() || result.IsError()); |
| 214 return result.raw(); | 215 return result.raw(); |
| 215 } | 216 } |
| 216 | 217 |
| 217 | 218 |
| 218 RawObject* DartLibraryCalls::Equals(const Instance& left, | 219 RawObject* DartLibraryCalls::Equals(const Instance& left, |
| 219 const Instance& right) { | 220 const Instance& right) { |
| 220 const String& function_name = | 221 const String& function_name = |
| 221 String::Handle(String::NewSymbol("==")); | 222 String::Handle(Symbols::New("==")); |
| 222 GrowableArray<const Object*> arguments; | 223 GrowableArray<const Object*> arguments; |
| 223 arguments.Add(&right); | 224 arguments.Add(&right); |
| 224 const int kNumArguments = 2; | 225 const int kNumArguments = 2; |
| 225 const int kNumNamedArguments = 0; | 226 const int kNumNamedArguments = 0; |
| 226 const Array& kNoArgumentNames = Array::Handle(); | 227 const Array& kNoArgumentNames = Array::Handle(); |
| 227 const Function& function = Function::Handle( | 228 const Function& function = Function::Handle( |
| 228 Resolver::ResolveDynamic(left, | 229 Resolver::ResolveDynamic(left, |
| 229 function_name, | 230 function_name, |
| 230 kNumArguments, | 231 kNumArguments, |
| 231 kNumNamedArguments)); | 232 kNumNamedArguments)); |
| 232 ASSERT(!function.IsNull()); | 233 ASSERT(!function.IsNull()); |
| 233 const Object& result = Object::Handle( | 234 const Object& result = Object::Handle( |
| 234 DartEntry::InvokeDynamic(left, function, arguments, kNoArgumentNames)); | 235 DartEntry::InvokeDynamic(left, function, arguments, kNoArgumentNames)); |
| 235 ASSERT(result.IsInstance() || result.IsError()); | 236 ASSERT(result.IsInstance() || result.IsError()); |
| 236 return result.raw(); | 237 return result.raw(); |
| 237 } | 238 } |
| 238 | 239 |
| 239 | 240 |
| 240 RawObject* DartLibraryCalls::HandleMessage(Dart_Port dest_port_id, | 241 RawObject* DartLibraryCalls::HandleMessage(Dart_Port dest_port_id, |
| 241 Dart_Port reply_port_id, | 242 Dart_Port reply_port_id, |
| 242 const Instance& message) { | 243 const Instance& message) { |
| 243 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | 244 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
| 244 ASSERT(!isolate_lib.IsNull()); | 245 ASSERT(!isolate_lib.IsNull()); |
| 245 const String& public_class_name = | 246 const String& public_class_name = |
| 246 String::Handle(String::NewSymbol("_ReceivePortImpl")); | 247 String::Handle(Symbols::New("_ReceivePortImpl")); |
| 247 const String& class_name = | 248 const String& class_name = |
| 248 String::Handle(isolate_lib.PrivateName(public_class_name)); | 249 String::Handle(isolate_lib.PrivateName(public_class_name)); |
| 249 const String& function_name = | 250 const String& function_name = |
| 250 String::Handle(String::NewSymbol("_handleMessage")); | 251 String::Handle(Symbols::New("_handleMessage")); |
| 251 const int kNumArguments = 3; | 252 const int kNumArguments = 3; |
| 252 const Array& kNoArgumentNames = Array::Handle(); | 253 const Array& kNoArgumentNames = Array::Handle(); |
| 253 const Function& function = Function::Handle( | 254 const Function& function = Function::Handle( |
| 254 Resolver::ResolveStatic(isolate_lib, | 255 Resolver::ResolveStatic(isolate_lib, |
| 255 class_name, | 256 class_name, |
| 256 function_name, | 257 function_name, |
| 257 kNumArguments, | 258 kNumArguments, |
| 258 kNoArgumentNames, | 259 kNoArgumentNames, |
| 259 Resolver::kIsQualified)); | 260 Resolver::kIsQualified)); |
| 260 GrowableArray<const Object*> arguments(kNumArguments); | 261 GrowableArray<const Object*> arguments(kNumArguments); |
| 261 arguments.Add(&Integer::Handle(Integer::New(dest_port_id))); | 262 arguments.Add(&Integer::Handle(Integer::New(dest_port_id))); |
| 262 arguments.Add(&Integer::Handle(Integer::New(reply_port_id))); | 263 arguments.Add(&Integer::Handle(Integer::New(reply_port_id))); |
| 263 arguments.Add(&message); | 264 arguments.Add(&message); |
| 264 const Object& result = Object::Handle( | 265 const Object& result = Object::Handle( |
| 265 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); | 266 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); |
| 266 ASSERT(result.IsNull() || result.IsError()); | 267 ASSERT(result.IsNull() || result.IsError()); |
| 267 return result.raw(); | 268 return result.raw(); |
| 268 } | 269 } |
| 269 | 270 |
| 270 | 271 |
| 271 RawObject* DartLibraryCalls::NewSendPort(intptr_t port_id) { | 272 RawObject* DartLibraryCalls::NewSendPort(intptr_t port_id) { |
| 272 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | 273 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
| 273 ASSERT(!isolate_lib.IsNull()); | 274 ASSERT(!isolate_lib.IsNull()); |
| 274 const String& public_class_name = | 275 const String& public_class_name = |
| 275 String::Handle(String::New("_SendPortImpl")); | 276 String::Handle(String::New("_SendPortImpl")); |
| 276 const String& class_name = | 277 const String& class_name = |
| 277 String::Handle(isolate_lib.PrivateName(public_class_name)); | 278 String::Handle(isolate_lib.PrivateName(public_class_name)); |
| 278 const String& function_name = String::Handle(String::NewSymbol("_create")); | 279 const String& function_name = String::Handle(Symbols::New("_create")); |
| 279 const int kNumArguments = 1; | 280 const int kNumArguments = 1; |
| 280 const Array& kNoArgumentNames = Array::Handle(); | 281 const Array& kNoArgumentNames = Array::Handle(); |
| 281 const Function& function = Function::Handle( | 282 const Function& function = Function::Handle( |
| 282 Resolver::ResolveStatic(isolate_lib, | 283 Resolver::ResolveStatic(isolate_lib, |
| 283 class_name, | 284 class_name, |
| 284 function_name, | 285 function_name, |
| 285 kNumArguments, | 286 kNumArguments, |
| 286 kNoArgumentNames, | 287 kNoArgumentNames, |
| 287 Resolver::kIsQualified)); | 288 Resolver::kIsQualified)); |
| 288 GrowableArray<const Object*> arguments(kNumArguments); | 289 GrowableArray<const Object*> arguments(kNumArguments); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 302 args.Add(&key); | 303 args.Add(&key); |
| 303 args.Add(&value); | 304 args.Add(&value); |
| 304 const Array& kNoArgumentNames = Array::Handle(); | 305 const Array& kNoArgumentNames = Array::Handle(); |
| 305 const Object& result = Object::Handle( | 306 const Object& result = Object::Handle( |
| 306 DartEntry::InvokeDynamic(map, function, args, kNoArgumentNames)); | 307 DartEntry::InvokeDynamic(map, function, args, kNoArgumentNames)); |
| 307 return result.raw(); | 308 return result.raw(); |
| 308 } | 309 } |
| 309 | 310 |
| 310 | 311 |
| 311 RawObject* DartLibraryCalls::PortGetId(const Instance& port) { | 312 RawObject* DartLibraryCalls::PortGetId(const Instance& port) { |
| 312 const String& field_name = String::Handle(String::NewSymbol("_id")); | 313 const String& field_name = String::Handle(Symbols::New("_id")); |
| 313 const Class& cls = Class::Handle(port.clazz()); | 314 const Class& cls = Class::Handle(port.clazz()); |
| 314 const String& func_name = String::Handle(Field::GetterName(field_name)); | 315 const String& func_name = String::Handle(Field::GetterName(field_name)); |
| 315 const Function& func = Function::Handle(cls.LookupDynamicFunction(func_name)); | 316 const Function& func = Function::Handle(cls.LookupDynamicFunction(func_name)); |
| 316 ASSERT(!func.IsNull()); | 317 ASSERT(!func.IsNull()); |
| 317 GrowableArray<const Object*> arguments; | 318 GrowableArray<const Object*> arguments; |
| 318 const Array& kNoArgumentNames = Array::Handle(); | 319 const Array& kNoArgumentNames = Array::Handle(); |
| 319 return DartEntry::InvokeDynamic(port, func, arguments, kNoArgumentNames); | 320 return DartEntry::InvokeDynamic(port, func, arguments, kNoArgumentNames); |
| 320 } | 321 } |
| 321 | 322 |
| 322 | 323 |
| 323 } // namespace dart | 324 } // namespace dart |
| OLD | NEW |