[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

mjs mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:07:29 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 5a7a3882b32e24454b58d12066e93e17fde8fe53
Author: mjs <mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sun Nov 24 00:04:08 2002 +0000

    	Numerous collector changes for a net gain of 3% on JS ibench:
    
    	- Replaced per-block bitmap with free list.
    	- Increased number of empty blocks kept around to 2.
    	- Doubled block size.
    	- When scanning heap in collector, skip scanning the rest of a
    	block as soon as we see as many live cells as the the number of
    	used cells it had originally.
    
    	Also the following collector changes unrelated to performance:
    
    	- Made constants `const int' instead of `static const int'.
    	- Miscellaneous code cleanup.
    
            * kjs/collector.cpp:
    
    	- Added debugging mode enabled by defining DEBUG_GC which asserts
    	when a destroyed ValueImp
    
            * kjs/internal.cpp:
            (ContextImp::mark):
            * kjs/value.cpp:
            (Value::Value):
            * kjs/value.h:
    	* kjs/config.h:
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@2845 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 4e5592e..a83a29b 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,3 +1,31 @@
+2002-11-23  Maciej Stachowiak  <mjs at apple.com>
+
+	Numerous collector changes for a net gain of 3% on JS ibench:
+
+	- Replaced per-block bitmap with free list.
+	- Increased number of empty blocks kept around to 2.
+	- Doubled block size.
+	- When scanning heap in collector, skip scanning the rest of a
+	block as soon as we see as many live cells as the the number of
+	used cells it had originally.
+
+	Also the following collector changes unrelated to performance:
+
+	- Made constants `const int' instead of `static const int'.
+	- Miscellaneous code cleanup.
+		
+        * kjs/collector.cpp:
+
+	- Added debugging mode enabled by defining DEBUG_GC which asserts
+	when a destroyed ValueImp
+
+        * kjs/internal.cpp:
+        (ContextImp::mark):
+        * kjs/value.cpp:
+        (Value::Value):
+        * kjs/value.h:
+	* kjs/config.h:
+	
 2002-11-22  Darin Adler  <darin at apple.com>
 
 	- replaced List class with a vector rather than a linked list, changed it
diff --git a/JavaScriptCore/ChangeLog-2002-12-03 b/JavaScriptCore/ChangeLog-2002-12-03
index 4e5592e..a83a29b 100644
--- a/JavaScriptCore/ChangeLog-2002-12-03
+++ b/JavaScriptCore/ChangeLog-2002-12-03
@@ -1,3 +1,31 @@
+2002-11-23  Maciej Stachowiak  <mjs at apple.com>
+
+	Numerous collector changes for a net gain of 3% on JS ibench:
+
+	- Replaced per-block bitmap with free list.
+	- Increased number of empty blocks kept around to 2.
+	- Doubled block size.
+	- When scanning heap in collector, skip scanning the rest of a
+	block as soon as we see as many live cells as the the number of
+	used cells it had originally.
+
+	Also the following collector changes unrelated to performance:
+
+	- Made constants `const int' instead of `static const int'.
+	- Miscellaneous code cleanup.
+		
+        * kjs/collector.cpp:
+
+	- Added debugging mode enabled by defining DEBUG_GC which asserts
+	when a destroyed ValueImp
+
+        * kjs/internal.cpp:
+        (ContextImp::mark):
+        * kjs/value.cpp:
+        (Value::Value):
+        * kjs/value.h:
+	* kjs/config.h:
+	
 2002-11-22  Darin Adler  <darin at apple.com>
 
 	- replaced List class with a vector rather than a linked list, changed it
diff --git a/JavaScriptCore/ChangeLog-2003-10-25 b/JavaScriptCore/ChangeLog-2003-10-25
index 4e5592e..a83a29b 100644
--- a/JavaScriptCore/ChangeLog-2003-10-25
+++ b/JavaScriptCore/ChangeLog-2003-10-25
@@ -1,3 +1,31 @@
+2002-11-23  Maciej Stachowiak  <mjs at apple.com>
+
+	Numerous collector changes for a net gain of 3% on JS ibench:
+
+	- Replaced per-block bitmap with free list.
+	- Increased number of empty blocks kept around to 2.
+	- Doubled block size.
+	- When scanning heap in collector, skip scanning the rest of a
+	block as soon as we see as many live cells as the the number of
+	used cells it had originally.
+
+	Also the following collector changes unrelated to performance:
+
+	- Made constants `const int' instead of `static const int'.
+	- Miscellaneous code cleanup.
+		
+        * kjs/collector.cpp:
+
+	- Added debugging mode enabled by defining DEBUG_GC which asserts
+	when a destroyed ValueImp
+
+        * kjs/internal.cpp:
+        (ContextImp::mark):
+        * kjs/value.cpp:
+        (Value::Value):
+        * kjs/value.h:
+	* kjs/config.h:
+	
 2002-11-22  Darin Adler  <darin at apple.com>
 
 	- replaced List class with a vector rather than a linked list, changed it
diff --git a/JavaScriptCore/kjs/collector.cpp b/JavaScriptCore/kjs/collector.cpp
index 7f61064..8869ac0 100644
--- a/JavaScriptCore/kjs/collector.cpp
+++ b/JavaScriptCore/kjs/collector.cpp
@@ -1,7 +1,7 @@
 // -*- c-basic-offset: 2 -*-
 /*
  *  This file is part of the KDE libraries
- *  Copyright (C) 2002 Apple Computer, Inc.
+ *  Copyright (C) 2002 Apple Computer, Inc
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -29,42 +29,50 @@
 #include <cxxabi.h>
 #endif
 
+#include <collector.h>
+#include <value.h>
+#include <internal.h>
+
 namespace KJS {
 
 // tunable parameters
-static const int CELL_SIZE = 56;
-static const int BLOCK_SIZE = (4 * 4096);
-static const int SPARE_EMPTY_BLOCKS = 1;
-static const int MIN_ARRAY_SIZE = 14;
-static const int GROWTH_FACTOR = 2;
-static const int LOW_WATER_FACTOR = 4;
+const int MINIMUM_CELL_SIZE = 56;
+const int BLOCK_SIZE = (8 * 4096);
+const int SPARE_EMPTY_BLOCKS = 2;
+const int MIN_ARRAY_SIZE = 14;
+const int GROWTH_FACTOR = 2;
+const int LOW_WATER_FACTOR = 4;
+const int ALLOCATIONS_PER_COLLECTION = 1000;
 
 // derived constants
-static const int WORD_SIZE = sizeof(uint32_t);
-static const int BITS_PER_WORD = WORD_SIZE * 8;
-static const uint32_t ALL_BITS_ON = 0xffffffff;
-static const int CELLS_PER_BLOCK = ((BLOCK_SIZE * 8 - 32) / (CELL_SIZE * 8 + 1));
-static const int BITMAP_SIZE = (CELLS_PER_BLOCK / BITS_PER_WORD) + (CELLS_PER_BLOCK % BITS_PER_WORD != 0 ? 1 : 0);
+const int CELL_ARRAY_LENGTH = (MINIMUM_CELL_SIZE / sizeof(double)) + (MINIMUM_CELL_SIZE % sizeof(double) != 0 ? sizeof(double) : 0);
+const int CELL_SIZE = CELL_ARRAY_LENGTH * sizeof(double);
+const int CELLS_PER_BLOCK = ((BLOCK_SIZE * 8 - sizeof(int32_t) * 8 - sizeof(void *) * 8) / (CELL_SIZE * 8));
+
 
 
 struct CollectorCell {
-  char memory[CELL_SIZE];
+  union {
+    double memory[CELL_ARRAY_LENGTH];
+    struct {
+      void *zeroIfFree;
+      CollectorCell *next;
+    } freeCell;
+  } u;
 };
 
-static const int ALLOCATIONS_PER_COLLECTION = 1000;
 
 struct CollectorBlock {
-  CollectorBlock() : usedCells(0) { memset(bitmap, 0, BITMAP_SIZE * WORD_SIZE); }
-  
-  uint32_t bitmap[BITMAP_SIZE];
-  int32_t usedCells;
   CollectorCell cells[CELLS_PER_BLOCK];
+  int32_t usedCells;
+  CollectorCell *freeList;
 };
 
 struct CollectorHeap {
   CollectorBlock **blocks;
   int numBlocks;
   int usedBlocks;
+  int firstBlockWithPossibleSpace;
   
   CollectorCell **oversizeCells;
   int numOversizeCells;
@@ -74,19 +82,19 @@ struct CollectorHeap {
   int numAllocationsSinceLastCollect;
 };
 
-static CollectorHeap heap = {NULL, 0, 0, NULL, 0, 0, 0, 0};
+static CollectorHeap heap = {NULL, 0, 0, 0, NULL, 0, 0, 0, 0};
 
 bool Collector::memoryFull = false;
 
-
 void* Collector::allocate(size_t s)
 {
   if (s == 0)
     return 0L;
   
   // collect if needed
-  if (++heap.numAllocationsSinceLastCollect >= ALLOCATIONS_PER_COLLECTION)
+  if (++heap.numAllocationsSinceLastCollect >= ALLOCATIONS_PER_COLLECTION) {
     collect();
+  }
   
   if (s > (unsigned)CELL_SIZE) {
     // oversize allocator
@@ -108,13 +116,15 @@ void* Collector::allocate(size_t s)
   
   CollectorBlock *targetBlock = NULL;
   
-  // try to find free space in an existing block
-  for (int i = 0; i < heap.usedBlocks; i++) {
+  int i;
+  for (i = heap.firstBlockWithPossibleSpace; i < heap.usedBlocks; i++) {
     if (heap.blocks[i]->usedCells < CELLS_PER_BLOCK) {
       targetBlock = heap.blocks[i];
       break;
     }
   }
+
+  heap.firstBlockWithPossibleSpace = i;
   
   if (targetBlock == NULL) {
     // didn't find one, need to allocate a new block
@@ -124,36 +134,30 @@ void* Collector::allocate(size_t s)
       heap.blocks = (CollectorBlock **)realloc(heap.blocks, heap.numBlocks * sizeof(CollectorBlock *));
     }
     
-    targetBlock = new CollectorBlock();
+    targetBlock = (CollectorBlock *)calloc(1, sizeof(CollectorBlock));
+    targetBlock->freeList = targetBlock->cells;
     heap.blocks[heap.usedBlocks] = targetBlock;
     heap.usedBlocks++;
   }
   
-  // find a free spot in the block
-  for (int wordInBitmap = 0; wordInBitmap < BITMAP_SIZE; wordInBitmap++) {
-    uint32_t word = targetBlock->bitmap[wordInBitmap];
-    if (word == ALL_BITS_ON) {
-      continue;
-    }
-    for (int bitInWord = 0; bitInWord < BITS_PER_WORD; bitInWord++) {
-      if ((word & (1 << bitInWord)) == 0) {
-	int cellPos = BITS_PER_WORD * wordInBitmap + bitInWord;
-	if (cellPos < CELLS_PER_BLOCK) {
-	  targetBlock->bitmap[wordInBitmap] |= (1 << bitInWord);
-	  targetBlock->usedCells++;
-          heap.numLiveObjects++;
-
-	  ((ValueImp *)(targetBlock->cells + cellPos))->_flags = 0;
-	  return (void *)(targetBlock->cells + cellPos);
-	}
-      }
-    }
+  // find a free spot in the block and detach it from the free list
+  CollectorCell *newCell = targetBlock->freeList;
+
+  if (newCell->u.freeCell.next != NULL) {
+    targetBlock->freeList = newCell->u.freeCell.next;
+  } else if (targetBlock->usedCells == (CELLS_PER_BLOCK - 1)) {
+    // last cell in this block
+    targetBlock->freeList = NULL;
+  } else {
+    // all next pointers are initially 0, meaning "next cell"
+    targetBlock->freeList = newCell + 1;
   }
-  // unreachable, if the free count wasn't 0 there has to be a free
-  // cell in the block
-  assert(false);
 
-  return false;
+  targetBlock->usedCells++;
+  heap.numLiveObjects++;
+
+  ((ValueImp *)(newCell))->_flags = 0;
+  return (void *)(newCell);
 }
 
 bool Collector::collect()
@@ -173,18 +177,28 @@ bool Collector::collect()
   
   // mark any other objects that we wouldn't delete anyway
   for (int block = 0; block < heap.usedBlocks; block++) {
-    for (int wordInBitmap = 0; wordInBitmap < BITMAP_SIZE; wordInBitmap++) {
-      uint32_t word = heap.blocks[block]->bitmap[wordInBitmap];
-      for (int bitInWord = 0; bitInWord < BITS_PER_WORD; bitInWord++) {
-	ValueImp *imp = (ValueImp *)(heap.blocks[block]->cells + BITS_PER_WORD * wordInBitmap + bitInWord);
+
+    int minimumCellsToProcess = heap.blocks[block]->usedCells;
+    CollectorBlock *curBlock = heap.blocks[block];
+
+    for (int cell = 0; cell < CELLS_PER_BLOCK; cell++) {
+      if (minimumCellsToProcess < cell) {
+	goto skip_block_mark;
+      }
+	
+      ValueImp *imp = (ValueImp *)(curBlock->cells + cell);
+
+      if (((CollectorCell *)imp)->u.freeCell.zeroIfFree != 0) {
 	
-	if ((word & (1 << bitInWord)) &&
-	    (imp->_flags & (ValueImp::VI_CREATED|ValueImp::VI_MARKED)) == ValueImp::VI_CREATED &&
+	if ((imp->_flags & (ValueImp::VI_CREATED|ValueImp::VI_MARKED)) == ValueImp::VI_CREATED &&
 	    ((imp->_flags & ValueImp::VI_GCALLOWED) == 0 || imp->refcount != 0)) {
 	  imp->mark();
 	}
+      } else {
+	minimumCellsToProcess++;
       }
     }
+  skip_block_mark: ;
   }
   
   for (int cell = 0; cell < heap.usedOversizeCells; cell++) {
@@ -200,27 +214,41 @@ bool Collector::collect()
   int emptyBlocks = 0;
 
   for (int block = 0; block < heap.usedBlocks; block++) {
-    for (int wordInBitmap = 0; wordInBitmap < BITMAP_SIZE; wordInBitmap++) {
-      uint32_t word = heap.blocks[block]->bitmap[wordInBitmap];
-      for (int bitInWord = 0; bitInWord < BITS_PER_WORD; bitInWord++) {
-	
-	if (word & (1 << bitInWord)) {
-	ValueImp *imp = (ValueImp *)(heap.blocks[block]->cells + BITS_PER_WORD * wordInBitmap + bitInWord);
-	  if (!imp->refcount && imp->_flags == (ValueImp::VI_GCALLOWED | ValueImp::VI_CREATED)) {
-	    //fprintf( stderr, "Collector::deleting ValueImp %p (%s)\n", (void*)imp, typeid(*imp).name());
-	    // emulate destructing part of 'operator delete()'
-	    imp->~ValueImp();
-	    heap.blocks[block]->bitmap[wordInBitmap] &= ~(1 << bitInWord);
-	    heap.blocks[block]->usedCells--;
-	    heap.numLiveObjects--;
-	    deleted = true;
-	  } else {
-	    imp->_flags &= ~ValueImp::VI_MARKED;
-	  }
+    CollectorBlock *curBlock = heap.blocks[block];
+
+    int minimumCellsToProcess = curBlock->usedCells;
+
+    for (int cell = 0; cell < CELLS_PER_BLOCK; cell++) {
+      if (minimumCellsToProcess < cell) {
+	goto skip_block_sweep;
+      }
+
+      ValueImp *imp = (ValueImp *)(curBlock->cells + cell);
+
+      if (((CollectorCell *)imp)->u.freeCell.zeroIfFree != 0) {
+	if (!imp->refcount && imp->_flags == (ValueImp::VI_GCALLOWED | ValueImp::VI_CREATED)) {
+	  //fprintf( stderr, "Collector::deleting ValueImp %p (%s)\n", (void*)imp, typeid(*imp).name());
+	  // emulate destructing part of 'operator delete()'
+	  imp->~ValueImp();
+	  curBlock->usedCells--;
+	  heap.numLiveObjects--;
+	  deleted = true;
+
+	  // put it on the free list
+	  ((CollectorCell *)imp)->u.freeCell.zeroIfFree = 0;
+	  ((CollectorCell *)imp)->u.freeCell.next = curBlock->freeList;
+	  curBlock->freeList = (CollectorCell *)imp;
+
+	} else {
+	  imp->_flags &= ~ValueImp::VI_MARKED;
 	}
+      } else {
+	minimumCellsToProcess++;
       }
     }
 
+  skip_block_sweep:
+
     if (heap.blocks[block]->usedCells == 0) {
       emptyBlocks++;
       if (emptyBlocks > SPARE_EMPTY_BLOCKS) {
@@ -239,6 +267,9 @@ bool Collector::collect()
     }
   }
 
+  if (deleted) {
+    heap.firstBlockWithPossibleSpace = 0;
+  }
   
   int cell = 0;
   while (cell < heap.usedOversizeCells) {
@@ -268,9 +299,6 @@ bool Collector::collect()
     }
   }
   
-  // possibly free some completely empty collector blocks ?
-  // compact array of collector blocks
-  
   heap.numAllocationsSinceLastCollect = 0;
   
   memoryFull = (heap.numLiveObjects >= KJS_MEM_LIMIT);
@@ -308,24 +336,23 @@ int Collector::numGCNotAllowedObjects()
 {
   int count = 0;
   for (int block = 0; block < heap.usedBlocks; block++) {
-    for (int wordInBitmap = 0; wordInBitmap < BITMAP_SIZE; wordInBitmap++) {
-      uint32_t word = heap.blocks[block]->bitmap[wordInBitmap];
-      for (int bitInWord = 0; bitInWord < BITS_PER_WORD; bitInWord++) {
-	ValueImp *imp = (ValueImp *)(heap.blocks[block]->cells + BITS_PER_WORD * wordInBitmap + bitInWord);
-	
-	if ((word & (1 << bitInWord)) &&
-	    (imp->_flags & ValueImp::VI_GCALLOWED) == 0) {
-	  ++count;
-	}
+    CollectorBlock *curBlock = heap.blocks[block];
+
+    for (int cell = 0; cell < CELLS_PER_BLOCK; cell++) {
+      ValueImp *imp = (ValueImp *)(curBlock->cells + cell);
+      
+      if (((CollectorCell *)imp)->u.freeCell.zeroIfFree != 0 &&
+	  (imp->_flags & ValueImp::VI_GCALLOWED) == 0) {
+	++count;
       }
     }
   }
   
   for (int cell = 0; cell < heap.usedOversizeCells; cell++) {
     ValueImp *imp = (ValueImp *)heap.oversizeCells[cell];
-      if ((imp->_flags & ValueImp::VI_GCALLOWED) == 0) {
-        ++count;
-      }
+    if ((imp->_flags & ValueImp::VI_GCALLOWED) == 0) {
+      ++count;
+    }
   }
 
   return count;
@@ -335,15 +362,14 @@ int Collector::numReferencedObjects()
 {
   int count = 0;
   for (int block = 0; block < heap.usedBlocks; block++) {
-    for (int wordInBitmap = 0; wordInBitmap < BITMAP_SIZE; wordInBitmap++) {
-      uint32_t word = heap.blocks[block]->bitmap[wordInBitmap];
-      for (int bitInWord = 0; bitInWord < BITS_PER_WORD; bitInWord++) {
-	ValueImp *imp = (ValueImp *)(heap.blocks[block]->cells + BITS_PER_WORD * wordInBitmap + bitInWord);
-	
-	if ((word & (1 << bitInWord)) &&
-	    imp->refcount != 0) {
-	  ++count;
-	}
+    CollectorBlock *curBlock = heap.blocks[block];
+
+    for (int cell = 0; cell < CELLS_PER_BLOCK; cell++) {
+      ValueImp *imp = (ValueImp *)(curBlock->cells + cell);
+      
+      if (((CollectorCell *)imp)->u.freeCell.zeroIfFree != 0 &&
+	  imp->refcount != 0) {
+	++count;
       }
     }
   }
@@ -361,24 +387,22 @@ int Collector::numReferencedObjects()
 const void *Collector::rootObjectClasses()
 {
   CFMutableSetRef classes = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
-
+  
   for (int block = 0; block < heap.usedBlocks; block++) {
-    for (int wordInBitmap = 0; wordInBitmap < BITMAP_SIZE; wordInBitmap++) {
-      uint32_t word = heap.blocks[block]->bitmap[wordInBitmap];
-      for (int bitInWord = 0; bitInWord < BITS_PER_WORD; bitInWord++) {
-	ValueImp *imp = (ValueImp *)(heap.blocks[block]->cells + BITS_PER_WORD * wordInBitmap + bitInWord);
+    CollectorBlock *curBlock = heap.blocks[block];
+    for (int cell = 0; cell < CELLS_PER_BLOCK; cell++) {
+      ValueImp *imp = (ValueImp *)(curBlock->cells + cell);
+      
+      if (((CollectorCell *)imp)->u.freeCell.zeroIfFree != 0 &&
+	  ((imp->_flags & ValueImp::VI_GCALLOWED) == 0 || imp->refcount != 0)) {
+	const char *mangled_name = typeid(*imp).name();
+	int status;
+	char *demangled_name = __cxxabiv1::__cxa_demangle (mangled_name, NULL, NULL, &status);
 	
-	if (word & (1 << bitInWord)
-                && ((imp->_flags & ValueImp::VI_GCALLOWED) == 0 || imp->refcount != 0)) {
-	  const char *mangled_name = typeid(*imp).name();
-	  int status;
-	  char *demangled_name = __cxxabiv1::__cxa_demangle (mangled_name, NULL, NULL, &status);
-	  
-	  CFStringRef className = CFStringCreateWithCString(NULL, demangled_name, kCFStringEncodingASCII);
-	  free(demangled_name);
-	  CFSetAddValue(classes, className);
-	  CFRelease(className);
-	}
+	CFStringRef className = CFStringCreateWithCString(NULL, demangled_name, kCFStringEncodingASCII);
+	free(demangled_name);
+	CFSetAddValue(classes, className);
+	CFRelease(className);
       }
     }
   }
@@ -387,17 +411,17 @@ const void *Collector::rootObjectClasses()
     ValueImp *imp = (ValueImp *)heap.oversizeCells[cell];
     
     if ((imp->_flags & ValueImp::VI_GCALLOWED) == 0 || imp->refcount != 0) {
-        const char *mangled_name = typeid(*imp).name();
-        int status;
-        char *demangled_name = __cxxabiv1::__cxa_demangle (mangled_name, NULL, NULL, &status);
-        
-        CFStringRef className = CFStringCreateWithCString(NULL, demangled_name, kCFStringEncodingASCII);
-        free(demangled_name);
-        CFSetAddValue(classes, className);
-        CFRelease(className);
+      const char *mangled_name = typeid(*imp).name();
+      int status;
+      char *demangled_name = __cxxabiv1::__cxa_demangle (mangled_name, NULL, NULL, &status);
+      
+      CFStringRef className = CFStringCreateWithCString(NULL, demangled_name, kCFStringEncodingASCII);
+      free(demangled_name);
+      CFSetAddValue(classes, className);
+      CFRelease(className);
     }
   }
-
+  
   return classes;
 }
 
diff --git a/JavaScriptCore/kjs/config.h b/JavaScriptCore/kjs/config.h
index 0861e99..1aaad86 100644
--- a/JavaScriptCore/kjs/config.h
+++ b/JavaScriptCore/kjs/config.h
@@ -8,3 +8,6 @@
 #ifdef __ppc__
 #define WORDS_BIGENDIAN 1
 #endif
+
+/* define to debug garbage collection */
+#undef DEBUG_COLLECTOR
diff --git a/JavaScriptCore/kjs/internal.cpp b/JavaScriptCore/kjs/internal.cpp
index c930558..f2eab97 100644
--- a/JavaScriptCore/kjs/internal.cpp
+++ b/JavaScriptCore/kjs/internal.cpp
@@ -412,8 +412,12 @@ ContextImp::~ContextImp()
 
 void ContextImp::mark()
 {
-  for (ContextImp *context = this; context; context = context->_callingContext)
+  for (ContextImp *context = this; context; context = context->_callingContext) {
     context->_activationImp.mark();
+#if DEBUG_COLLECTOR
+    context->_activationImp._flags &= ~ValueImp::VI_MARKED;
+#endif
+  }
 }
 
 // ------------------------------ Parser ---------------------------------------
diff --git a/JavaScriptCore/kjs/value.cpp b/JavaScriptCore/kjs/value.cpp
index d0cdf00..e701c49 100644
--- a/JavaScriptCore/kjs/value.cpp
+++ b/JavaScriptCore/kjs/value.cpp
@@ -201,6 +201,10 @@ bool ValueImp::dispatchToUInt32(unsigned& result) const
 Value::Value(ValueImp *v)
 {
   rep = v;
+#if DEBUG_COLLECTOR
+  assert (!(rep && !SimpleNumber::is(rep) && *((uint32_t *)rep) == 0 ));
+  assert (!(rep && !SimpleNumber::is(rep) && rep->_flags & VI_MARKED));
+#endif
   if (v)
   {
     v->ref();
@@ -212,6 +216,10 @@ Value::Value(ValueImp *v)
 Value::Value(const Value &v)
 {
   rep = v.imp();
+#if DEBUG_COLLECTOR
+  assert (!(rep && !SimpleNumber::is(rep) && *((uint32_t *)rep) == 0 ));
+  assert (!(rep && !SimpleNumber::is(rep) && rep->_flags & VI_MARKED));
+#endif
   if (rep)
   {
     rep->ref();
diff --git a/JavaScriptCore/kjs/value.h b/JavaScriptCore/kjs/value.h
index 7d8a9d2..eed8da3 100644
--- a/JavaScriptCore/kjs/value.h
+++ b/JavaScriptCore/kjs/value.h
@@ -89,6 +89,8 @@ namespace KJS {
    */
   class ValueImp {
     friend class Collector;
+    friend class Value;
+    friend class ContextImp;
   public:
     ValueImp();
     virtual ~ValueImp();

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list