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/code_generator.h" | 5 #include "vm/code_generator.h" |
6 | 6 |
7 #include "vm/code_index_table.h" | 7 #include "vm/code_index_table.h" |
8 #include "vm/code_patcher.h" | 8 #include "vm/code_patcher.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 (instantiator.Length() != type_arguments.Length())); | 215 (instantiator.Length() != type_arguments.Length())); |
216 type_arguments = TypeArguments::NewInstantiatedTypeArguments(type_arguments, | 216 type_arguments = TypeArguments::NewInstantiatedTypeArguments(type_arguments, |
217 instantiator); | 217 instantiator); |
218 arguments.SetReturn(type_arguments); | 218 arguments.SetReturn(type_arguments); |
219 } | 219 } |
220 | 220 |
221 | 221 |
222 // Allocate a new closure. | 222 // Allocate a new closure. |
223 // Arg0: local function. | 223 // Arg0: local function. |
224 // TODO(regis): Arg1: type arguments of the closure. | 224 // TODO(regis): Arg1: type arguments of the closure. |
225 // TODO(regis): Arg2: type arguments of the instantiator. | |
226 // Return value: newly allocated closure. | 225 // Return value: newly allocated closure. |
227 DEFINE_RUNTIME_ENTRY(AllocateClosure, 1) { | 226 DEFINE_RUNTIME_ENTRY(AllocateClosure, 1) { |
228 ASSERT(arguments.Count() == kAllocateClosureRuntimeEntry.argument_count()); | 227 ASSERT(arguments.Count() == kAllocateClosureRuntimeEntry.argument_count()); |
229 const Function& function = Function::CheckedHandle(arguments.At(0)); | 228 const Function& function = Function::CheckedHandle(arguments.At(0)); |
| 229 ASSERT(function.IsClosureFunction() && !function.IsImplicitClosureFunction()); |
230 // TODO(regis): Process type arguments unless the closure is static. | 230 // TODO(regis): Process type arguments unless the closure is static. |
231 // The current context was saved in the Isolate structure when entering the | 231 // The current context was saved in the Isolate structure when entering the |
232 // runtime. | 232 // runtime. |
233 const Context& context = Context::Handle(Isolate::Current()->top_context()); | 233 const Context& context = Context::Handle(Isolate::Current()->top_context()); |
234 ASSERT(!context.IsNull()); | 234 ASSERT(!context.IsNull()); |
235 arguments.SetReturn(Closure::Handle(Closure::New(function, context))); | 235 arguments.SetReturn(Closure::Handle(Closure::New(function, context))); |
236 } | 236 } |
237 | 237 |
238 | 238 |
239 // Allocate a new static implicit closure. | 239 // Allocate a new implicit static closure. |
240 // Arg0: local function. | 240 // Arg0: local function. |
241 // Return value: newly allocated closure. | 241 // Return value: newly allocated closure. |
242 DEFINE_RUNTIME_ENTRY(AllocateStaticImplicitClosure, 1) { | 242 DEFINE_RUNTIME_ENTRY(AllocateImplicitStaticClosure, 1) { |
243 ASSERT(arguments.Count() == | 243 ASSERT(arguments.Count() == |
244 kAllocateStaticImplicitClosureRuntimeEntry.argument_count()); | 244 kAllocateImplicitStaticClosureRuntimeEntry.argument_count()); |
245 ObjectStore* object_store = Isolate::Current()->object_store(); | 245 ObjectStore* object_store = Isolate::Current()->object_store(); |
246 ASSERT(object_store != NULL); | 246 ASSERT(object_store != NULL); |
247 const Function& function = Function::CheckedHandle(arguments.At(0)); | 247 const Function& function = Function::CheckedHandle(arguments.At(0)); |
248 ASSERT(function.is_static()); // Closure functions are always static for now. | 248 ASSERT(function.IsImplicitStaticClosureFunction()); |
249 const Context& context = Context::Handle(object_store->empty_context()); | 249 const Context& context = Context::Handle(object_store->empty_context()); |
250 arguments.SetReturn(Closure::Handle(Closure::New(function, context))); | 250 arguments.SetReturn(Closure::Handle(Closure::New(function, context))); |
251 } | 251 } |
252 | 252 |
253 | 253 |
254 // Allocate a new implicit closure. | 254 // Allocate a new implicit instance closure. |
255 // Arg0: local function. | 255 // Arg0: local function. |
256 // Arg1: receiver object. | 256 // Arg1: receiver object. |
257 // TODO(regis): Arg2: type arguments of the closure. | 257 // TODO(regis): Arg2: type arguments of the closure. |
258 // TODO(regis): Arg3: type arguments of the instantiator. | |
259 // Return value: newly allocated closure. | 258 // Return value: newly allocated closure. |
260 DEFINE_RUNTIME_ENTRY(AllocateImplicitClosure, 2) { | 259 DEFINE_RUNTIME_ENTRY(AllocateImplicitInstanceClosure, 2) { |
261 ASSERT(arguments.Count() == | 260 ASSERT(arguments.Count() == |
262 kAllocateImplicitClosureRuntimeEntry.argument_count()); | 261 kAllocateImplicitInstanceClosureRuntimeEntry.argument_count()); |
263 const Function& function = Function::CheckedHandle(arguments.At(0)); | 262 const Function& function = Function::CheckedHandle(arguments.At(0)); |
264 ASSERT(function.is_static()); // Closure functions are always static for now. | 263 ASSERT(function.IsImplicitInstanceClosureFunction()); |
265 const Instance& receiver = Instance::CheckedHandle(arguments.At(1)); | 264 const Instance& receiver = Instance::CheckedHandle(arguments.At(1)); |
266 Context& context = Context::Handle(); | 265 Context& context = Context::Handle(); |
267 context = Context::New(1); | 266 context = Context::New(1); |
268 context.SetAt(0, receiver); | 267 context.SetAt(0, receiver); |
269 arguments.SetReturn(Closure::Handle(Closure::New(function, context))); | 268 arguments.SetReturn(Closure::Handle(Closure::New(function, context))); |
270 // TODO(regis): Set type arguments. | 269 // TODO(regis): Set type arguments. |
271 } | 270 } |
272 | 271 |
273 | 272 |
274 // Allocate a new context large enough to hold the given number of variables. | 273 // Allocate a new context large enough to hold the given number of variables. |
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
989 } | 988 } |
990 } | 989 } |
991 } | 990 } |
992 // The cache is null terminated, therefore the loop above should never | 991 // The cache is null terminated, therefore the loop above should never |
993 // terminate by itself. | 992 // terminate by itself. |
994 UNREACHABLE(); | 993 UNREACHABLE(); |
995 return Code::null(); | 994 return Code::null(); |
996 } | 995 } |
997 | 996 |
998 } // namespace dart | 997 } // namespace dart |
OLD | NEW |