| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/assembler_macros.h" | 7 #include "vm/assembler_macros.h" |
| 8 #include "vm/ast.h" | 8 #include "vm/ast.h" |
| 9 #include "vm/code_patcher.h" | 9 #include "vm/code_patcher.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 ASSERT(arguments.Count() == kAllocateClosureRuntimeEntry.argument_count()); | 272 ASSERT(arguments.Count() == kAllocateClosureRuntimeEntry.argument_count()); |
| 273 const Function& function = Function::CheckedHandle(arguments.At(0)); | 273 const Function& function = Function::CheckedHandle(arguments.At(0)); |
| 274 ASSERT(function.IsClosureFunction() && !function.IsImplicitClosureFunction()); | 274 ASSERT(function.IsClosureFunction() && !function.IsImplicitClosureFunction()); |
| 275 const AbstractTypeArguments& type_arguments = | 275 const AbstractTypeArguments& type_arguments = |
| 276 AbstractTypeArguments::CheckedHandle(arguments.At(1)); | 276 AbstractTypeArguments::CheckedHandle(arguments.At(1)); |
| 277 ASSERT(type_arguments.IsNull() || type_arguments.IsInstantiated()); | 277 ASSERT(type_arguments.IsNull() || type_arguments.IsInstantiated()); |
| 278 // The current context was saved in the Isolate structure when entering the | 278 // The current context was saved in the Isolate structure when entering the |
| 279 // runtime. | 279 // runtime. |
| 280 const Context& context = Context::Handle(isolate->top_context()); | 280 const Context& context = Context::Handle(isolate->top_context()); |
| 281 ASSERT(!context.IsNull()); | 281 ASSERT(!context.IsNull()); |
| 282 const Closure& closure = Closure::Handle(Closure::New(function, context)); | 282 const Instance& closure = Instance::Handle(Closure::New(function, context)); |
| 283 closure.SetTypeArguments(type_arguments); | 283 Closure::SetTypeArguments(closure, type_arguments); |
| 284 arguments.SetReturn(closure); | 284 arguments.SetReturn(closure); |
| 285 } | 285 } |
| 286 | 286 |
| 287 | 287 |
| 288 // Allocate a new implicit static closure. | 288 // Allocate a new implicit static closure. |
| 289 // Arg0: local function. | 289 // Arg0: local function. |
| 290 // Return value: newly allocated closure. | 290 // Return value: newly allocated closure. |
| 291 DEFINE_RUNTIME_ENTRY(AllocateImplicitStaticClosure, 1) { | 291 DEFINE_RUNTIME_ENTRY(AllocateImplicitStaticClosure, 1) { |
| 292 ASSERT(arguments.Count() == | 292 ASSERT(arguments.Count() == |
| 293 kAllocateImplicitStaticClosureRuntimeEntry.argument_count()); | 293 kAllocateImplicitStaticClosureRuntimeEntry.argument_count()); |
| 294 ObjectStore* object_store = isolate->object_store(); | 294 ObjectStore* object_store = isolate->object_store(); |
| 295 ASSERT(object_store != NULL); | 295 ASSERT(object_store != NULL); |
| 296 const Function& function = Function::CheckedHandle(arguments.At(0)); | 296 const Function& function = Function::CheckedHandle(arguments.At(0)); |
| 297 ASSERT(!function.IsNull()); | 297 ASSERT(!function.IsNull()); |
| 298 ASSERT(function.IsImplicitStaticClosureFunction()); | 298 ASSERT(function.IsImplicitStaticClosureFunction()); |
| 299 const Context& context = Context::Handle(object_store->empty_context()); | 299 const Context& context = Context::Handle(object_store->empty_context()); |
| 300 arguments.SetReturn(Closure::Handle(Closure::New(function, context))); | 300 arguments.SetReturn(Instance::Handle(Closure::New(function, context))); |
| 301 } | 301 } |
| 302 | 302 |
| 303 | 303 |
| 304 // Allocate a new implicit instance closure. | 304 // Allocate a new implicit instance closure. |
| 305 // Arg0: local function. | 305 // Arg0: local function. |
| 306 // Arg1: receiver object. | 306 // Arg1: receiver object. |
| 307 // Arg2: type arguments of the closure. | 307 // Arg2: type arguments of the closure. |
| 308 // Return value: newly allocated closure. | 308 // Return value: newly allocated closure. |
| 309 DEFINE_RUNTIME_ENTRY(AllocateImplicitInstanceClosure, 3) { | 309 DEFINE_RUNTIME_ENTRY(AllocateImplicitInstanceClosure, 3) { |
| 310 ASSERT(arguments.Count() == | 310 ASSERT(arguments.Count() == |
| 311 kAllocateImplicitInstanceClosureRuntimeEntry.argument_count()); | 311 kAllocateImplicitInstanceClosureRuntimeEntry.argument_count()); |
| 312 const Function& function = Function::CheckedHandle(arguments.At(0)); | 312 const Function& function = Function::CheckedHandle(arguments.At(0)); |
| 313 ASSERT(function.IsImplicitInstanceClosureFunction()); | 313 ASSERT(function.IsImplicitInstanceClosureFunction()); |
| 314 const Instance& receiver = Instance::CheckedHandle(arguments.At(1)); | 314 const Instance& receiver = Instance::CheckedHandle(arguments.At(1)); |
| 315 const AbstractTypeArguments& type_arguments = | 315 const AbstractTypeArguments& type_arguments = |
| 316 AbstractTypeArguments::CheckedHandle(arguments.At(2)); | 316 AbstractTypeArguments::CheckedHandle(arguments.At(2)); |
| 317 ASSERT(type_arguments.IsNull() || type_arguments.IsInstantiated()); | 317 ASSERT(type_arguments.IsNull() || type_arguments.IsInstantiated()); |
| 318 Context& context = Context::Handle(); | 318 Context& context = Context::Handle(); |
| 319 context = Context::New(1); | 319 context = Context::New(1); |
| 320 context.SetAt(0, receiver); | 320 context.SetAt(0, receiver); |
| 321 const Closure& closure = Closure::Handle(Closure::New(function, context)); | 321 const Instance& closure = Instance::Handle(Closure::New(function, context)); |
| 322 closure.SetTypeArguments(type_arguments); | 322 Closure::SetTypeArguments(closure, type_arguments); |
| 323 arguments.SetReturn(closure); | 323 arguments.SetReturn(closure); |
| 324 } | 324 } |
| 325 | 325 |
| 326 | 326 |
| 327 // Allocate a new context large enough to hold the given number of variables. | 327 // Allocate a new context large enough to hold the given number of variables. |
| 328 // Arg0: number of variables. | 328 // Arg0: number of variables. |
| 329 // Return value: newly allocated context. | 329 // Return value: newly allocated context. |
| 330 DEFINE_RUNTIME_ENTRY(AllocateContext, 1) { | 330 DEFINE_RUNTIME_ENTRY(AllocateContext, 1) { |
| 331 ASSERT(arguments.Count() == kAllocateContextRuntimeEntry.argument_count()); | 331 ASSERT(arguments.Count() == kAllocateContextRuntimeEntry.argument_count()); |
| 332 const Smi& num_variables = Smi::CheckedHandle(arguments.At(0)); | 332 const Smi& num_variables = Smi::CheckedHandle(arguments.At(0)); |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 // Arg1: ic-data. | 1050 // Arg1: ic-data. |
| 1051 // Returns: Closure object or NULL (instance function not found). | 1051 // Returns: Closure object or NULL (instance function not found). |
| 1052 // This is called by the megamorphic stub when it is unable to resolve an | 1052 // This is called by the megamorphic stub when it is unable to resolve an |
| 1053 // instance method. This is done just before the call to noSuchMethod. | 1053 // instance method. This is done just before the call to noSuchMethod. |
| 1054 DEFINE_RUNTIME_ENTRY(ResolveImplicitClosureFunction, 2) { | 1054 DEFINE_RUNTIME_ENTRY(ResolveImplicitClosureFunction, 2) { |
| 1055 ASSERT(arguments.Count() == | 1055 ASSERT(arguments.Count() == |
| 1056 kResolveImplicitClosureFunctionRuntimeEntry.argument_count()); | 1056 kResolveImplicitClosureFunctionRuntimeEntry.argument_count()); |
| 1057 const Instance& receiver = Instance::CheckedHandle(arguments.At(0)); | 1057 const Instance& receiver = Instance::CheckedHandle(arguments.At(0)); |
| 1058 const ICData& ic_data = ICData::CheckedHandle(arguments.At(1)); | 1058 const ICData& ic_data = ICData::CheckedHandle(arguments.At(1)); |
| 1059 const String& original_function_name = String::Handle(ic_data.target_name()); | 1059 const String& original_function_name = String::Handle(ic_data.target_name()); |
| 1060 Closure& closure = Closure::Handle(); | 1060 Instance& closure = Instance::Handle(); |
| 1061 if (!Field::IsGetterName(original_function_name)) { | 1061 if (!Field::IsGetterName(original_function_name)) { |
| 1062 // This is not a getter so can't be the case where we are trying to | 1062 // This is not a getter so can't be the case where we are trying to |
| 1063 // create an implicit closure of an instance function. | 1063 // create an implicit closure of an instance function. |
| 1064 arguments.SetReturn(closure); | 1064 arguments.SetReturn(closure); |
| 1065 return; | 1065 return; |
| 1066 } | 1066 } |
| 1067 const Class& receiver_class = Class::Handle(receiver.clazz()); | 1067 const Class& receiver_class = Class::Handle(receiver.clazz()); |
| 1068 ASSERT(!receiver_class.IsNull()); | 1068 ASSERT(!receiver_class.IsNull()); |
| 1069 String& func_name = String::Handle(); | 1069 String& func_name = String::Handle(); |
| 1070 func_name = Field::NameFromGetter(original_function_name); | 1070 func_name = Field::NameFromGetter(original_function_name); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 } | 1148 } |
| 1149 | 1149 |
| 1150 | 1150 |
| 1151 // Invoke Implicit Closure function. | 1151 // Invoke Implicit Closure function. |
| 1152 // Arg0: closure object. | 1152 // Arg0: closure object. |
| 1153 // Arg1: arguments descriptor (originally passed as dart instance invocation). | 1153 // Arg1: arguments descriptor (originally passed as dart instance invocation). |
| 1154 // Arg2: arguments array (originally passed to dart instance invocation). | 1154 // Arg2: arguments array (originally passed to dart instance invocation). |
| 1155 DEFINE_RUNTIME_ENTRY(InvokeImplicitClosureFunction, 3) { | 1155 DEFINE_RUNTIME_ENTRY(InvokeImplicitClosureFunction, 3) { |
| 1156 ASSERT(arguments.Count() == | 1156 ASSERT(arguments.Count() == |
| 1157 kInvokeImplicitClosureFunctionRuntimeEntry.argument_count()); | 1157 kInvokeImplicitClosureFunctionRuntimeEntry.argument_count()); |
| 1158 const Closure& closure = Closure::CheckedHandle(arguments.At(0)); | 1158 const Instance& closure = Instance::CheckedHandle(arguments.At(0)); |
| 1159 const Array& arg_descriptor = Array::CheckedHandle(arguments.At(1)); | 1159 const Array& arg_descriptor = Array::CheckedHandle(arguments.At(1)); |
| 1160 const Array& func_arguments = Array::CheckedHandle(arguments.At(2)); | 1160 const Array& func_arguments = Array::CheckedHandle(arguments.At(2)); |
| 1161 const Function& function = Function::Handle(closure.function()); | 1161 const Function& function = Function::Handle(Closure::function(closure)); |
| 1162 ASSERT(!function.IsNull()); | 1162 ASSERT(!function.IsNull()); |
| 1163 if (!function.HasCode()) { | 1163 if (!function.HasCode()) { |
| 1164 const Error& error = Error::Handle(Compiler::CompileFunction(function)); | 1164 const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
| 1165 if (!error.IsNull()) { | 1165 if (!error.IsNull()) { |
| 1166 Exceptions::PropagateError(error); | 1166 Exceptions::PropagateError(error); |
| 1167 } | 1167 } |
| 1168 } | 1168 } |
| 1169 const Context& context = Context::Handle(closure.context()); | 1169 const Context& context = Context::Handle(Closure::context(closure)); |
| 1170 const Code& code = Code::Handle(function.CurrentCode()); | 1170 const Code& code = Code::Handle(function.CurrentCode()); |
| 1171 ASSERT(!code.IsNull()); | 1171 ASSERT(!code.IsNull()); |
| 1172 const Instructions& instrs = Instructions::Handle(code.instructions()); | 1172 const Instructions& instrs = Instructions::Handle(code.instructions()); |
| 1173 ASSERT(!instrs.IsNull()); | 1173 ASSERT(!instrs.IsNull()); |
| 1174 | 1174 |
| 1175 // Adjust arguments descriptor array to account for removal of the receiver | 1175 // Adjust arguments descriptor array to account for removal of the receiver |
| 1176 // parameter. Since the arguments descriptor array is canonicalized, create a | 1176 // parameter. Since the arguments descriptor array is canonicalized, create a |
| 1177 // new one instead of patching the original one. | 1177 // new one instead of patching the original one. |
| 1178 const intptr_t len = arg_descriptor.Length(); | 1178 const intptr_t len = arg_descriptor.Length(); |
| 1179 const intptr_t num_named_args = (len - 3) / 2; | 1179 const intptr_t num_named_args = (len - 3) / 2; |
| (...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1752 intptr_t line, column; | 1752 intptr_t line, column; |
| 1753 script.GetTokenLocation(token_pos, &line, &column); | 1753 script.GetTokenLocation(token_pos, &line, &column); |
| 1754 String& line_string = String::Handle(script.GetLine(line)); | 1754 String& line_string = String::Handle(script.GetLine(line)); |
| 1755 OS::Print(" Function: %s\n", top_function.ToFullyQualifiedCString()); | 1755 OS::Print(" Function: %s\n", top_function.ToFullyQualifiedCString()); |
| 1756 OS::Print(" Line %"Pd": '%s'\n", line, line_string.ToCString()); | 1756 OS::Print(" Line %"Pd": '%s'\n", line, line_string.ToCString()); |
| 1757 } | 1757 } |
| 1758 } | 1758 } |
| 1759 | 1759 |
| 1760 | 1760 |
| 1761 } // namespace dart | 1761 } // namespace dart |
| OLD | NEW |