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
-~----------~----~----~----~------~----~------~--~---

Reply via email to