Author: [EMAIL PROTECTED]
Date: Tue Dec  9 04:53:59 2008
New Revision: 952

Modified:
    branches/bleeding_edge/src/assembler.cc
    branches/bleeding_edge/src/debug.cc
    branches/bleeding_edge/src/debug.h
    branches/bleeding_edge/src/disassembler.cc
    branches/bleeding_edge/src/ic-inl.h
    branches/bleeding_edge/src/objects-inl.h
    branches/bleeding_edge/src/objects.h
    branches/bleeding_edge/test/cctest/test-debug.cc

Log:
Refactor the convertion of a target address into a code object from the  
debugger to the Code class.
Review URL: http://codereview.chromium.org/13285

Modified: branches/bleeding_edge/src/assembler.cc
==============================================================================
--- branches/bleeding_edge/src/assembler.cc     (original)
+++ branches/bleeding_edge/src/assembler.cc     Tue Dec  9 04:53:59 2008
@@ -450,7 +450,7 @@
             ref_encoder.NameOfAddress(*target_reference_address()),
             *target_reference_address());
    } else if (IsCodeTarget(rmode_)) {
-    Code* code = Debug::GetCodeTarget(target_address());
+    Code* code = Code::GetCodeFromTargetAddress(target_address());
      PrintF(" (%s)  (%p)", Code::Kind2String(code->kind()),  
target_address());
    } else if (IsPosition(rmode_)) {
      PrintF("  (%d)", data());

Modified: branches/bleeding_edge/src/debug.cc
==============================================================================
--- branches/bleeding_edge/src/debug.cc (original)
+++ branches/bleeding_edge/src/debug.cc Tue Dec  9 04:53:59 2008
@@ -113,7 +113,7 @@
      // be of a different kind than in the original code.
      if (RelocInfo::IsCodeTarget(rmode())) {
        Address target = original_rinfo()->target_address();
-      Code* code = Debug::GetCodeTarget(target);
+      Code* code = Code::GetCodeFromTargetAddress(target);
        if (code->is_inline_cache_stub() ||  
RelocInfo::IsConstructCall(rmode())) {
          break_point_++;
          return;
@@ -325,7 +325,7 @@
    // Step in can only be prepared if currently positioned on an IC call or
    // construct call.
    Address target = rinfo()->target_address();
-  Code* code = Debug::GetCodeTarget(target);
+  Code* code = Code::GetCodeFromTargetAddress(target);
    if (code->is_call_stub()) {
      // Step in through IC call is handled by the runtime system. Therefore  
make
      // sure that the any current IC is cleared and the runtime system is
@@ -923,7 +923,7 @@
    bool is_call_target = false;
    if (RelocInfo::IsCodeTarget(it.rinfo()->rmode())) {
      Address target = it.rinfo()->target_address();
-    Code* code = Debug::GetCodeTarget(target);
+    Code* code = Code::GetCodeFromTargetAddress(target);
      if (code->is_call_stub()) is_call_target = true;
    }

@@ -991,7 +991,7 @@
  // Check whether the code object at the specified address is a debug break  
code
  // object.
  bool Debug::IsDebugBreak(Address addr) {
-  Code* code = GetCodeTarget(addr);
+  Code* code = Code::GetCodeFromTargetAddress(addr);
    return code->ic_state() == DEBUG_BREAK;
  }

@@ -1021,7 +1021,7 @@

    if (RelocInfo::IsCodeTarget(mode)) {
      Address target = rinfo->target_address();
-    Code* code = Debug::GetCodeTarget(target);
+    Code* code = Code::GetCodeFromTargetAddress(target);
      if (code->is_inline_cache_stub()) {
        if (code->is_call_stub()) {
          return ComputeCallDebugBreak(code->arguments_count());
@@ -1259,14 +1259,6 @@
      // call which was overwritten by the call to DebugBreakXXX.
      thread_local_.after_break_target_ = Assembler::target_address_at(addr);
    }
-}
-
-
-Code* Debug::GetCodeTarget(Address target) {
-  // Maybe this can be refactored with the stuff in ic-inl.h?
-  Code* result =
-      Code::cast(HeapObject::FromAddress(target - Code::kHeaderSize));
-  return result;
  }



Modified: branches/bleeding_edge/src/debug.h
==============================================================================
--- branches/bleeding_edge/src/debug.h  (original)
+++ branches/bleeding_edge/src/debug.h  Tue Dec  9 04:53:59 2008
@@ -194,7 +194,6 @@

    static Handle<Object> GetSourceBreakLocations(
        Handle<SharedFunctionInfo> shared);
-  static Code* GetCodeTarget(Address target);

    // Getter for the debug_context.
    inline static Handle<Context> debug_context() { return debug_context_; }

Modified: branches/bleeding_edge/src/disassembler.cc
==============================================================================
--- branches/bleeding_edge/src/disassembler.cc  (original)
+++ branches/bleeding_edge/src/disassembler.cc  Tue Dec  9 04:53:59 2008
@@ -228,7 +228,7 @@
          if (rmode == RelocInfo::CONSTRUCT_CALL) {
            out.AddFormatted(" constructor,");
          }
-        Code* code = Debug::GetCodeTarget(relocinfo.target_address());
+        Code* code =  
Code::GetCodeFromTargetAddress(relocinfo.target_address());
          Code::Kind kind = code->kind();
          if (code->is_inline_cache_stub()) {
            if (rmode == RelocInfo::CODE_TARGET_CONTEXT) {

Modified: branches/bleeding_edge/src/ic-inl.h
==============================================================================
--- branches/bleeding_edge/src/ic-inl.h (original)
+++ branches/bleeding_edge/src/ic-inl.h Tue Dec  9 04:53:59 2008
@@ -59,14 +59,11 @@


  Code* IC::GetTargetAtAddress(Address address) {
+  // Get the target address of the IC.
    Address target = Assembler::target_address_at(address);
-  HeapObject* code = HeapObject::FromAddress(target - Code::kHeaderSize);
-  // GetTargetAtAddress is called from IC::Clear which in turn is
-  // called when marking objects during mark sweep. reinterpret_cast
-  // is therefore used instead of the more appropriate
-  // Code::cast. Code::cast does not work when the object's map is
-  // marked.
-  Code* result = reinterpret_cast<Code*>(code);
+  // Convert target address to the code object.  
Code::GetCodeFromTargetAddress
+  // is safe for use during GC where the map might be marked.
+  Code* result = Code::GetCodeFromTargetAddress(target);
    ASSERT(result->is_inline_cache_stub());
    return result;
  }

Modified: branches/bleeding_edge/src/objects-inl.h
==============================================================================
--- branches/bleeding_edge/src/objects-inl.h    (original)
+++ branches/bleeding_edge/src/objects-inl.h    Tue Dec  9 04:53:59 2008
@@ -1877,6 +1877,17 @@
  }


+Code* Code::GetCodeFromTargetAddress(Address address) {
+  HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
+  // GetCodeFromTargetAddress might be called when marking objects during  
mark
+  // sweep. reinterpret_cast is therefore used instead of the more  
appropriate
+  // Code::cast. Code::cast does not work when the object's map is
+  // marked.
+  Code* result = reinterpret_cast<Code*>(code);
+  return result;
+}
+
+
  Object* Map::prototype() {
    return READ_FIELD(this, kPrototypeOffset);
  }

Modified: branches/bleeding_edge/src/objects.h
==============================================================================
--- branches/bleeding_edge/src/objects.h        (original)
+++ branches/bleeding_edge/src/objects.h        Tue Dec  9 04:53:59 2008
@@ -2201,6 +2201,8 @@
    static inline int ExtractArgumentsCountFromFlags(Flags flags);
    static inline Flags RemoveTypeFromFlags(Flags flags);

+  // Convert a target address into a code object.
+  static inline Code* GetCodeFromTargetAddress(Address address);

    // Returns the address of the first instruction.
    inline byte* instruction_start();

Modified: branches/bleeding_edge/test/cctest/test-debug.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-debug.cc    (original)
+++ branches/bleeding_edge/test/cctest/test-debug.cc    Tue Dec  9 04:53:59  
2008
@@ -397,7 +397,7 @@
    CHECK_EQ(mode, it1.it()->rinfo()->rmode());
    if (mode != v8::internal::RelocInfo::JS_RETURN) {
      CHECK_EQ(debug_break,
-             Debug::GetCodeTarget(it1.it()->rinfo()->target_address()));
+         
Code::GetCodeFromTargetAddress(it1.it()->rinfo()->target_address()));
    } else {
      // TODO(1240753): Make the test architecture independent or split
      // parts of the debugger into architecture dependent files.

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to