Index: runtime/vm/dart_entry.cc |
=================================================================== |
--- runtime/vm/dart_entry.cc (revision 18992) |
+++ runtime/vm/dart_entry.cc (working copy) |
@@ -8,6 +8,7 @@ |
#include "vm/compiler.h" |
#include "vm/object_store.h" |
#include "vm/resolver.h" |
+#include "vm/simulator.h" |
#include "vm/stub_code.h" |
#include "vm/symbols.h" |
@@ -17,58 +18,31 @@ |
RawArray* ArgumentsDescriptor::cached_args_descriptors_[kCachedDescriptorCount]; |
-RawObject* DartEntry::InvokeDynamic(const Function& function, |
- const Array& arguments) { |
- const Array& arg_desc = |
+RawObject* DartEntry::InvokeFunction(const Function& function, |
+ const Array& arguments) { |
+ const Array& arguments_descriptor = |
Array::Handle(ArgumentsDescriptor::New(arguments.Length())); |
- return InvokeDynamic(function, arguments, arg_desc); |
+ return InvokeFunction(function, arguments, arguments_descriptor); |
} |
-RawObject* DartEntry::InvokeDynamic(const Function& function, |
- const Array& arguments, |
- const Array& arguments_descriptor) { |
- // Get the entrypoint corresponding to the function specified, this |
- // will result in a compilation of the function if it is not already |
- // compiled. |
- if (!function.HasCode()) { |
- const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
- if (!error.IsNull()) { |
- return error.raw(); |
- } |
- } |
- |
- // Now Call the invoke stub which will invoke the dart function. |
- invokestub entrypoint = reinterpret_cast<invokestub>( |
- StubCode::InvokeDartCodeEntryPoint()); |
+RawObject* DartEntry::InvokeFunction(const Function& function, |
+ const Array& arguments, |
+ const Array& arguments_descriptor) { |
const Context& context = |
Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); |
ASSERT(context.isolate() == Isolate::Current()); |
- const Code& code = Code::Handle(function.CurrentCode()); |
- ASSERT(!code.IsNull()); |
- ASSERT(Isolate::Current()->no_callback_scope_depth() == 0); |
- return entrypoint(code.EntryPoint(), |
- arguments_descriptor, |
- arguments, |
- context); |
+ return InvokeFunction(function, arguments, arguments_descriptor, context); |
} |
-RawObject* DartEntry::InvokeStatic(const Function& function, |
- const Array& arguments) { |
- const Array& arguments_descriptor = |
- Array::Handle(ArgumentsDescriptor::New(arguments.Length())); |
- return InvokeStatic(function, arguments, arguments_descriptor); |
-} |
- |
- |
-RawObject* DartEntry::InvokeStatic(const Function& function, |
- const Array& arguments, |
- const Array& arguments_descriptor) { |
+RawObject* DartEntry::InvokeFunction(const Function& function, |
+ const Array& arguments, |
+ const Array& arguments_descriptor, |
+ const Context& context) { |
// Get the entrypoint corresponding to the function specified, this |
// will result in a compilation of the function if it is not already |
// compiled. |
- ASSERT(!function.IsNull()); |
if (!function.HasCode()) { |
const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
if (!error.IsNull()) { |
@@ -78,31 +52,37 @@ |
// Now Call the invoke stub which will invoke the dart function. |
invokestub entrypoint = reinterpret_cast<invokestub>( |
StubCode::InvokeDartCodeEntryPoint()); |
- const Context& context = |
- Context::ZoneHandle(Isolate::Current()->object_store()->empty_context()); |
- ASSERT(context.isolate() == Isolate::Current()); |
const Code& code = Code::Handle(function.CurrentCode()); |
ASSERT(!code.IsNull()); |
ASSERT(Isolate::Current()->no_callback_scope_depth() == 0); |
- return entrypoint(code.EntryPoint(), |
- arguments_descriptor, |
- arguments, |
- context); |
+#ifdef USING_SIMULATOR |
+ return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call( |
+ reinterpret_cast<int32_t>(entrypoint), |
+ static_cast<int32_t>(code.EntryPoint()), |
+ reinterpret_cast<int32_t>(&arguments_descriptor), |
+ reinterpret_cast<int32_t>(&arguments), |
+ reinterpret_cast<int32_t>(&context), |
+ 0)); |
+#else |
+ return entrypoint(code.EntryPoint(), |
+ arguments_descriptor, |
+ arguments, |
+ context); |
+#endif |
} |
-RawObject* DartEntry::InvokeClosure(const Instance& closure, |
- const Array& arguments) { |
+RawObject* DartEntry::InvokeClosure(const Array& arguments) { |
const Array& arguments_descriptor = |
Array::Handle(ArgumentsDescriptor::New(arguments.Length())); |
- return InvokeClosure(closure, arguments, arguments_descriptor); |
+ return InvokeClosure(arguments, arguments_descriptor); |
} |
-RawObject* DartEntry::InvokeClosure(const Instance& instance, |
- const Array& arguments, |
+RawObject* DartEntry::InvokeClosure(const Array& arguments, |
const Array& arguments_descriptor) { |
- ASSERT(instance.raw() == arguments.At(0)); |
+ Instance& instance = Instance::Handle(); |
+ instance ^= arguments.At(0); |
// Get the entrypoint corresponding to the closure function or to the call |
// method of the instance. This will result in a compilation of the function |
// if it is not already compiled. |
@@ -114,26 +94,9 @@ |
if (function.AreValidArgumentCounts(args_desc.Count(), |
args_desc.NamedCount(), |
NULL)) { |
- if (!function.HasCode()) { |
- const Error& error = Error::Handle(Compiler::CompileFunction(function)); |
- if (!error.IsNull()) { |
- return error.raw(); |
- } |
- } |
- // Now call the invoke stub which will invoke the closure function or |
- // 'call' function. |
// The closure or non-closure object (receiver) is passed as implicit |
// first argument. It is already included in the arguments array. |
- invokestub entrypoint = reinterpret_cast<invokestub>( |
- StubCode::InvokeDartCodeEntryPoint()); |
- ASSERT(context.isolate() == Isolate::Current()); |
- const Code& code = Code::Handle(function.CurrentCode()); |
- ASSERT(!code.IsNull()); |
- ASSERT(Isolate::Current()->no_callback_scope_depth() == 0); |
- return entrypoint(code.EntryPoint(), |
- arguments_descriptor, |
- arguments, |
- context); |
+ return InvokeFunction(function, arguments, arguments_descriptor, context); |
} |
} |
// There is no compatible 'call' method, so invoke noSuchMethod. |
@@ -169,7 +132,7 @@ |
allocation_args.SetAt(1, arguments_descriptor); |
allocation_args.SetAt(2, arguments); |
const Object& invocation_mirror = Object::Handle( |
- InvokeStatic(allocation_function, allocation_args)); |
+ InvokeFunction(allocation_function, allocation_args)); |
// Now use the invocation mirror object and invoke NoSuchMethod. |
const int kNumArguments = 2; |
@@ -183,7 +146,7 @@ |
const Array& args = Array::Handle(Array::New(kNumArguments)); |
args.SetAt(0, receiver); |
args.SetAt(1, invocation_mirror); |
- return InvokeDynamic(function, args); |
+ return InvokeFunction(function, args); |
} |
@@ -350,7 +313,8 @@ |
Function::Handle(cls.LookupConstructorAllowPrivate(function_name)); |
ASSERT(!constructor.IsNull()); |
const Object& retval = |
- Object::Handle(DartEntry::InvokeStatic(constructor, constructor_arguments)); |
+ Object::Handle(DartEntry::InvokeFunction(constructor, |
+ constructor_arguments)); |
ASSERT(retval.IsNull() || retval.IsError()); |
if (retval.IsError()) { |
return retval.raw(); |
@@ -370,8 +334,8 @@ |
ASSERT(!function.IsNull()); |
const Array& args = Array::Handle(Array::New(kNumArguments)); |
args.SetAt(0, receiver); |
- const Object& result = Object::Handle(DartEntry::InvokeDynamic(function, |
- args)); |
+ const Object& result = Object::Handle(DartEntry::InvokeFunction(function, |
+ args)); |
ASSERT(result.IsInstance() || result.IsError()); |
return result.raw(); |
} |
@@ -391,8 +355,8 @@ |
const Array& args = Array::Handle(Array::New(kNumArguments)); |
args.SetAt(0, left); |
args.SetAt(1, right); |
- const Object& result = Object::Handle(DartEntry::InvokeDynamic(function, |
- args)); |
+ const Object& result = Object::Handle(DartEntry::InvokeFunction(function, |
+ args)); |
ASSERT(result.IsInstance() || result.IsError()); |
return result.raw(); |
} |
@@ -422,7 +386,7 @@ |
const Array& args = Array::Handle(Array::New(kNumArguments)); |
args.SetAt(0, Integer::Handle(Integer::New(port_id))); |
const Object& result = |
- Object::Handle(DartEntry::InvokeStatic(function, args)); |
+ Object::Handle(DartEntry::InvokeFunction(function, args)); |
return result.raw(); |
} |
@@ -455,7 +419,7 @@ |
args.SetAt(1, Integer::Handle(isolate, Integer::New(reply_port_id))); |
args.SetAt(2, message); |
const Object& result = |
- Object::Handle(isolate, DartEntry::InvokeStatic(function, args)); |
+ Object::Handle(isolate, DartEntry::InvokeFunction(function, args)); |
ASSERT(result.IsNull() || result.IsError()); |
return result.raw(); |
} |
@@ -478,7 +442,7 @@ |
Resolver::kIsQualified)); |
const Array& args = Array::Handle(Array::New(kNumArguments)); |
args.SetAt(0, Integer::Handle(Integer::New(port_id))); |
- return DartEntry::InvokeStatic(function, args); |
+ return DartEntry::InvokeFunction(function, args); |
} |
@@ -496,8 +460,8 @@ |
args.SetAt(0, map); |
args.SetAt(1, key); |
args.SetAt(2, value); |
- const Object& result = Object::Handle(DartEntry::InvokeDynamic(function, |
- args)); |
+ const Object& result = Object::Handle(DartEntry::InvokeFunction(function, |
+ args)); |
return result.raw(); |
} |
@@ -512,7 +476,7 @@ |
ASSERT(!func.IsNull()); |
const Array& args = Array::Handle(Array::New(1)); |
args.SetAt(0, port); |
- return DartEntry::InvokeDynamic(func, args); |
+ return DartEntry::InvokeFunction(func, args); |
} |