Author: [email protected]
Date: Thu May 14 04:55:18 2009
New Revision: 1950
Removed:
branches/bleeding_edge/src/frame-element.h
branches/bleeding_edge/src/jump-target-inl.h
Modified:
branches/bleeding_edge/src/arm/virtual-frame-arm.h
branches/bleeding_edge/src/compiler.cc
branches/bleeding_edge/src/compiler.h
branches/bleeding_edge/src/ia32/virtual-frame-ia32.h
branches/bleeding_edge/src/jump-target.cc
branches/bleeding_edge/src/jump-target.h
branches/bleeding_edge/src/register-allocator-inl.h
branches/bleeding_edge/src/register-allocator.h
branches/bleeding_edge/src/virtual-frame.cc
branches/bleeding_edge/src/virtual-frame.h
branches/bleeding_edge/src/zone.h
branches/bleeding_edge/tools/gyp/v8.gyp
branches/bleeding_edge/tools/visual_studio/v8_base.vcproj
Log:
Revert revision 1949.
Review URL: http://codereview.chromium.org/115350
Modified: branches/bleeding_edge/src/arm/virtual-frame-arm.h
==============================================================================
--- branches/bleeding_edge/src/arm/virtual-frame-arm.h (original)
+++ branches/bleeding_edge/src/arm/virtual-frame-arm.h Thu May 14 04:55:18
2009
@@ -471,6 +471,18 @@
bool Equals(VirtualFrame* other);
+ // Perform initialization required during entry frame computation
+ // after setting the virtual frame element at index in frame to be
+ // target.
+ void InitializeEntryElement(int index, FrameElement* target) {
+ elements_[index].clear_copied();
+ if (target->is_register()) {
+ register_locations_[target->reg().code()] = index;
+ } else if (target->is_copy()) {
+ elements_[target->index()].set_copied();
+ }
+ }
+
friend class JumpTarget;
};
Modified: branches/bleeding_edge/src/compiler.cc
==============================================================================
--- branches/bleeding_edge/src/compiler.cc (original)
+++ branches/bleeding_edge/src/compiler.cc Thu May 14 04:55:18 2009
@@ -101,7 +101,7 @@
Handle<Context> context,
v8::Extension* extension,
ScriptDataImpl* pre_data) {
- CompilationZoneScope zone_scope();
+ ZoneScope zone_scope(DELETE_ON_EXIT);
// Make sure we have an initial stack limit.
StackGuard guard;
@@ -306,7 +306,7 @@
bool Compiler::CompileLazy(Handle<SharedFunctionInfo> shared,
int loop_nesting) {
- CompilationZoneScope zone_scope();
+ ZoneScope zone_scope(DELETE_ON_EXIT);
// The VM is in the COMPILER state until exiting this function.
VMState state(COMPILER);
Modified: branches/bleeding_edge/src/compiler.h
==============================================================================
--- branches/bleeding_edge/src/compiler.h (original)
+++ branches/bleeding_edge/src/compiler.h Thu May 14 04:55:18 2009
@@ -28,9 +28,7 @@
#ifndef V8_COMPILER_H_
#define V8_COMPILER_H_
-#include "frame-element.h"
#include "parser.h"
-#include "zone.h"
namespace v8 { namespace internal {
@@ -70,19 +68,6 @@
// overflow.
static bool CompileLazy(Handle<SharedFunctionInfo> shared, int
loop_nesting);
};
-
-
-// During compilation we need a global list of handles to constants
-// for frame elements. When the zone gets deleted, we make sure to
-// clear this list of handles as well.
-class CompilationZoneScope : public ZoneScope {
- public:
- CompilationZoneScope() : ZoneScope(DELETE_ON_EXIT) { }
- virtual ~CompilationZoneScope() {
- if (ShouldDeleteOnExit()) FrameElement::ClearConstantList();
- }
-};
-
} } // namespace v8::internal
Modified: branches/bleeding_edge/src/ia32/virtual-frame-ia32.h
==============================================================================
--- branches/bleeding_edge/src/ia32/virtual-frame-ia32.h (original)
+++ branches/bleeding_edge/src/ia32/virtual-frame-ia32.h Thu May 14
04:55:18 2009
@@ -485,6 +485,18 @@
bool Equals(VirtualFrame* other);
+ // Perform initialization required during entry frame computation
+ // after setting the virtual frame element at index in frame to be
+ // target.
+ void InitializeEntryElement(int index, FrameElement* target) {
+ elements_[index].clear_copied();
+ if (target->is_register()) {
+ register_locations_[target->reg().code()] = index;
+ } else if (target->is_copy()) {
+ elements_[target->index()].set_copied();
+ }
+ }
+
friend class JumpTarget;
};
Modified: branches/bleeding_edge/src/jump-target.cc
==============================================================================
--- branches/bleeding_edge/src/jump-target.cc (original)
+++ branches/bleeding_edge/src/jump-target.cc Thu May 14 04:55:18 2009
@@ -28,7 +28,6 @@
#include "v8.h"
#include "codegen-inl.h"
-#include "jump-target-inl.h"
#include "register-allocator-inl.h"
namespace v8 { namespace internal {
@@ -166,7 +165,7 @@
// elements are initially recorded as if in memory.
if (target != NULL) {
entry_frame_->elements_[index] = *target;
- InitializeEntryElement(index, target);
+ entry_frame_->InitializeEntryElement(index, target);
}
}
// Then fill in the rest of the frame with new elements.
@@ -176,7 +175,7 @@
entry_frame_->elements_.Add(FrameElement::MemoryElement());
} else {
entry_frame_->elements_.Add(*target);
- InitializeEntryElement(index, target);
+ entry_frame_->InitializeEntryElement(index, target);
}
}
Modified: branches/bleeding_edge/src/jump-target.h
==============================================================================
--- branches/bleeding_edge/src/jump-target.h (original)
+++ branches/bleeding_edge/src/jump-target.h Thu May 14 04:55:18 2009
@@ -35,6 +35,7 @@
class Result;
class VirtualFrame;
+
//
-------------------------------------------------------------------------
// Jump targets
//
@@ -198,13 +199,8 @@
// and a corresponding merge code label.
void AddReachingFrame(VirtualFrame* frame);
- // Perform initialization required during entry frame computation
- // after setting the virtual frame element at index in frame to be
- // target.
- inline void InitializeEntryElement(int index, FrameElement* target);
-
- // Compute a frame to use for entry to this block. Mergable
- // elements is as described for the Bind function.
+ // Compute a frame to use for entry to this block. Mergable elements
+ // is as described for the Bind function.
void ComputeEntryFrame(int mergable_elements);
DISALLOW_COPY_AND_ASSIGN(JumpTarget);
Modified: branches/bleeding_edge/src/register-allocator-inl.h
==============================================================================
--- branches/bleeding_edge/src/register-allocator-inl.h (original)
+++ branches/bleeding_edge/src/register-allocator-inl.h Thu May 14 04:55:18
2009
@@ -28,7 +28,6 @@
#ifndef V8_REGISTER_ALLOCATOR_INL_H_
#define V8_REGISTER_ALLOCATOR_INL_H_
-#include "codegen.h"
#include "register-allocator.h"
#include "virtual-frame.h"
Modified: branches/bleeding_edge/src/register-allocator.h
==============================================================================
--- branches/bleeding_edge/src/register-allocator.h (original)
+++ branches/bleeding_edge/src/register-allocator.h Thu May 14 04:55:18 2009
@@ -100,9 +100,7 @@
explicit StaticType(StaticTypeEnum static_type) :
static_type_(static_type) {}
// StaticTypeEnum static_type_;
- StaticTypeEnum static_type_;
-
- friend class FrameElement;
+ byte static_type_;
};
Modified: branches/bleeding_edge/src/virtual-frame.cc
==============================================================================
--- branches/bleeding_edge/src/virtual-frame.cc (original)
+++ branches/bleeding_edge/src/virtual-frame.cc Thu May 14 04:55:18 2009
@@ -94,10 +94,10 @@
case FrameElement::REGISTER:
// All copies are backed by memory or register locations.
result.set_static_type(target.static_type());
- result.set_type(FrameElement::COPY);
- result.clear_copied();
- result.clear_sync();
- result.set_index(index);
+ result.type_ = FrameElement::COPY;
+ result.copied_ = false;
+ result.synced_ = false;
+ result.data_.index_ = index;
elements_[index].set_copied();
break;
@@ -462,6 +462,23 @@
Drop(num_dropped - 1);
}
SetElementAt(0, &tos);
+}
+
+
+bool FrameElement::Equals(FrameElement other) {
+ if (type_ != other.type_ ||
+ copied_ != other.copied_ ||
+ synced_ != other.synced_) return false;
+
+ if (is_register()) {
+ if (!reg().is(other.reg())) return false;
+ } else if (is_constant()) {
+ if (!handle().is_identical_to(other.handle())) return false;
+ } else if (is_copy()) {
+ if (index() != other.index()) return false;
+ }
+
+ return true;
}
Modified: branches/bleeding_edge/src/virtual-frame.h
==============================================================================
--- branches/bleeding_edge/src/virtual-frame.h (original)
+++ branches/bleeding_edge/src/virtual-frame.h Thu May 14 04:55:18 2009
@@ -28,8 +28,205 @@
#ifndef V8_VIRTUAL_FRAME_H_
#define V8_VIRTUAL_FRAME_H_
-#include "frame-element.h"
#include "macro-assembler.h"
+
+namespace v8 { namespace internal {
+
+//
-------------------------------------------------------------------------
+// Virtual frame elements
+//
+// The internal elements of the virtual frames. There are several kinds of
+// elements:
+// * Invalid: elements that are uninitialized or not actually part
+// of the virtual frame. They should not be read.
+// * Memory: an element that resides in the actual frame. Its address is
+// given by its position in the virtual frame.
+// * Register: an element that resides in a register.
+// * Constant: an element whose value is known at compile time.
+
+class FrameElement BASE_EMBEDDED {
+ public:
+ enum SyncFlag {
+ NOT_SYNCED,
+ SYNCED
+ };
+
+ // The default constructor creates an invalid frame element.
+ FrameElement()
+ : static_type_(), type_(INVALID), copied_(false), synced_(false) {
+ data_.reg_ = no_reg;
+ }
+
+ // Factory function to construct an invalid frame element.
+ static FrameElement InvalidElement() {
+ FrameElement result;
+ return result;
+ }
+
+ // Factory function to construct an in-memory frame element.
+ static FrameElement MemoryElement() {
+ FrameElement result(MEMORY, no_reg, SYNCED);
+ return result;
+ }
+
+ // Factory function to construct an in-register frame element.
+ static FrameElement RegisterElement(Register reg,
+ SyncFlag is_synced,
+ StaticType static_type =
StaticType()) {
+ return FrameElement(REGISTER, reg, is_synced, static_type);
+ }
+
+ // Factory function to construct a frame element whose value is known at
+ // compile time.
+ static FrameElement ConstantElement(Handle<Object> value,
+ SyncFlag is_synced) {
+ FrameElement result(value, is_synced);
+ return result;
+ }
+
+ bool is_synced() const { return synced_; }
+
+ void set_sync() {
+ ASSERT(type() != MEMORY);
+ synced_ = true;
+ }
+
+ void clear_sync() {
+ ASSERT(type() != MEMORY);
+ synced_ = false;
+ }
+
+ bool is_valid() const { return type() != INVALID; }
+ bool is_memory() const { return type() == MEMORY; }
+ bool is_register() const { return type() == REGISTER; }
+ bool is_constant() const { return type() == CONSTANT; }
+ bool is_copy() const { return type() == COPY; }
+
+ bool is_copied() const { return copied_; }
+ void set_copied() { copied_ = true; }
+ void clear_copied() { copied_ = false; }
+
+ Register reg() const {
+ ASSERT(is_register());
+ return data_.reg_;
+ }
+
+ Handle<Object> handle() const {
+ ASSERT(is_constant());
+ return Handle<Object>(data_.handle_);
+ }
+
+ int index() const {
+ ASSERT(is_copy());
+ return data_.index_;
+ }
+
+ StaticType static_type() { return static_type_; }
+
+ void set_static_type(StaticType static_type) {
+ // TODO(lrn): If it's s copy, it would be better to update the real
one,
+ // but we can't from here. The caller must handle this.
+ static_type_ = static_type;
+ }
+
+ // True if the frame elements are identical (all data members).
+ bool Equals(FrameElement other);
+
+ // Given a pair of non-null frame element pointers, return one of them
+ // as an entry frame candidate or null if they are incompatible.
+ FrameElement* Combine(FrameElement* other) {
+ // If either is invalid, the result is.
+ if (!is_valid()) return this;
+ if (!other->is_valid()) return other;
+
+ // If they do not have the exact same location we reallocate.
+ bool not_same_location =
+ (type_ != other->type_) ||
+ (is_register() && !reg().is(other->reg())) ||
+ (is_constant() && !handle().is_identical_to(other->handle())) ||
+ (is_copy() && index() != other->index());
+ if (not_same_location) return NULL;
+
+ // If either is unsynced, the result is. The result static type is
+ // the merge of the static types. It's safe to set it on one of the
+ // frame elements, and harmless too (because we are only going to
+ // merge the reaching frames and will ensure that the types are
+ // coherent, and changing the static type does not emit code).
+ FrameElement* result = is_synced() ? other : this;
+ result->set_static_type(static_type().merge(other->static_type()));
+ return result;
+ }
+
+ private:
+ enum Type {
+ INVALID,
+ MEMORY,
+ REGISTER,
+ CONSTANT,
+ COPY
+ };
+
+ Type type() const { return static_cast<Type>(type_); }
+
+ StaticType static_type_;
+
+ // The element's type.
+ byte type_;
+
+ bool copied_;
+
+ // The element's dirty-bit. The dirty bit can be cleared
+ // for non-memory elements to indicate that the element agrees with
+ // the value in memory in the actual frame.
+ bool synced_;
+
+ union {
+ Register reg_;
+ Object** handle_;
+ int index_;
+ } data_;
+
+ // Used to construct memory and register elements.
+ FrameElement(Type type, Register reg, SyncFlag is_synced)
+ : static_type_(),
+ type_(type),
+ copied_(false),
+ synced_(is_synced != NOT_SYNCED) {
+ data_.reg_ = reg;
+ }
+
+ FrameElement(Type type, Register reg, SyncFlag is_synced, StaticType
stype)
+ : static_type_(stype),
+ type_(type),
+ copied_(false),
+ synced_(is_synced != NOT_SYNCED) {
+ data_.reg_ = reg;
+ }
+
+ // Used to construct constant elements.
+ FrameElement(Handle<Object> value, SyncFlag is_synced)
+ : static_type_(StaticType::TypeOf(*value)),
+ type_(CONSTANT),
+ copied_(false),
+ synced_(is_synced != NOT_SYNCED) {
+ data_.handle_ = value.location();
+ }
+
+ void set_index(int new_index) {
+ ASSERT(is_copy());
+ data_.index_ = new_index;
+ }
+
+ void set_reg(Register new_reg) {
+ ASSERT(is_register());
+ data_.reg_ = new_reg;
+ }
+
+ friend class VirtualFrame;
+};
+
+
+} } // namespace v8::internal
#if V8_TARGET_ARCH_IA32
#include "ia32/virtual-frame-ia32.h"
Modified: branches/bleeding_edge/src/zone.h
==============================================================================
--- branches/bleeding_edge/src/zone.h (original)
+++ branches/bleeding_edge/src/zone.h Thu May 14 04:55:18 2009
@@ -180,13 +180,8 @@
nesting_++;
}
- virtual ~ZoneScope() {
- if (ShouldDeleteOnExit()) Zone::DeleteAll();
- --nesting_;
- }
-
- bool ShouldDeleteOnExit() {
- return nesting_ == 1 && mode_ == DELETE_ON_EXIT;
+ ~ZoneScope() {
+ if (--nesting_ == 0 && mode_ == DELETE_ON_EXIT) Zone::DeleteAll();
}
// For ZoneScopes that do not delete on exit by default, call this
Modified: branches/bleeding_edge/tools/gyp/v8.gyp
==============================================================================
--- branches/bleeding_edge/tools/gyp/v8.gyp (original)
+++ branches/bleeding_edge/tools/gyp/v8.gyp Thu May 14 04:55:18 2009
@@ -135,7 +135,6 @@
'../../src/frames-inl.h',
'../../src/frames.cc',
'../../src/frames.h',
- '../../src/frame-element.h',
'../../src/func-name-inferrer.cc',
'../../src/func-name-inferrer.h',
'../../src/global-handles.cc',
@@ -156,7 +155,6 @@
'../../src/interpreter-irregexp.h',
'../../src/jump-target.cc',
'../../src/jump-target.h',
- '../../src/jump-target-inl.h',
'../../src/jsregexp-inl.h',
'../../src/jsregexp.cc',
'../../src/jsregexp.h',
Modified: branches/bleeding_edge/tools/visual_studio/v8_base.vcproj
==============================================================================
--- branches/bleeding_edge/tools/visual_studio/v8_base.vcproj (original)
+++ branches/bleeding_edge/tools/visual_studio/v8_base.vcproj Thu May 14
04:55:18 2009
@@ -409,10 +409,6 @@
>
</File>
<File
- RelativePath="..\..\src\frame-element.h"
- >
- </File>
- <File
RelativePath="..\..\src\frames.cc"
>
</File>
@@ -502,10 +498,6 @@
</File>
<File
RelativePath="..\..\src\jump-target.h"
- >
- </File>
- <File
- RelativePath="..\..\src\jump-target-inl.h"
>
</File>
<File
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---