for (retval =0, i = cell_min; i <= cell_max && retval == 0; i++)
          {
            Emchar ch = DECODE_CHAR (range->charset, (range->row << 8) | i);
-           Lisp_Object val
-             = get_byte_table (get_byte_table
-                               (get_byte_table
-                                (get_byte_table
-                                 (ct->table,
-                                  (unsigned char)(ch >> 24)),
-                                 (unsigned char) (ch >> 16)),
-                                (unsigned char)  (ch >> 8)),
-                               (unsigned char)    ch);
-
-           if (!UNBOUNDP (val))
+
+           if ( charset_code_point (range->charset, ch) >= 0 )
              {
+               Lisp_Object val
+                 = get_byte_table (get_byte_table
+                                   (get_byte_table
+                                    (get_byte_table
+                                     (ct->table,
+                                      (unsigned char)(ch >> 24)),
+                                     (unsigned char) (ch >> 16)),
+                                    (unsigned char)  (ch >> 8)),
+                                   (unsigned char)    ch);
+
+               if (UNBOUNDP (val))
+                 val = ct->default_value;
                rainj.ch = ch;
                retval = (fn) (&rainj, val, arg);
              }