Index: /branches/watchpoints/level-0/X86/x86-utils.lisp
===================================================================
--- /branches/watchpoints/level-0/X86/x86-utils.lisp	(revision 12884)
+++ /branches/watchpoints/level-0/X86/x86-utils.lisp	(revision 12885)
@@ -445,9 +445,6 @@
   (jmp-subprim .SPmakeu64))
 
-(defx86lapfunction %watch ((uvector arg_z))
+(defx86lapfunction %watch ((thing arg_z))
   (check-nargs 1)
-  ;; This traps on symbols and functions, which have their own tags.
-  ;; This may be undesirable.
-  (trap-unless-lisptag= uvector x8664::tag-misc imm0)
   (movl ($ arch::watch-trap-function-watch) (%l imm0))
   (uuo-watch-trap)
Index: /branches/watchpoints/level-1/x86-trap-support.lisp
===================================================================
--- /branches/watchpoints/level-1/x86-trap-support.lisp	(revision 12884)
+++ /branches/watchpoints/level-1/x86-trap-support.lisp	(revision 12885)
@@ -441,8 +441,8 @@
 					 :object object)
 					nil frame-ptr)
-		  (unwatch ()
-		    :report (lambda (s)
-			      (format s "Unwatch ~s and perform the write." object))
-		    (unwatch (%int-to-object other)))))))))
+		    (unwatch ()
+		      :report (lambda (s)
+				(format s "Unwatch ~s and perform the write." object))
+		      (unwatch object))))))))
           ((= signal #+win32-target 10 #-win32-target #$SIGBUS)
            (if (= code -1)
@@ -456,10 +456,2 @@
                      frame-ptr)))))
   0)
-
-#||
-(defun analyze-faulting-instruction (xp)
-  (let* ((ds (make-x86-disassembly-state
-              :mode-64 #+x8664-target t #+x8632-target nil))
-	 (insn (make-x86-disassembled-instruction
-		:address (indexed-gpr-integer xp rip-register-offset)
-||#
Index: /branches/watchpoints/lib/misc.lisp
===================================================================
--- /branches/watchpoints/lib/misc.lisp	(revision 12884)
+++ /branches/watchpoints/lib/misc.lisp	(revision 12885)
@@ -1046,6 +1046,7 @@
 (defun watch (&optional thing)
   (if thing
-    ;; typecheck thing?
-    (%watch thing)
+    (progn
+      (require-type thing '(or cons (satisfies uvectorp)))
+      (%watch thing))
     (let (result)
       (%map-areas #'(lambda (x) (push x result)) area-watched area-watched)
@@ -1059,5 +1060,7 @@
 		    ;; list while %map-areas iterates over it, but I
 		    ;; think we'll get away with it.
-		    (let ((new (%alloc-misc (uvsize thing) (typecode thing))))
+		    (let ((new (if (uvectorp thing)
+				 (%alloc-misc (uvsize thing) (typecode thing))
+				 (cons nil nil))))
 		      (return-from unwatch (%unwatch thing new)))))
 	      area-watched area-watched))
Index: /branches/watchpoints/lisp-kernel/x86-exceptions.c
===================================================================
--- /branches/watchpoints/lisp-kernel/x86-exceptions.c	(revision 12884)
+++ /branches/watchpoints/lisp-kernel/x86-exceptions.c	(revision 12885)
@@ -827,6 +827,14 @@
       if (a && a->code == AREA_WATCHED && addr < a->high) {
 	/* caught a write to a watched object */
+	LispObj *p = (LispObj *)a->low;
+	LispObj node = *p;
+	unsigned tag_n = fulltag_of(node);
 	LispObj cmain = nrs_CMAIN.vcell;
-	LispObj obj = (LispObj)a->low + fulltag_misc; /* always uvectors */
+	LispObj obj;
+
+	if (immheader_tag_p(tag_n) || nodeheader_tag_p(tag_n))
+	  obj = (LispObj)p + fulltag_misc;
+	else
+	  obj = (LispObj)p + fulltag_cons;
 
 	if ((fulltag_of(cmain) == fulltag_misc) &&
@@ -3706,18 +3714,24 @@
  * Other threads are suspended and pc-lusered.
  *
- * param contains a tagged pointer to a uvector.
+ * param contains a tagged pointer to a uvector or a cons cell
  */
 signed_natural
 watch_object(TCR *tcr, signed_natural param)
 {
-  LispObj uvector = (LispObj)param;
-  LispObj *noderef = (LispObj *)untag(uvector);
-  natural size = uvector_total_size_in_bytes(noderef);
-  area *uvector_area = area_containing((BytePtr)noderef);
-
-  if (uvector_area && uvector_area->code != AREA_WATCHED) {
+  LispObj object = (LispObj)param;
+  unsigned tag = fulltag_of(object);
+  LispObj *noderef = (LispObj *)untag(object);
+  area *object_area = area_containing((BytePtr)noderef);
+  natural size;
+
+  if (tag == fulltag_cons)
+    size = 2 * node_size;
+  else
+    size = uvector_total_size_in_bytes(noderef);
+
+  if (object_area && object_area->code != AREA_WATCHED) {
     area *a = new_watched_area(size);
-    LispObj old = uvector;
-    LispObj new = (LispObj)((natural)a->low + fulltag_misc);
+    LispObj old = object;
+    LispObj new = (LispObj)((natural)a->low + tag);
 
     add_area_holding_area_lock(a);
@@ -3742,4 +3756,5 @@
   ExceptionInformation *xp = tcr->xframe->curr;
   LispObj old = xpGPR(xp, Iarg_y);
+  unsigned tag = fulltag_of(old);
   LispObj new = xpGPR(xp, Iarg_z);
   LispObj *oldnode = (LispObj *)untag(old);
@@ -3748,5 +3763,10 @@
 
   if (a && a->code == AREA_WATCHED) {
-    natural size = uvector_total_size_in_bytes(oldnode);
+    natural size;
+
+    if (tag == fulltag_cons)
+      size = 2 * node_size;
+    else
+      size = uvector_total_size_in_bytes(oldnode);
 
     memcpy(newnode, oldnode, size);
@@ -3765,9 +3785,9 @@
 {
   LispObj selector = xpGPR(xp,Iimm0);
-  LispObj uvector = xpGPR(xp, Iarg_z);
+  LispObj object = xpGPR(xp, Iarg_z);
   
   switch (selector) {
     case WATCH_TRAP_FUNCTION_WATCH:
-      gc_like_from_xp(xp, watch_object, uvector);
+      gc_like_from_xp(xp, watch_object, object);
       break;
     case WATCH_TRAP_FUNCTION_UNWATCH:
