Index: src/runtime.cc |
=================================================================== |
--- src/runtime.cc (revision 2752) |
+++ src/runtime.cc (working copy) |
@@ -45,6 +45,7 @@ |
#include "v8threads.h" |
#include "smart-pointer.h" |
#include "parser.h" |
+#include "stub-cache.h" |
namespace v8 { |
namespace internal { |
@@ -1235,6 +1236,9 @@ |
// Array, and Object, and some web code |
// doesn't like seeing source code for constructors. |
target->shared()->set_script(Heap::undefined_value()); |
+ // Clear the optimization hints related to the compiled code as these are no |
+ // longer valid when the code is overwritten. |
+ target->shared()->ClearThisPropertyAssignmentsInfo(); |
context = Handle<Context>(fun->context()); |
// Make sure we get a fresh copy of the literal vector to avoid |
@@ -4326,11 +4330,21 @@ |
} |
-static Handle<Code> ComputeConstructStub(Handle<Map> map) { |
+static Code* ComputeConstructStub(Handle<SharedFunctionInfo> shared) { |
// TODO(385): Change this to create a construct stub specialized for |
// the given map to make allocation of simple objects - and maybe |
// arrays - much faster. |
- return Handle<Code>(Builtins::builtin(Builtins::JSConstructStubGeneric)); |
+ if (FLAG_inline_new |
+ && shared->has_only_simple_this_property_assignments()) { |
+ ConstructStubCompiler compiler; |
+ Object* code = compiler.CompileConstructStub(*shared); |
+ if (code->IsFailure()) { |
+ return Builtins::builtin(Builtins::JSConstructStubGeneric); |
+ } |
+ return Code::cast(code); |
+ } |
+ |
+ return Builtins::builtin(Builtins::JSConstructStubGeneric); |
} |
@@ -4373,15 +4387,25 @@ |
} |
} |
+ // The function should be compiled for the optimization hints to be available. |
+ if (!function->shared()->is_compiled()) { |
+ CompileLazyShared(Handle<SharedFunctionInfo>(function->shared()), |
+ CLEAR_EXCEPTION, |
+ 0); |
+ } |
+ |
bool first_allocation = !function->has_initial_map(); |
Handle<JSObject> result = Factory::NewJSObject(function); |
if (first_allocation) { |
Handle<Map> map = Handle<Map>(function->initial_map()); |
- Handle<Code> stub = ComputeConstructStub(map); |
+ Handle<Code> stub = Handle<Code>( |
+ ComputeConstructStub(Handle<SharedFunctionInfo>(function->shared()))); |
function->shared()->set_construct_stub(*stub); |
} |
+ |
Counters::constructed_objects.Increment(); |
Counters::constructed_objects_runtime.Increment(); |
+ |
return *result; |
} |
@@ -7386,7 +7410,7 @@ |
} |
-static Object* Runtime_FunctionGetAssemblerCode(Arguments args) { |
+static Object* Runtime_DebugDisassembleFunction(Arguments args) { |
#ifdef DEBUG |
HandleScope scope; |
ASSERT(args.length() == 1); |
@@ -7401,6 +7425,21 @@ |
} |
+static Object* Runtime_DebugDisassembleConstructor(Arguments args) { |
+#ifdef DEBUG |
+ HandleScope scope; |
+ ASSERT(args.length() == 1); |
+ // Get the function and make sure it is compiled. |
+ CONVERT_ARG_CHECKED(JSFunction, func, 0); |
+ if (!func->is_compiled() && !CompileLazy(func, KEEP_EXCEPTION)) { |
+ return Failure::Exception(); |
+ } |
+ func->shared()->construct_stub()->PrintLn(); |
+#endif // DEBUG |
+ return Heap::undefined_value(); |
+} |
+ |
+ |
static Object* Runtime_FunctionGetInferredName(Arguments args) { |
NoHandleAllocation ha; |
ASSERT(args.length() == 1); |