Author: [email protected]
Date: Wed Feb 25 08:52:15 2009
New Revision: 1368
Modified:
branches/bleeding_edge/src/accessors.cc
branches/bleeding_edge/src/builtins.cc
branches/bleeding_edge/src/code-stubs.cc
branches/bleeding_edge/src/codegen.cc
branches/bleeding_edge/src/debug.cc
branches/bleeding_edge/src/factory.cc
branches/bleeding_edge/src/factory.h
branches/bleeding_edge/src/frames-arm.cc
branches/bleeding_edge/src/frames-ia32.cc
branches/bleeding_edge/src/frames.cc
branches/bleeding_edge/src/frames.h
branches/bleeding_edge/src/heap.cc
branches/bleeding_edge/src/heap.h
branches/bleeding_edge/src/macro-assembler-arm.cc
branches/bleeding_edge/src/macro-assembler-arm.h
branches/bleeding_edge/src/macro-assembler-ia32.cc
branches/bleeding_edge/src/macro-assembler-ia32.h
branches/bleeding_edge/src/mark-compact.cc
branches/bleeding_edge/src/mark-compact.h
branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc
branches/bleeding_edge/src/regexp-macro-assembler-ia32.h
branches/bleeding_edge/src/runtime.cc
branches/bleeding_edge/src/spaces.cc
branches/bleeding_edge/src/stub-cache.cc
branches/bleeding_edge/src/stub-cache.h
branches/bleeding_edge/src/top.cc
branches/bleeding_edge/src/top.h
branches/bleeding_edge/src/v8threads.cc
branches/bleeding_edge/src/v8threads.h
branches/bleeding_edge/test/cctest/test-assembler-arm.cc
branches/bleeding_edge/test/cctest/test-assembler-ia32.cc
branches/bleeding_edge/test/cctest/test-disasm-ia32.cc
branches/bleeding_edge/test/cctest/test-heap.cc
Log:
- Pass the knowledge whether the old GC is compacting to the GC prologue
and epilogue. This allows us to skip frame cooking and uncooking when doing
a mark-sweep GC.
- Add the ability for the code to refer to its code object by adding a
handle to the code object in the MacroAssembler.
Review URL: http://codereview.chromium.org/27133
Modified: branches/bleeding_edge/src/accessors.cc
==============================================================================
--- branches/bleeding_edge/src/accessors.cc (original)
+++ branches/bleeding_edge/src/accessors.cc Wed Feb 25 08:52:15 2009
@@ -387,8 +387,8 @@
if (frame->function() != *function) continue;
// If there is an arguments variable in the stack, we return that.
- int index = ScopeInfo<>::StackSlotIndex(frame->FindCode(),
- Heap::arguments_symbol());
+ int index = ScopeInfo<>::StackSlotIndex(frame->code(),
+ Heap::arguments_symbol());
if (index >= 0) return frame->GetExpression(index);
// If there isn't an arguments variable in the stack, we need to
Modified: branches/bleeding_edge/src/builtins.cc
==============================================================================
--- branches/bleeding_edge/src/builtins.cc (original)
+++ branches/bleeding_edge/src/builtins.cc Wed Feb 25 08:52:15 2009
@@ -688,7 +688,7 @@
// During startup it's OK to always allocate and defer GC to later.
// This simplifies things because we don't need to retry.
AlwaysAllocateScope __scope__;
- code = Heap::CreateCode(desc, NULL, flags, NULL);
+ code = Heap::CreateCode(desc, NULL, flags, masm.CodeObject());
if (code->IsFailure()) {
v8::internal::V8::FatalProcessOutOfMemory("CreateCode");
}
Modified: branches/bleeding_edge/src/code-stubs.cc
==============================================================================
--- branches/bleeding_edge/src/code-stubs.cc (original)
+++ branches/bleeding_edge/src/code-stubs.cc Wed Feb 25 08:52:15 2009
@@ -59,7 +59,7 @@
// Copy the generated code into a heap object, and store the major key.
Code::Flags flags = Code::ComputeFlags(Code::STUB);
- Handle<Code> code = Factory::NewCode(desc, NULL, flags);
+ Handle<Code> code = Factory::NewCode(desc, NULL, flags,
masm.CodeObject());
code->set_major_key(MajorKey());
// Add unresolved entries in the code to the fixup list.
Modified: branches/bleeding_edge/src/codegen.cc
==============================================================================
--- branches/bleeding_edge/src/codegen.cc (original)
+++ branches/bleeding_edge/src/codegen.cc Wed Feb 25 08:52:15 2009
@@ -130,7 +130,10 @@
cgen.masm()->GetCode(&desc);
ScopeInfo<> sinfo(flit->scope());
Code::Flags flags = Code::ComputeFlags(Code::FUNCTION);
- Handle<Code> code = Factory::NewCode(desc, &sinfo, flags);
+ Handle<Code> code = Factory::NewCode(desc,
+ &sinfo,
+ flags,
+ cgen.masm()->CodeObject());
// Add unresolved entries in the code to the fixup list.
Bootstrapper::AddFixup(*code, cgen.masm());
Modified: branches/bleeding_edge/src/debug.cc
==============================================================================
--- branches/bleeding_edge/src/debug.cc (original)
+++ branches/bleeding_edge/src/debug.cc Wed Feb 25 08:52:15 2009
@@ -1266,7 +1266,7 @@
Handle<Code> original_code(debug_info->original_code());
#ifdef DEBUG
// Get the code which is actually executing.
- Handle<Code> frame_code(frame->FindCode());
+ Handle<Code> frame_code(frame->code());
ASSERT(frame_code.is_identical_to(code));
#endif
Modified: branches/bleeding_edge/src/factory.cc
==============================================================================
--- branches/bleeding_edge/src/factory.cc (original)
+++ branches/bleeding_edge/src/factory.cc Wed Feb 25 08:52:15 2009
@@ -487,13 +487,7 @@
Handle<Code> Factory::NewCode(const CodeDesc& desc, ScopeInfo<>* sinfo,
Code::Flags flags, Handle<Object> self_ref) {
- CALL_HEAP_FUNCTION(Heap::CreateCode(
- desc, sinfo, flags, reinterpret_cast<Code**>(self_ref.location())),
Code);
-}
-
-Handle<Code> Factory::NewCode(const CodeDesc& desc, ScopeInfo<>* sinfo,
- Code::Flags flags) {
- CALL_HEAP_FUNCTION(Heap::CreateCode(desc, sinfo, flags, NULL), Code);
+ CALL_HEAP_FUNCTION(Heap::CreateCode(desc, sinfo, flags, self_ref), Code);
}
Modified: branches/bleeding_edge/src/factory.h
==============================================================================
--- branches/bleeding_edge/src/factory.h (original)
+++ branches/bleeding_edge/src/factory.h Wed Feb 25 08:52:15 2009
@@ -206,9 +206,6 @@
static Handle<Code> NewCode(const CodeDesc& desc, ScopeInfo<>* sinfo,
Code::Flags flags, Handle<Object>
self_reference);
- static Handle<Code> NewCode(const CodeDesc& desc, ScopeInfo<>* sinfo,
- Code::Flags flags);
-
static Handle<Code> CopyCode(Handle<Code> code);
static Handle<Object> ToObject(Handle<Object> object,
Modified: branches/bleeding_edge/src/frames-arm.cc
==============================================================================
--- branches/bleeding_edge/src/frames-arm.cc (original)
+++ branches/bleeding_edge/src/frames-arm.cc Wed Feb 25 08:52:15 2009
@@ -114,10 +114,4 @@
}
-Code* JavaScriptFrame::FindCode() const {
- JSFunction* function = JSFunction::cast(this->function());
- return function->shared()->code();
-}
-
-
} } // namespace v8::internal
Modified: branches/bleeding_edge/src/frames-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/frames-ia32.cc (original)
+++ branches/bleeding_edge/src/frames-ia32.cc Wed Feb 25 08:52:15 2009
@@ -112,10 +112,4 @@
}
-Code* JavaScriptFrame::FindCode() const {
- JSFunction* function = JSFunction::cast(this->function());
- return function->shared()->code();
-}
-
-
} } // namespace v8::internal
Modified: branches/bleeding_edge/src/frames.cc
==============================================================================
--- branches/bleeding_edge/src/frames.cc (original)
+++ branches/bleeding_edge/src/frames.cc Wed Feb 25 08:52:15 2009
@@ -28,6 +28,7 @@
#include "v8.h"
#include "frames-inl.h"
+#include "mark-compact.h"
#include "scopeinfo.h"
#include "string-stream.h"
#include "top.h"
@@ -162,12 +163,14 @@
void StackHandler::Cook(Code* code) {
+ ASSERT(MarkCompactCollector::IsCompacting());
ASSERT(code->contains(pc()));
set_pc(AddressFrom<Address>(pc() - code->instruction_start()));
}
void StackHandler::Uncook(Code* code) {
+ ASSERT(MarkCompactCollector::IsCompacting());
set_pc(code->instruction_start() + OffsetFrom(pc()));
ASSERT(code->contains(pc()));
}
@@ -183,6 +186,9 @@
void StackFrame::CookFramesForThread(ThreadLocalTop* thread) {
+ // Only cooking frames when the collector is compacting and thus moving
code
+ // around.
+ ASSERT(MarkCompactCollector::IsCompacting());
ASSERT(!thread->stack_is_cooked());
for (StackFrameIterator it(thread); !it.done(); it.Advance()) {
it.frame()->Cook();
@@ -192,6 +198,9 @@
void StackFrame::UncookFramesForThread(ThreadLocalTop* thread) {
+ // Only uncooking frames when the collector is compacting and thus
moving code
+ // around.
+ ASSERT(MarkCompactCollector::IsCompacting());
ASSERT(thread->stack_is_cooked());
for (StackFrameIterator it(thread); !it.done(); it.Advance()) {
it.frame()->Uncook();
@@ -201,7 +210,7 @@
void StackFrame::Cook() {
- Code* code = FindCode();
+ Code* code = this->code();
for (StackHandlerIterator it(this, top_handler()); !it.done();
it.Advance()) {
it.handler()->Cook(code);
}
@@ -211,7 +220,7 @@
void StackFrame::Uncook() {
- Code* code = FindCode();
+ Code* code = this->code();
for (StackHandlerIterator it(this, top_handler()); !it.done();
it.Advance()) {
it.handler()->Uncook(code);
}
@@ -220,7 +229,7 @@
}
-Code* EntryFrame::FindCode() const {
+Code* EntryFrame::code() const {
return Heap::js_entry_code();
}
@@ -232,12 +241,12 @@
}
-Code* EntryConstructFrame::FindCode() const {
+Code* EntryConstructFrame::code() const {
return Heap::js_construct_entry_code();
}
-Code* ExitFrame::FindCode() const {
+Code* ExitFrame::code() const {
return Heap::c_entry_code();
}
@@ -257,7 +266,7 @@
}
-Code* ExitDebugFrame::FindCode() const {
+Code* ExitDebugFrame::code() const {
return Heap::c_entry_debug_break_code();
}
@@ -320,20 +329,20 @@
}
-Code* ArgumentsAdaptorFrame::FindCode() const {
+Code* JavaScriptFrame::code() const {
+ JSFunction* function = JSFunction::cast(this->function());
+ return function->shared()->code();
+}
+
+
+Code* ArgumentsAdaptorFrame::code() const {
return Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline);
}
-Code* InternalFrame::FindCode() const {
+Code* InternalFrame::code() const {
const int offset = InternalFrameConstants::kCodeOffset;
Object* code = Memory::Object_at(fp() + offset);
- if (code == NULL) {
- // The code object isn't set; find it and set it.
- code = Heap::FindCodeObject(pc());
- ASSERT(!code->IsFailure());
- Memory::Object_at(fp() + offset) = code;
- }
ASSERT(code != NULL);
return Code::cast(code);
}
Modified: branches/bleeding_edge/src/frames.h
==============================================================================
--- branches/bleeding_edge/src/frames.h (original)
+++ branches/bleeding_edge/src/frames.h Wed Feb 25 08:52:15 2009
@@ -148,7 +148,7 @@
virtual Type type() const = 0;
// Get the code associated with this frame.
- virtual Code* FindCode() const = 0;
+ virtual Code* code() const = 0;
// Garbage collection support.
static void CookFramesForThread(ThreadLocalTop* thread);
@@ -209,7 +209,7 @@
public:
virtual Type type() const { return ENTRY; }
- virtual Code* FindCode() const;
+ virtual Code* code() const;
// Garbage collection support.
virtual void Iterate(ObjectVisitor* v) const;
@@ -238,7 +238,7 @@
public:
virtual Type type() const { return ENTRY_CONSTRUCT; }
- virtual Code* FindCode() const;
+ virtual Code* code() const;
static EntryConstructFrame* cast(StackFrame* frame) {
ASSERT(frame->is_entry_construct());
@@ -259,7 +259,7 @@
public:
virtual Type type() const { return EXIT; }
- virtual Code* FindCode() const;
+ virtual Code* code() const;
// Garbage collection support.
virtual void Iterate(ObjectVisitor* v) const;
@@ -290,7 +290,7 @@
public:
virtual Type type() const { return EXIT_DEBUG; }
- virtual Code* FindCode() const;
+ virtual Code* code() const;
static ExitDebugFrame* cast(StackFrame* frame) {
ASSERT(frame->is_exit_debug());
@@ -399,7 +399,7 @@
int index) const;
// Determine the code for the frame.
- virtual Code* FindCode() const;
+ virtual Code* code() const;
static JavaScriptFrame* cast(StackFrame* frame) {
ASSERT(frame->is_java_script());
@@ -433,7 +433,7 @@
virtual Type type() const { return ARGUMENTS_ADAPTOR; }
// Determine the code for the frame.
- virtual Code* FindCode() const;
+ virtual Code* code() const;
static ArgumentsAdaptorFrame* cast(StackFrame* frame) {
ASSERT(frame->is_arguments_adaptor());
@@ -463,7 +463,7 @@
virtual void Iterate(ObjectVisitor* v) const;
// Determine the code for the frame.
- virtual Code* FindCode() const;
+ virtual Code* code() const;
static InternalFrame* cast(StackFrame* frame) {
ASSERT(frame->is_internal());
Modified: branches/bleeding_edge/src/heap.cc
==============================================================================
--- branches/bleeding_edge/src/heap.cc (original)
+++ branches/bleeding_edge/src/heap.cc Wed Feb 25 08:52:15 2009
@@ -419,11 +419,15 @@
tracer->set_full_gc_count(mc_count_);
LOG(ResourceEvent("markcompact", "begin"));
- MarkCompactPrologue();
+ MarkCompactCollector::Prepare(tracer);
- MarkCompactCollector::CollectGarbage(tracer);
+ bool is_compacting = MarkCompactCollector::IsCompacting();
- MarkCompactEpilogue();
+ MarkCompactPrologue(is_compacting);
+
+ MarkCompactCollector::CollectGarbage();
+
+ MarkCompactEpilogue(is_compacting);
LOG(ResourceEvent("markcompact", "end"));
@@ -435,18 +439,22 @@
}
-void Heap::MarkCompactPrologue() {
+void Heap::MarkCompactPrologue(bool is_compacting) {
+ // At any old GC clear the keyed lookup cache to enable collection of
unused
+ // maps.
ClearKeyedLookupCache();
+
CompilationCache::MarkCompactPrologue();
RegExpImpl::OldSpaceCollectionPrologue();
- Top::MarkCompactPrologue();
- ThreadManager::MarkCompactPrologue();
+
+ Top::MarkCompactPrologue(is_compacting);
+ ThreadManager::MarkCompactPrologue(is_compacting);
}
-void Heap::MarkCompactEpilogue() {
- Top::MarkCompactEpilogue();
- ThreadManager::MarkCompactEpilogue();
+void Heap::MarkCompactEpilogue(bool is_compacting) {
+ Top::MarkCompactEpilogue(is_compacting);
+ ThreadManager::MarkCompactEpilogue(is_compacting);
}
@@ -1601,7 +1609,7 @@
Object* Heap::CreateCode(const CodeDesc& desc,
ScopeInfo<>* sinfo,
Code::Flags flags,
- Code** self_reference) {
+ Handle<Object> self_reference) {
// Compute size
int body_size = RoundUp(desc.instr_size + desc.reloc_size,
kObjectAlignment);
int sinfo_size = 0;
@@ -1624,9 +1632,10 @@
code->set_sinfo_size(sinfo_size);
code->set_flags(flags);
code->set_ic_flag(Code::IC_TARGET_IS_ADDRESS);
- // Allow self references to created code object.
- if (self_reference != NULL) {
- *self_reference = code;
+ // Allow self references to created code object by patching the handle to
+ // point to the newly allocated Code object.
+ if (!self_reference.is_null()) {
+ *(self_reference.location()) = code;
}
// Migrate generated code.
// The generated code can contain Object** values (typically from
handles)
Modified: branches/bleeding_edge/src/heap.h
==============================================================================
--- branches/bleeding_edge/src/heap.h (original)
+++ branches/bleeding_edge/src/heap.h Wed Feb 25 08:52:15 2009
@@ -567,7 +567,7 @@
static Object* CreateCode(const CodeDesc& desc,
ScopeInfo<>* sinfo,
Code::Flags flags,
- Code** self_reference = NULL);
+ Handle<Object> self_reference);
static Object* CopyCode(Code* code);
// Finds the symbol for string in the symbol table.
@@ -923,8 +923,8 @@
static void MarkCompact(GCTracer* tracer);
// Code to be run before and after mark-compact.
- static void MarkCompactPrologue();
- static void MarkCompactEpilogue();
+ static void MarkCompactPrologue(bool is_compacting);
+ static void MarkCompactEpilogue(bool is_compacting);
// Helper function used by CopyObject to copy a source object to an
// allocated target object and update the forwarding pointer in the
source
Modified: branches/bleeding_edge/src/macro-assembler-arm.cc
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-arm.cc (original)
+++ branches/bleeding_edge/src/macro-assembler-arm.cc Wed Feb 25 08:52:15
2009
@@ -43,7 +43,8 @@
: Assembler(buffer, size),
unresolved_(0),
generating_stub_(false),
- allow_stub_calls_(true) {
+ allow_stub_calls_(true),
+ code_object_(Heap::undefined_value()) {
}
@@ -270,8 +271,8 @@
stm(db_w, sp, cp.bit() | fp.bit() | lr.bit());
mov(ip, Operand(Smi::FromInt(type)));
push(ip);
- mov(ip, Operand(0));
- push(ip); // Push an empty code cache slot.
+ mov(ip, Operand(CodeObject()));
+ push(ip);
add(fp, sp, Operand(3 * kPointerSize)); // Adjust FP to point to saved
FP.
}
Modified: branches/bleeding_edge/src/macro-assembler-arm.h
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-arm.h (original)
+++ branches/bleeding_edge/src/macro-assembler-arm.h Wed Feb 25 08:52:15
2009
@@ -230,6 +230,8 @@
};
List<Unresolved>* unresolved() { return &unresolved_; }
+ Handle<Object> CodeObject() { return code_object_; }
+
//
---------------------------------------------------------------------------
// StatsCounter support
@@ -265,6 +267,8 @@
List<Unresolved> unresolved_;
bool generating_stub_;
bool allow_stub_calls_;
+ Handle<Object> code_object_; // This handle will be patched with the
code
+ // object on installation.
// Helper functions for generating invokes.
void InvokePrologue(const ParameterCount& expected,
Modified: branches/bleeding_edge/src/macro-assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-ia32.cc (original)
+++ branches/bleeding_edge/src/macro-assembler-ia32.cc Wed Feb 25 08:52:15
2009
@@ -39,7 +39,8 @@
: Assembler(buffer, size),
unresolved_(0),
generating_stub_(false),
- allow_stub_calls_(true) {
+ allow_stub_calls_(true),
+ code_object_(Heap::undefined_value()) {
}
@@ -317,7 +318,11 @@
mov(ebp, Operand(esp));
push(esi);
push(Immediate(Smi::FromInt(type)));
- push(Immediate(0)); // Push an empty code cache slot.
+ push(Immediate(CodeObject()));
+ if (FLAG_debug_code) {
+ cmp(Operand(esp, 0), Immediate(Factory::undefined_value()));
+ Check(not_equal, "code object not properly patched");
+ }
}
Modified: branches/bleeding_edge/src/macro-assembler-ia32.h
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-ia32.h (original)
+++ branches/bleeding_edge/src/macro-assembler-ia32.h Wed Feb 25 08:52:15
2009
@@ -235,6 +235,8 @@
};
List<Unresolved>* unresolved() { return &unresolved_; }
+ Handle<Object> CodeObject() { return code_object_; }
+
//
---------------------------------------------------------------------------
// StatsCounter support
@@ -267,6 +269,8 @@
List<Unresolved> unresolved_;
bool generating_stub_;
bool allow_stub_calls_;
+ Handle<Object> code_object_; // This handle will be patched with the
code
+ // code object on installation.
// Helper functions for generating invokes.
void InvokePrologue(const ParameterCount& expected,
Modified: branches/bleeding_edge/src/mark-compact.cc
==============================================================================
--- branches/bleeding_edge/src/mark-compact.cc (original)
+++ branches/bleeding_edge/src/mark-compact.cc Wed Feb 25 08:52:15 2009
@@ -58,11 +58,11 @@
int MarkCompactCollector::live_lo_objects_ = 0;
#endif
-void MarkCompactCollector::CollectGarbage(GCTracer* tracer) {
- // Rather than passing the tracer around we stash it in a static member
- // variable.
- tracer_ = tracer;
- Prepare();
+void MarkCompactCollector::CollectGarbage() {
+ // Make sure that Prepare() has been called. The individual steps below
will
+ // update the state as they proceed.
+ ASSERT(state_ == PREPARE_GC);
+
// Prepare has selected whether to compact the old generation or not.
// Tell the tracer.
if (IsCompacting()) tracer_->set_is_compacting();
@@ -96,7 +96,11 @@
}
-void MarkCompactCollector::Prepare() {
+void MarkCompactCollector::Prepare(GCTracer* tracer) {
+ // Rather than passing the tracer around we stash it in a static member
+ // variable.
+ tracer_ = tracer;
+
static const int kFragmentationLimit = 50; // Percent.
#ifdef DEBUG
ASSERT(state_ == IDLE);
@@ -241,7 +245,6 @@
// Helper class for marking pointers in HeapObjects.
class MarkingVisitor : public ObjectVisitor {
public:
-
void VisitPointer(Object** p) {
MarkObjectByPointer(p);
}
Modified: branches/bleeding_edge/src/mark-compact.h
==============================================================================
--- branches/bleeding_edge/src/mark-compact.h (original)
+++ branches/bleeding_edge/src/mark-compact.h Wed Feb 25 08:52:15 2009
@@ -74,8 +74,12 @@
// Type of functions to process non-live objects.
typedef void (*ProcessNonLiveFunction)(HeapObject* object);
+ // Prepares for GC by resetting relocation info in old and map spaces and
+ // choosing spaces to compact.
+ static void Prepare(GCTracer* tracer);
+
// Performs a global garbage collection.
- static void CollectGarbage(GCTracer* tracer);
+ static void CollectGarbage();
// True if the last full GC performed heap compaction.
static bool HasCompacted() { return compacting_collection_; }
@@ -122,10 +126,6 @@
// A pointer to the current stack-allocated GC tracer object during a
full
// collection (NULL before and after).
static GCTracer* tracer_;
-
- // Prepares for GC by resetting relocation info in old and map spaces and
- // choosing spaces to compact.
- static void Prepare();
// Finishes GC, performs heap verification if enabled.
static void Finish();
Modified: branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc (original)
+++ branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc Wed Feb 25
08:52:15 2009
@@ -99,8 +99,7 @@
start_label_(),
success_label_(),
backtrack_label_(),
- exit_label_(),
- self_(Heap::undefined_value()) {
+ exit_label_() {
__ jmp(&entry_label_); // We'll write the entry code later.
__ bind(&start_label_); // And then continue from here.
}
@@ -145,7 +144,7 @@
CheckPreemption();
// Pop Code* offset from backtrack stack, add Code* and jump to location.
Pop(ebx);
- __ add(Operand(ebx), Immediate(self_));
+ __ add(Operand(ebx), Immediate(masm_->CodeObject()));
__ jmp(Operand(ebx));
}
@@ -661,7 +660,7 @@
__ bind(&stack_limit_hit);
int num_arguments = 2;
FrameAlign(num_arguments, ebx);
- __ mov(Operand(esp, 1 * kPointerSize), Immediate(self_));
+ __ mov(Operand(esp, 1 * kPointerSize), Immediate(masm_->CodeObject()));
__ lea(eax, Operand(esp, -kPointerSize));
__ mov(Operand(esp, 0 * kPointerSize), eax);
CallCFunction(FUNCTION_ADDR(&CheckStackGuardState), num_arguments);
@@ -784,7 +783,7 @@
__ bind(&retry);
int num_arguments = 2;
FrameAlign(num_arguments, ebx);
- __ mov(Operand(esp, 1 * kPointerSize), Immediate(self_));
+ __ mov(Operand(esp, 1 * kPointerSize), Immediate(masm_->CodeObject()));
__ lea(eax, Operand(esp, -kPointerSize));
__ mov(Operand(esp, 0 * kPointerSize), eax);
CallCFunction(FUNCTION_ADDR(&CheckStackGuardState), num_arguments);
@@ -849,7 +848,7 @@
Handle<Code> code = Factory::NewCode(code_desc,
NULL,
Code::ComputeFlags(Code::REGEXP),
- self_);
+ masm_->CodeObject());
LOG(CodeCreateEvent("RegExp", *code, *(source->ToCString())));
return Handle<Object>::cast(code);
}
@@ -1139,7 +1138,7 @@
void RegExpMacroAssemblerIA32::SafeReturn() {
__ pop(ebx);
- __ add(Operand(ebx), Immediate(self_));
+ __ add(Operand(ebx), Immediate(masm_->CodeObject()));
__ jmp(Operand(ebx));
}
Modified: branches/bleeding_edge/src/regexp-macro-assembler-ia32.h
==============================================================================
--- branches/bleeding_edge/src/regexp-macro-assembler-ia32.h (original)
+++ branches/bleeding_edge/src/regexp-macro-assembler-ia32.h Wed Feb 25
08:52:15 2009
@@ -253,9 +253,6 @@
Label exit_label_;
Label check_preempt_label_;
Label stack_overflow_label_;
-
- // Handle used to represent the generated code object itself.
- Handle<Object> self_;
};
}} // namespace v8::internal
Modified: branches/bleeding_edge/src/runtime.cc
==============================================================================
--- branches/bleeding_edge/src/runtime.cc (original)
+++ branches/bleeding_edge/src/runtime.cc Wed Feb 25 08:52:15 2009
@@ -5015,13 +5015,13 @@
Handle<Object> frame_id(WrapFrameId(it.frame()->id()));
// Find source position.
- int position = it.frame()->FindCode()->SourcePosition(it.frame()->pc());
+ int position = it.frame()->code()->SourcePosition(it.frame()->pc());
// Check for constructor frame.
bool constructor = it.frame()->IsConstructor();
// Get code and read scope info from it for local variable information.
- Handle<Code> code(it.frame()->FindCode());
+ Handle<Code> code(it.frame()->code());
ScopeInfo<> info(*code);
// Get the context.
Modified: branches/bleeding_edge/src/spaces.cc
==============================================================================
--- branches/bleeding_edge/src/spaces.cc (original)
+++ branches/bleeding_edge/src/spaces.cc Wed Feb 25 08:52:15 2009
@@ -538,11 +538,9 @@
Object* PagedSpace::FindObject(Address addr) {
-#ifdef DEBUG
// Note: this function can only be called before or after mark-compact GC
// because it accesses map pointers.
ASSERT(!MarkCompactCollector::in_use());
-#endif
if (!Contains(addr)) return Failure::Exception();
Modified: branches/bleeding_edge/src/stub-cache.cc
==============================================================================
--- branches/bleeding_edge/src/stub-cache.cc (original)
+++ branches/bleeding_edge/src/stub-cache.cc Wed Feb 25 08:52:15 2009
@@ -892,7 +892,7 @@
Object* StubCompiler::GetCodeWithFlags(Code::Flags flags) {
CodeDesc desc;
masm_.GetCode(&desc);
- Object* result = Heap::CreateCode(desc, NULL, flags, NULL);
+ Object* result = Heap::CreateCode(desc, NULL, flags, masm_.CodeObject());
#ifdef DEBUG
if (FLAG_print_code_stubs && !result->IsFailure()) {
Code::cast(result)->Print();
Modified: branches/bleeding_edge/src/stub-cache.h
==============================================================================
--- branches/bleeding_edge/src/stub-cache.h (original)
+++ branches/bleeding_edge/src/stub-cache.h Wed Feb 25 08:52:15 2009
@@ -281,7 +281,7 @@
JSARRAY_HAS_FAST_ELEMENTS_CHECK
};
- StubCompiler() : masm_(NULL, 256) { }
+ StubCompiler() : scope_(), masm_(NULL, 256) { }
Object* CompileCallInitialize(Code::Flags flags);
Object* CompileCallPreMonomorphic(Code::Flags flags);
@@ -367,6 +367,7 @@
MacroAssembler* masm() { return &masm_; }
private:
+ HandleScope scope_;
MacroAssembler masm_;
};
Modified: branches/bleeding_edge/src/top.cc
==============================================================================
--- branches/bleeding_edge/src/top.cc (original)
+++ branches/bleeding_edge/src/top.cc Wed Feb 25 08:52:15 2009
@@ -333,33 +333,37 @@
}
-void Top::MarkCompactPrologue() {
- MarkCompactPrologue(&thread_local_);
+void Top::MarkCompactPrologue(bool is_compacting) {
+ MarkCompactPrologue(is_compacting, &thread_local_);
}
-void Top::MarkCompactPrologue(char* data) {
- MarkCompactPrologue(reinterpret_cast<ThreadLocalTop*>(data));
+void Top::MarkCompactPrologue(bool is_compacting, char* data) {
+ MarkCompactPrologue(is_compacting,
reinterpret_cast<ThreadLocalTop*>(data));
}
-void Top::MarkCompactPrologue(ThreadLocalTop* thread) {
- StackFrame::CookFramesForThread(thread);
+void Top::MarkCompactPrologue(bool is_compacting, ThreadLocalTop* thread) {
+ if (is_compacting) {
+ StackFrame::CookFramesForThread(thread);
+ }
}
-void Top::MarkCompactEpilogue(char* data) {
- MarkCompactEpilogue(reinterpret_cast<ThreadLocalTop*>(data));
+void Top::MarkCompactEpilogue(bool is_compacting, char* data) {
+ MarkCompactEpilogue(is_compacting,
reinterpret_cast<ThreadLocalTop*>(data));
}
-void Top::MarkCompactEpilogue() {
- MarkCompactEpilogue(&thread_local_);
+void Top::MarkCompactEpilogue(bool is_compacting) {
+ MarkCompactEpilogue(is_compacting, &thread_local_);
}
-void Top::MarkCompactEpilogue(ThreadLocalTop* thread) {
- StackFrame::UncookFramesForThread(thread);
+void Top::MarkCompactEpilogue(bool is_compacting, ThreadLocalTop* thread) {
+ if (is_compacting) {
+ StackFrame::UncookFramesForThread(thread);
+ }
}
@@ -690,7 +694,7 @@
HandleScope scope;
// Find code position if recorded in relocation info.
JavaScriptFrame* frame = it.frame();
- int pos = frame->FindCode()->SourcePosition(frame->pc());
+ int pos = frame->code()->SourcePosition(frame->pc());
Handle<Object> pos_obj(Smi::FromInt(pos));
// Fetch function and receiver.
Handle<JSFunction> fun(JSFunction::cast(frame->function()));
@@ -721,7 +725,7 @@
Object* script = fun->shared()->script();
if (script->IsScript() &&
!(Script::cast(script)->source()->IsUndefined())) {
- int pos = frame->FindCode()->SourcePosition(frame->pc());
+ int pos = frame->code()->SourcePosition(frame->pc());
// Compute the location from the function and the reloc info.
Handle<Script> casted_script(Script::cast(script));
*target = MessageLocation(casted_script, pos, pos + 1);
Modified: branches/bleeding_edge/src/top.h
==============================================================================
--- branches/bleeding_edge/src/top.h (original)
+++ branches/bleeding_edge/src/top.h Wed Feb 25 08:52:15 2009
@@ -189,10 +189,12 @@
static StackFrame::Id break_frame_id();
static int break_id();
- static void MarkCompactPrologue();
- static void MarkCompactEpilogue();
- static void MarkCompactPrologue(char* archived_thread_data);
- static void MarkCompactEpilogue(char* archived_thread_data);
+ static void MarkCompactPrologue(bool is_compacting);
+ static void MarkCompactEpilogue(bool is_compacting);
+ static void MarkCompactPrologue(bool is_compacting,
+ char* archived_thread_data);
+ static void MarkCompactEpilogue(bool is_compacting,
+ char* archived_thread_data);
static void PrintCurrentStackTrace(FILE* out);
static void PrintStackTrace(FILE* out, char* thread_data);
static void PrintStack(StringStream* accumulator);
@@ -293,8 +295,10 @@
static ThreadLocalTop thread_local_;
static void InitializeThreadLocal();
static void PrintStackTrace(FILE* out, ThreadLocalTop* thread);
- static void MarkCompactPrologue(ThreadLocalTop* archived_thread_data);
- static void MarkCompactEpilogue(ThreadLocalTop* archived_thread_data);
+ static void MarkCompactPrologue(bool is_compacting,
+ ThreadLocalTop* archived_thread_data);
+ static void MarkCompactEpilogue(bool is_compacting,
+ ThreadLocalTop* archived_thread_data);
// Debug.
// Mutex for serializing access to break control structures.
Modified: branches/bleeding_edge/src/v8threads.cc
==============================================================================
--- branches/bleeding_edge/src/v8threads.cc (original)
+++ branches/bleeding_edge/src/v8threads.cc Wed Feb 25 08:52:15 2009
@@ -268,24 +268,24 @@
}
-void ThreadManager::MarkCompactPrologue() {
+void ThreadManager::MarkCompactPrologue(bool is_compacting) {
for (ThreadState* state = ThreadState::FirstInUse();
state != NULL;
state = state->Next()) {
char* data = state->data();
data += HandleScopeImplementer::ArchiveSpacePerThread();
- Top::MarkCompactPrologue(data);
+ Top::MarkCompactPrologue(is_compacting, data);
}
}
-void ThreadManager::MarkCompactEpilogue() {
+void ThreadManager::MarkCompactEpilogue(bool is_compacting) {
for (ThreadState* state = ThreadState::FirstInUse();
state != NULL;
state = state->Next()) {
char* data = state->data();
data += HandleScopeImplementer::ArchiveSpacePerThread();
- Top::MarkCompactEpilogue(data);
+ Top::MarkCompactEpilogue(is_compacting, data);
}
}
Modified: branches/bleeding_edge/src/v8threads.h
==============================================================================
--- branches/bleeding_edge/src/v8threads.h (original)
+++ branches/bleeding_edge/src/v8threads.h Wed Feb 25 08:52:15 2009
@@ -74,8 +74,8 @@
static bool RestoreThread();
static void Iterate(ObjectVisitor* v);
- static void MarkCompactPrologue();
- static void MarkCompactEpilogue();
+ static void MarkCompactPrologue(bool is_compacting);
+ static void MarkCompactEpilogue(bool is_compacting);
static bool IsLockedByCurrentThread() { return mutex_owner_.IsSelf(); }
private:
static void EagerlyArchiveThread();
Modified: branches/bleeding_edge/test/cctest/test-assembler-arm.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-assembler-arm.cc (original)
+++ branches/bleeding_edge/test/cctest/test-assembler-arm.cc Wed Feb 25
08:52:15 2009
@@ -72,7 +72,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
@@ -106,7 +109,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
@@ -149,7 +155,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
@@ -194,7 +203,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
Modified: branches/bleeding_edge/test/cctest/test-assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-assembler-ia32.cc (original)
+++ branches/bleeding_edge/test/cctest/test-assembler-ia32.cc Wed Feb 25
08:52:15 2009
@@ -69,7 +69,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
@@ -104,7 +107,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
@@ -143,7 +149,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
@@ -173,7 +182,10 @@
CodeDesc desc;
assm.GetCode(&desc);
Code* code =
- Code::cast(Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB)));
+ Code::cast(Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+
Handle<Object>(Heap::undefined_value())));
// don't print the code - our disassembler can't handle cvttss2si
// instead print bytes
Disassembler::Dump(stdout,
@@ -203,7 +215,10 @@
CodeDesc desc;
assm.GetCode(&desc);
Code* code =
- Code::cast(Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB)));
+ Code::cast(Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+
Handle<Object>(Heap::undefined_value())));
// don't print the code - our disassembler can't handle cvttsd2si
// instead print bytes
Disassembler::Dump(stdout,
@@ -230,7 +245,10 @@
CodeDesc desc;
assm.GetCode(&desc);
Code* code =
- Code::cast(Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB)));
+ Code::cast(Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+
Handle<Object>(Heap::undefined_value())));
F0 f = FUNCTION_CAST<F0>(code->entry());
int res = f();
CHECK_EQ(42, res);
@@ -263,7 +281,10 @@
CodeDesc desc;
assm.GetCode(&desc);
Code* code =
- Code::cast(Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB)));
+ Code::cast(Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+
Handle<Object>(Heap::undefined_value())));
#ifdef DEBUG
::printf("\n---\n");
// don't print the code - our disassembler can't handle SSE instructions
@@ -299,7 +320,10 @@
CodeDesc desc;
assm.GetCode(&desc);
Code* code =
- Code::cast(Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB)));
+ Code::cast(Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+
Handle<Object>(Heap::undefined_value())));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
@@ -352,7 +376,10 @@
CodeDesc desc;
assm.GetCode(&desc);
Code* code =
- Code::cast(Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB)));
+ Code::cast(Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+
Handle<Object>(Heap::undefined_value())));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
Modified: branches/bleeding_edge/test/cctest/test-disasm-ia32.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-disasm-ia32.cc (original)
+++ branches/bleeding_edge/test/cctest/test-disasm-ia32.cc Wed Feb 25
08:52:15 2009
@@ -368,7 +368,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
#ifdef DEBUG
Code::cast(code)->Print();
Modified: branches/bleeding_edge/test/cctest/test-heap.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-heap.cc (original)
+++ branches/bleeding_edge/test/cctest/test-heap.cc Wed Feb 25 08:52:15 2009
@@ -77,7 +77,10 @@
CodeDesc desc;
assm.GetCode(&desc);
- Object* code = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* code = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(code->IsCode());
HeapObject* obj = HeapObject::cast(code);
@@ -88,7 +91,10 @@
CHECK_EQ(code, found);
}
- Object* copy = Heap::CreateCode(desc, NULL,
Code::ComputeFlags(Code::STUB));
+ Object* copy = Heap::CreateCode(desc,
+ NULL,
+ Code::ComputeFlags(Code::STUB),
+ Handle<Object>(Heap::undefined_value()));
CHECK(copy->IsCode());
HeapObject* obj_copy = HeapObject::cast(copy);
Object* not_right = Heap::FindCodeObject(obj_copy->address() +
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---