Index: /trunk/Include/api_system.sbp
===================================================================
--- /trunk/Include/api_system.sbp	(revision 368)
+++ /trunk/Include/api_system.sbp	(revision 369)
@@ -680,4 +680,5 @@
 Declare Function HeapReAlloc Lib "kernel32" (hHeap As HANDLE, dwFlags As DWord, lpMem As VoidPtr, dwBytes As SIZE_T) As VoidPtr
 Declare Function HeapSize Lib "kernel32" (hHeap As HANDLE, dwFlags As DWord, lpMem As VoidPtr) As SIZE_T
+Declare Function HeapValidate Lib "kernel32" (hHeap As HANDLE, dwFlags As DWord, lpMem As VoidPtr) As BOOL
 Declare Sub InitializeCriticalSection Lib "kernel32" (ByRef CriticalSection As CRITICAL_SECTION)
 Declare Function IsBadReadPtr Lib "kernel32" (lp As VoidPtr, ucb As ULONG_PTR) As BOOL
Index: /trunk/Include/system/gc.sbp
===================================================================
--- /trunk/Include/system/gc.sbp	(revision 368)
+++ /trunk/Include/system/gc.sbp	(revision 369)
@@ -32,4 +32,6 @@
 Class _System_CGarbageCollection
 
+	hHeap As HANDLE								' GC用のヒープ
+
 	pMemoryObjects As *_System_MemoryObject		' メモリオブジェクト
 	countOfMemoryObjects As Long				' 管理するメモリオブジェクトの個数
@@ -38,4 +40,7 @@
 
 	isSweeping As Boolean	' スウィープ中かどうか
+
+	minPtr As ULONG_PTR
+	maxPtr As ULONG_PTR
 
 	' クリティカルセクション
@@ -123,4 +128,6 @@
 		)
 
+		hHeap = HeapCreate( 0, 0, 0 )
+
 		pMemoryObjects = _System_calloc( 1 )
 		countOfMemoryObjects=0
@@ -135,4 +142,7 @@
 		' スウィープ中かどうか
 		isSweeping = False
+
+		minPtr = &HFFFFFFFFFFFFFFFF As ULONG_PTR
+		maxPtr = 0
 
 		'クリティカルセッションを生成
@@ -249,4 +259,11 @@
 			pMemoryObjects[countOfMemoryObjects].generationCount = 0
 
+			If minPtr > new_ptr As ULONG_PTR Then
+				minPtr = new_ptr As ULONG_PTR
+			End If
+			If maxPtr < ( new_ptr + size ) As ULONG_PTR Then
+				maxPtr = ( new_ptr + size ) As ULONG_PTR
+			End If
+
 			countOfMemoryObjects++
 		LeaveCriticalSection(CriticalSection)
@@ -277,5 +294,5 @@
 
 		' 実際のメモリバッファはインデックスの分だけ多めに確保する
-		Dim ptr = HeapAlloc( _System_hProcessHeap, dwFlags, size + SizeOf( LONG_PTR ) ) + SizeOf( LONG_PTR )
+		Dim ptr = HeapAlloc( hHeap, dwFlags, size + SizeOf( LONG_PTR ) ) + SizeOf( LONG_PTR )
 
 		' 管理対象のメモリオブジェクトとして追加
@@ -302,5 +319,12 @@
 
 			pTempMemoryObject->size = size
-			pTempMemoryObject->ptr = HeapReAlloc( _System_hProcessHeap, HEAP_ZERO_MEMORY, pTempMemoryObject->ptr - SizeOf(LONG_PTR), size + SizeOf(LONG_PTR) ) + SizeOf(LONG_PTR)
+			pTempMemoryObject->ptr = HeapReAlloc( hHeap, HEAP_ZERO_MEMORY, pTempMemoryObject->ptr - SizeOf(LONG_PTR), size + SizeOf(LONG_PTR) ) + SizeOf(LONG_PTR)
+
+			If minPtr > pTempMemoryObject->ptr As ULONG_PTR Then
+				minPtr = pTempMemoryObject->ptr As ULONG_PTR
+			End If
+			If maxPtr < ( pTempMemoryObject->ptr + size ) As ULONG_PTR Then
+				maxPtr = ( pTempMemoryObject->ptr + size ) As ULONG_PTR
+			End If
 
 		LeaveCriticalSection(CriticalSection)
@@ -324,5 +348,5 @@
 				iAllSize -= pTempMemoryObject->size
 
-				HeapFree( _System_hProcessHeap, 0, pTempMemoryObject->ptr - SizeOf(LONG_PTR) )
+				HeapFree( hHeap, 0, pTempMemoryObject->ptr - SizeOf(LONG_PTR) )
 				pTempMemoryObject->ptr = NULL
 				pTempMemoryObject->size = 0
@@ -387,4 +411,7 @@
 	Function HitTest(pSample As VoidPtr) As Long
 		If pSample = NULL Then
+			Return -1
+		End If
+		If not( minPtr <= pSample and pSample <= maxPtr ) Then
 			Return -1
 		End If
@@ -628,5 +655,5 @@
 
 		' マークリストを生成
-		Dim pbMark = HeapAlloc(_System_hProcessHeap,HEAP_ZERO_MEMORY,countOfMemoryObjects*SizeOf(Byte)) As *Byte
+		Dim pbMark = _System_calloc(countOfMemoryObjects*SizeOf(Byte)) As *Byte
 
 		' グローバル領域をルートに指定してスキャン
@@ -649,5 +676,5 @@
 
 		'マークリストを解放
-		HeapFree(_System_hProcessHeap,0,pbMark)
+		_System_free(pbMark)
 
 		If iBackAllSize <= iAllSize * 2 Then
