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 |