| 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/longjump.h" | |
| 10 #include "vm/object_store.h" | 9 #include "vm/object_store.h" |
| 11 #include "vm/resolver.h" | 10 #include "vm/resolver.h" |
| 12 #include "vm/stub_code.h" | 11 #include "vm/stub_code.h" |
| 13 | 12 |
| 14 namespace dart { | 13 namespace dart { |
| 15 | 14 |
| 16 RawInstance* DartEntry::InvokeDynamic( | 15 RawObject* DartEntry::InvokeDynamic( |
| 17 const Instance& receiver, | 16 const Instance& receiver, |
| 18 const Function& function, | 17 const Function& function, |
| 19 const GrowableArray<const Object*>& arguments, | 18 const GrowableArray<const Object*>& arguments, |
| 20 const Array& optional_arguments_names) { | 19 const Array& optional_arguments_names) { |
| 21 // Get the entrypoint corresponding to the function specified, this | 20 // Get the entrypoint corresponding to the function specified, this |
| 22 // will result in a compilation of the function if it is not already | 21 // will result in a compilation of the function if it is not already |
| 23 // compiled. | 22 // compiled. |
| 24 if (!function.HasCode()) { | 23 if (!function.HasCode()) { |
| 25 Compiler::CompileFunction(function); | 24 const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
| 25 if (!error.IsNull()) { |
| 26 return error.raw(); |
| 27 } |
| 26 } | 28 } |
| 27 const Code& code = Code::Handle(function.code()); | 29 const Code& code = Code::Handle(function.code()); |
| 28 ASSERT(!code.IsNull()); | 30 ASSERT(!code.IsNull()); |
| 29 const Instructions& instrs = Instructions::Handle(code.instructions()); | 31 const Instructions& instrs = Instructions::Handle(code.instructions()); |
| 30 ASSERT(!instrs.IsNull()); | 32 ASSERT(!instrs.IsNull()); |
| 31 | 33 |
| 32 // Set up arguments to include the receiver as the first argument. | 34 // Set up arguments to include the receiver as the first argument. |
| 33 const int num_arguments = arguments.length() + 1; | 35 const int num_arguments = arguments.length() + 1; |
| 34 GrowableArray<const Object*> args(num_arguments); | 36 GrowableArray<const Object*> args(num_arguments); |
| 35 const Object& arg0 = Object::ZoneHandle(receiver.raw()); | 37 const Object& arg0 = Object::ZoneHandle(receiver.raw()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 46 ASSERT(context.isolate() == Isolate::Current()); | 48 ASSERT(context.isolate() == Isolate::Current()); |
| 47 return entrypoint( | 49 return entrypoint( |
| 48 instrs.EntryPoint(), | 50 instrs.EntryPoint(), |
| 49 CodeGenerator::ArgumentsDescriptor(num_arguments, | 51 CodeGenerator::ArgumentsDescriptor(num_arguments, |
| 50 optional_arguments_names), | 52 optional_arguments_names), |
| 51 args.data(), | 53 args.data(), |
| 52 context); | 54 context); |
| 53 } | 55 } |
| 54 | 56 |
| 55 | 57 |
| 56 RawInstance* DartEntry::InvokeStatic( | 58 RawObject* DartEntry::InvokeStatic( |
| 57 const Function& function, | 59 const Function& function, |
| 58 const GrowableArray<const Object*>& arguments, | 60 const GrowableArray<const Object*>& arguments, |
| 59 const Array& optional_arguments_names) { | 61 const Array& optional_arguments_names) { |
| 60 // Get the entrypoint corresponding to the function specified, this | 62 // Get the entrypoint corresponding to the function specified, this |
| 61 // will result in a compilation of the function if it is not already | 63 // will result in a compilation of the function if it is not already |
| 62 // compiled. | 64 // compiled. |
| 63 ASSERT(!function.IsNull()); | 65 ASSERT(!function.IsNull()); |
| 64 if (!function.HasCode()) { | 66 if (!function.HasCode()) { |
| 65 Compiler::CompileFunction(function); | 67 const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
| 68 if (!error.IsNull()) { |
| 69 return error.raw(); |
| 70 } |
| 66 } | 71 } |
| 67 const Code& code = Code::Handle(function.code()); | 72 const Code& code = Code::Handle(function.code()); |
| 68 ASSERT(!code.IsNull()); | 73 ASSERT(!code.IsNull()); |
| 69 const Instructions& instrs = Instructions::Handle(code.instructions()); | 74 const Instructions& instrs = Instructions::Handle(code.instructions()); |
| 70 ASSERT(!instrs.IsNull()); | 75 ASSERT(!instrs.IsNull()); |
| 71 | 76 |
| 72 // Now Call the invoke stub which will invoke the dart function. | 77 // Now Call the invoke stub which will invoke the dart function. |
| 73 invokestub entrypoint = reinterpret_cast<invokestub>( | 78 invokestub entrypoint = reinterpret_cast<invokestub>( |
| 74 StubCode::InvokeDartCodeEntryPoint()); | 79 StubCode::InvokeDartCodeEntryPoint()); |
| 75 const Context& context = | 80 const Context& context = |
| 76 Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); | 81 Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); |
| 77 ASSERT(context.isolate() == Isolate::Current()); | 82 ASSERT(context.isolate() == Isolate::Current()); |
| 78 return entrypoint( | 83 return entrypoint( |
| 79 instrs.EntryPoint(), | 84 instrs.EntryPoint(), |
| 80 CodeGenerator::ArgumentsDescriptor(arguments.length(), | 85 CodeGenerator::ArgumentsDescriptor(arguments.length(), |
| 81 optional_arguments_names), | 86 optional_arguments_names), |
| 82 arguments.data(), | 87 arguments.data(), |
| 83 context); | 88 context); |
| 84 } | 89 } |
| 85 | 90 |
| 86 | 91 |
| 87 RawInstance* DartEntry::InvokeClosure( | 92 RawObject* DartEntry::InvokeClosure( |
| 88 const Closure& closure, | 93 const Closure& closure, |
| 89 const GrowableArray<const Object*>& arguments, | 94 const GrowableArray<const Object*>& arguments, |
| 90 const Array& optional_arguments_names) { | 95 const Array& optional_arguments_names) { |
| 91 // Get the entrypoint corresponding to the closure specified, this | 96 // Get the entrypoint corresponding to the closure specified, this |
| 92 // will result in a compilation of the closure if it is not already | 97 // will result in a compilation of the closure if it is not already |
| 93 // compiled. | 98 // compiled. |
| 94 ASSERT(Class::Handle(closure.clazz()).signature_function() != Object::null()); | 99 ASSERT(Class::Handle(closure.clazz()).signature_function() != Object::null()); |
| 95 const Function& function = Function::Handle(closure.function()); | 100 const Function& function = Function::Handle(closure.function()); |
| 96 const Context& context = Context::Handle(closure.context()); | 101 const Context& context = Context::Handle(closure.context()); |
| 97 ASSERT(!function.IsNull()); | 102 ASSERT(!function.IsNull()); |
| 98 if (!function.HasCode()) { | 103 if (!function.HasCode()) { |
| 99 Compiler::CompileFunction(function); | 104 const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
| 105 if (!error.IsNull()) { |
| 106 return error.raw(); |
| 107 } |
| 100 } | 108 } |
| 101 const Code& code = Code::Handle(function.code()); | 109 const Code& code = Code::Handle(function.code()); |
| 102 ASSERT(!code.IsNull()); | 110 ASSERT(!code.IsNull()); |
| 103 const Instructions& instrs = Instructions::Handle(code.instructions()); | 111 const Instructions& instrs = Instructions::Handle(code.instructions()); |
| 104 ASSERT(!instrs.IsNull()); | 112 ASSERT(!instrs.IsNull()); |
| 105 | 113 |
| 106 // Now Call the invoke stub which will invoke the closure. | 114 // Now Call the invoke stub which will invoke the closure. |
| 107 invokestub entrypoint = reinterpret_cast<invokestub>( | 115 invokestub entrypoint = reinterpret_cast<invokestub>( |
| 108 StubCode::InvokeDartCodeEntryPoint()); | 116 StubCode::InvokeDartCodeEntryPoint()); |
| 109 ASSERT(context.isolate() == Isolate::Current()); | 117 ASSERT(context.isolate() == Isolate::Current()); |
| 110 return entrypoint( | 118 return entrypoint( |
| 111 instrs.EntryPoint(), | 119 instrs.EntryPoint(), |
| 112 CodeGenerator::ArgumentsDescriptor(arguments.length(), | 120 CodeGenerator::ArgumentsDescriptor(arguments.length(), |
| 113 optional_arguments_names), | 121 optional_arguments_names), |
| 114 arguments.data(), | 122 arguments.data(), |
| 115 context); | 123 context); |
| 116 } | 124 } |
| 117 | 125 |
| 118 | 126 |
| 119 RawInstance* DartLibraryCalls::ExceptionCreate( | 127 RawObject* DartLibraryCalls::ExceptionCreate( |
| 120 const String& class_name, | 128 const String& class_name, |
| 121 const GrowableArray<const Object*>& arguments) { | 129 const GrowableArray<const Object*>& arguments) { |
| 122 const Library& core_lib = Library::Handle(Library::CoreLibrary()); | 130 const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
| 123 const Class& cls = Class::Handle(core_lib.LookupClass(class_name)); | 131 const Class& cls = Class::Handle(core_lib.LookupClass(class_name)); |
| 124 ASSERT(!cls.IsNull()); | 132 ASSERT(!cls.IsNull()); |
| 125 // For now, we only support a non-parameterized or raw type. | 133 // For now, we only support a non-parameterized or raw type. |
| 126 const Instance& exception_object = Instance::Handle(Instance::New(cls)); | 134 const Instance& exception_object = Instance::Handle(Instance::New(cls)); |
| 127 GrowableArray<const Object*> constructor_arguments(arguments.length() + 2); | 135 GrowableArray<const Object*> constructor_arguments(arguments.length() + 2); |
| 128 constructor_arguments.Add(&exception_object); | 136 constructor_arguments.Add(&exception_object); |
| 129 constructor_arguments.Add(&Smi::Handle(Smi::New(Function::kCtorPhaseAll))); | 137 constructor_arguments.Add(&Smi::Handle(Smi::New(Function::kCtorPhaseAll))); |
| 130 constructor_arguments.AddArray(arguments); | 138 constructor_arguments.AddArray(arguments); |
| 131 | 139 |
| 132 const String& period = String::Handle(String::New(".")); | 140 const String& period = String::Handle(String::New(".")); |
| 133 String& constructor_name = String::Handle(String::Concat(class_name, period)); | 141 String& constructor_name = String::Handle(String::Concat(class_name, period)); |
| 134 Function& constructor = | 142 Function& constructor = |
| 135 Function::Handle(cls.LookupConstructor(constructor_name)); | 143 Function::Handle(cls.LookupConstructor(constructor_name)); |
| 136 ASSERT(!constructor.IsNull()); | 144 ASSERT(!constructor.IsNull()); |
| 137 const Array& kNoArgumentNames = Array::Handle(); | 145 const Array& kNoArgumentNames = Array::Handle(); |
| 138 DartEntry::InvokeStatic(constructor, constructor_arguments, kNoArgumentNames); | 146 const Object& retval = Object::Handle( |
| 147 DartEntry::InvokeStatic(constructor, constructor_arguments, |
| 148 kNoArgumentNames)); |
| 149 ASSERT(retval.IsNull() || retval.IsError()); |
| 150 if (retval.IsError()) { |
| 151 return retval.raw(); |
| 152 } |
| 139 return exception_object.raw(); | 153 return exception_object.raw(); |
| 140 } | 154 } |
| 141 | 155 |
| 142 | 156 |
| 143 RawInstance* DartLibraryCalls::ToString(const Instance& receiver) { | 157 RawObject* DartLibraryCalls::ToString(const Instance& receiver) { |
| 144 const String& function_name = | 158 const String& function_name = |
| 145 String::Handle(String::NewSymbol("toString")); | 159 String::Handle(String::NewSymbol("toString")); |
| 146 GrowableArray<const Object*> arguments; | 160 GrowableArray<const Object*> arguments; |
| 147 const int kNumArguments = 1; // Receiver. | 161 const int kNumArguments = 1; // Receiver. |
| 148 const int kNumNamedArguments = 0; // None. | 162 const int kNumNamedArguments = 0; // None. |
| 149 const Array& kNoArgumentNames = Array::Handle(); | 163 const Array& kNoArgumentNames = Array::Handle(); |
| 150 const Function& function = Function::Handle( | 164 const Function& function = Function::Handle( |
| 151 Resolver::ResolveDynamic(receiver, | 165 Resolver::ResolveDynamic(receiver, |
| 152 function_name, | 166 function_name, |
| 153 kNumArguments, | 167 kNumArguments, |
| 154 kNumNamedArguments)); | 168 kNumNamedArguments)); |
| 155 ASSERT(!function.IsNull()); | 169 ASSERT(!function.IsNull()); |
| 156 const Instance& result = Instance::Handle( | 170 const Object& result = Object::Handle( |
| 157 DartEntry::InvokeDynamic(receiver, | 171 DartEntry::InvokeDynamic(receiver, |
| 158 function, | 172 function, |
| 159 arguments, | 173 arguments, |
| 160 kNoArgumentNames)); | 174 kNoArgumentNames)); |
| 161 // Object's 'toString' threw an exception, let the caller handle it. | 175 ASSERT(result.IsInstance() || result.IsError()); |
| 162 ASSERT(result.IsString() || result.IsUnhandledException()); | |
| 163 return result.raw(); | 176 return result.raw(); |
| 164 } | 177 } |
| 165 | 178 |
| 166 | 179 |
| 167 RawInstance* DartLibraryCalls::Equals(const Instance& left, | 180 RawObject* DartLibraryCalls::Equals(const Instance& left, |
| 168 const Instance& right) { | 181 const Instance& right) { |
| 169 const String& function_name = | 182 const String& function_name = |
| 170 String::Handle(String::NewSymbol("==")); | 183 String::Handle(String::NewSymbol("==")); |
| 171 GrowableArray<const Object*> arguments; | 184 GrowableArray<const Object*> arguments; |
| 172 arguments.Add(&right); | 185 arguments.Add(&right); |
| 173 const int kNumArguments = 2; | 186 const int kNumArguments = 2; |
| 174 const int kNumNamedArguments = 0; | 187 const int kNumNamedArguments = 0; |
| 175 const Array& kNoArgumentNames = Array::Handle(); | 188 const Array& kNoArgumentNames = Array::Handle(); |
| 176 const Function& function = Function::Handle( | 189 const Function& function = Function::Handle( |
| 177 Resolver::ResolveDynamic(left, | 190 Resolver::ResolveDynamic(left, |
| 178 function_name, | 191 function_name, |
| 179 kNumArguments, | 192 kNumArguments, |
| 180 kNumNamedArguments)); | 193 kNumNamedArguments)); |
| 181 ASSERT(!function.IsNull()); | 194 ASSERT(!function.IsNull()); |
| 182 const Instance& result = Instance::Handle( | 195 const Object& result = Object::Handle( |
| 183 DartEntry::InvokeDynamic(left, function, arguments, kNoArgumentNames)); | 196 DartEntry::InvokeDynamic(left, function, arguments, kNoArgumentNames)); |
| 184 // Object's '==' threw an exception, let the caller handle it. | 197 ASSERT(result.IsInstance() || result.IsError()); |
| 185 ASSERT(result.IsBool() || result.IsUnhandledException()); | |
| 186 return result.raw(); | 198 return result.raw(); |
| 187 } | 199 } |
| 188 | 200 |
| 189 | 201 |
| 190 RawObject* DartLibraryCalls::HandleMessage(Dart_Port dest_port_id, | 202 RawObject* DartLibraryCalls::HandleMessage(Dart_Port dest_port_id, |
| 191 Dart_Port reply_port_id, | 203 Dart_Port reply_port_id, |
| 192 const Instance& message) { | 204 const Instance& message) { |
| 193 const String& class_name = | 205 const String& class_name = |
| 194 String::Handle(String::NewSymbol("ReceivePortImpl")); | 206 String::Handle(String::NewSymbol("ReceivePortImpl")); |
| 195 const String& function_name = | 207 const String& function_name = |
| 196 String::Handle(String::NewSymbol("_handleMessage")); | 208 String::Handle(String::NewSymbol("_handleMessage")); |
| 197 const int kNumArguments = 3; | 209 const int kNumArguments = 3; |
| 198 const Array& kNoArgumentNames = Array::Handle(); | 210 const Array& kNoArgumentNames = Array::Handle(); |
| 199 const Function& function = Function::Handle( | 211 const Function& function = Function::Handle( |
| 200 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), | 212 Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()), |
| 201 class_name, | 213 class_name, |
| 202 function_name, | 214 function_name, |
| 203 kNumArguments, | 215 kNumArguments, |
| 204 kNoArgumentNames, | 216 kNoArgumentNames, |
| 205 Resolver::kIsQualified)); | 217 Resolver::kIsQualified)); |
| 206 GrowableArray<const Object*> arguments(kNumArguments); | 218 GrowableArray<const Object*> arguments(kNumArguments); |
| 207 arguments.Add(&Integer::Handle(Integer::New(dest_port_id))); | 219 arguments.Add(&Integer::Handle(Integer::New(dest_port_id))); |
| 208 arguments.Add(&Integer::Handle(Integer::New(reply_port_id))); | 220 arguments.Add(&Integer::Handle(Integer::New(reply_port_id))); |
| 209 arguments.Add(&message); | 221 arguments.Add(&message); |
| 210 const Object& result = Object::Handle( | 222 const Object& result = Object::Handle( |
| 211 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); | 223 DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); |
| 212 ASSERT(result.IsNull() || result.IsUnhandledException()); | 224 ASSERT(result.IsNull() || result.IsError()); |
| 213 return result.raw(); | 225 return result.raw(); |
| 214 } | 226 } |
| 215 | 227 |
| 216 } // namespace dart | 228 } // namespace dart |
| OLD | NEW |