From 36e5743674d1b66be62c96a98c024b2ad85456d2 Mon Sep 17 00:00:00 2001 From: "ricow@chromium.org" Date: Wed, 11 Aug 2010 08:12:53 +0000 Subject: [PATCH] Put direct code pointers into JSFunction objects. This is a first step in allowing more flexible compilation and to simplify builtins lookup. This changes a number of places where code objects are assigned to SharedFunctionInfo objects to also assign this code object to the JSFunction. In addition, the code flushing is changed slightly to accomodate this (we need to flush the code from functions pointing to SharedFunctionInfo objects that has already been flushed). Review URL: http://codereview.chromium.org/3120006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5233 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/accessors.cc | 2 +- src/arm/builtins-arm.cc | 2 +- src/arm/codegen-arm.cc | 8 +++-- src/arm/macro-assembler-arm.cc | 5 ++- src/bootstrapper.cc | 3 ++ src/factory.cc | 10 +++++- src/handles.cc | 26 +++++++++++----- src/heap.cc | 66 +++++++++++++++++++++++++++------------- src/ia32/builtins-ia32.cc | 2 +- src/ia32/codegen-ia32.cc | 9 ++++-- src/ia32/macro-assembler-ia32.cc | 5 ++- src/objects-inl.h | 8 +++-- src/objects.h | 4 ++- src/runtime.cc | 5 +-- src/serialize.h | 2 +- src/x64/builtins-x64.cc | 2 +- src/x64/codegen-x64.cc | 9 ++++-- src/x64/macro-assembler-x64.cc | 5 ++- 18 files changed, 116 insertions(+), 57 deletions(-) diff --git a/src/accessors.cc b/src/accessors.cc index ed0bbd7..3c49846 100644 --- a/src/accessors.cc +++ b/src/accessors.cc @@ -488,7 +488,7 @@ Object* Accessors::FunctionGetLength(Object* object, void*) { JSFunction* function = FindInPrototypeChain(object, &found_it); if (!found_it) return Smi::FromInt(0); // Check if already compiled. - if (!function->is_compiled()) { + if (!function->shared()->is_compiled()) { // If the function isn't compiled yet, the length is not computed // correctly yet. Compile it now and return the right length. HandleScope scope; diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc index b1f29ba..37768e8 100644 --- a/src/arm/builtins-arm.cc +++ b/src/arm/builtins-arm.cc @@ -1050,7 +1050,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { __ ldr(r2, FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset)); __ mov(r2, Operand(r2, ASR, kSmiTagSize)); - __ ldr(r3, FieldMemOperand(r3, SharedFunctionInfo::kCodeOffset)); + __ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeOffset)); __ add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); __ cmp(r2, r0); // Check formal and actual parameter counts. __ Jump(Handle(builtin(ArgumentsAdaptorTrampoline)), diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index b537424..c505004 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -1532,9 +1532,8 @@ void CodeGenerator::CallApplyLazy(Expression* applicand, __ BranchOnSmi(r0, &build_args); __ CompareObjectType(r0, r1, r2, JS_FUNCTION_TYPE); __ b(ne, &build_args); - __ ldr(r0, FieldMemOperand(r0, JSFunction::kSharedFunctionInfoOffset)); Handle apply_code(Builtins::builtin(Builtins::FunctionApply)); - __ ldr(r1, FieldMemOperand(r0, SharedFunctionInfo::kCodeOffset)); + __ ldr(r1, FieldMemOperand(r0, JSFunction::kCodeOffset)); __ cmp(r1, Operand(apply_code)); __ b(ne, &build_args); @@ -6858,6 +6857,11 @@ void FastNewClosureStub::Generate(MacroAssembler* masm) { __ str(cp, FieldMemOperand(r0, JSFunction::kContextOffset)); __ str(r1, FieldMemOperand(r0, JSFunction::kLiteralsOffset)); + // Initialize the code pointer in the function to be the one + // found in the shared function info object. + __ ldr(r3, FieldMemOperand(r3, SharedFunctionInfo::kCodeOffset)); + __ str(r3, FieldMemOperand(r0, JSFunction::kCodeOffset)); + // Return result. The argument function info has been popped already. __ Ret(); diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 9c25ccd..7a03641 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -757,7 +757,7 @@ void MacroAssembler::InvokeFunction(Register fun, SharedFunctionInfo::kFormalParameterCountOffset)); mov(expected_reg, Operand(expected_reg, ASR, kSmiTagSize)); ldr(code_reg, - MemOperand(code_reg, SharedFunctionInfo::kCodeOffset - kHeapObjectTag)); + MemOperand(r1, JSFunction::kCodeOffset - kHeapObjectTag)); add(code_reg, code_reg, Operand(Code::kHeaderSize - kHeapObjectTag)); ParameterCount expected(expected_reg); @@ -1508,8 +1508,7 @@ void MacroAssembler::GetBuiltinEntry(Register target, Builtins::JavaScript id) { // Make sure the code objects in the builtins object and in the // builtin function are the same. push(r1); - ldr(r1, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); - ldr(r1, FieldMemOperand(r1, SharedFunctionInfo::kCodeOffset)); + ldr(r1, FieldMemOperand(r1, JSFunction::kCodeOffset)); cmp(r1, target); Assert(eq, "Builtin code object changed"); pop(r1); diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index e1d4489..ed61a14 100644 --- a/src/bootstrapper.cc +++ b/src/bootstrapper.cc @@ -470,6 +470,7 @@ Handle Genesis::CreateEmptyFunction() { Handle code = Handle(Builtins::builtin(Builtins::EmptyFunction)); empty_function->set_code(*code); + empty_function->shared()->set_code(*code); Handle source = Factory::NewStringFromAscii(CStrVector("() {}")); Handle