Use these instead of SCM_LENGTH.
-** New macros: SCM_SET_CONTINUATION_LENGTH, SCM_SET_VECTOR_LENGTH
+** New macros: SCM_SET_CONTINUATION_LENGTH, SCM_SET_STRING_LENGTH,
+SCM_SET_SYMBOL_LENGTH, SCM_SET_VECTOR_LENGTH, SCM_SET_UVECTOR_LENGTH,
+SCM_SET_BITVECTOR_LENGTH
Use these instead of SCM_SETLENGTH
SCM_VALIDATE_NULLORROSTRING_COPY, SCM_ROLENGTH, SCM_LENGTH, SCM_HUGE_LENGTH,
SCM_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET, SCM_COERCE_SUBSTR,
SCM_ROSTRINGP, SCM_RWSTRINGP, SCM_VALIDATE_RWSTRING, SCM_ROCHARS,
-SCM_ROUCHARS
+SCM_ROUCHARS, SCM_SETLENGTH
Use SCM_ASSERT_RANGE or SCM_VALIDATE_XXX_RANGE instead of SCM_OUTOFRANGE.
Use scm_memory_error instead of SCM_NALLOC.
Use SCM_VALIDATE_STRING instead of SCM_VALIDATE_RWSTRING.
Use SCM_STRING_CHARS instead of SCM_ROCHARS.
Use SCM_STRING_UCHARS instead of SCM_ROUCHARS.
+Use a type specific setter macro instead of SCM_SETLENGTH.
** Removed function: scm_struct_init
SCM_VALIDATE_ROSTRING_COPY, SCM_VALIDATE_NULLORROSTRING_COPY, SCM_ROLENGTH,
SCM_LENGTH, SCM_HUGE_LENGTH, SCM_SUBSTRP, SCM_SUBSTR_STR, SCM_SUBSTR_OFFSET,
SCM_COERCE_SUBSTR, SCM_ROSTRINGP, SCM_RWSTRINGP, SCM_VALIDATE_RWSTRING,
- SCM_ROCHARS, SCM_ROUCHARS
+ SCM_ROCHARS, SCM_ROUCHARS, SCM_SETLENGTH
- remove scm_vector_set_length_x
- remove function scm_call_catching_errors
(replaced by catch functions from throw.[ch])
+2000-11-22 Dirk Herrmann <D.Herrmann@tu-bs.de>
+
+ * gc.c (scm_gc_sweep), unif.c (scm_make_uve): Don't allocate or
+ free memory for empty bitvectors.
+
+ * gh_data.c (makvect), strings.c (scm_makstr, scm_take_str),
+ symbols.c (scm_intern_obarray_soft,
+ scm_sysintern0_no_module_lookup), unif.c (scm_make_uve): Use
+ appropriate SCM_SET_<type>_LENGTH macro instead of SCM_SETLENGTH.
+
+ * strings.h (SCM_SET_STRING_LENGTH), symbols.h
+ (SCM_SET_SYMBOL_LENGTH), unif.h (SCM_SET_UVECTOR_LENGTH,
+ SCM_SET_BITVECTOR_LENGTH): Added.
+
+ * symbols.h (SCM_SETLENGTH): Deprecated.
+
2000-11-22 Dirk Herrmann <D.Herrmann@tu-bs.de>
* continuations.c (scm_make_cont): Use
#endif
#ifdef HAVE_ARRAYS
case scm_tc7_bvect:
- m += sizeof (long) * ((SCM_BITVECTOR_LENGTH (scmptr) + SCM_LONG_BIT - 1) / SCM_LONG_BIT);
- scm_must_free (SCM_BITVECTOR_BASE (scmptr));
+ {
+ unsigned long int length = SCM_BITVECTOR_LENGTH (scmptr);
+ if (length > 0)
+ {
+ m += sizeof (long) * ((length + SCM_LONG_BIT - 1) / SCM_LONG_BIT);
+ scm_must_free (SCM_BITVECTOR_BASE (scmptr));
+ }
+ }
break;
case scm_tc7_byvect:
case scm_tc7_ivect:
SCM_NEWCELL (ans);
SCM_DEFER_INTS;
SCM_SETCHARS (ans, m);
- SCM_SETLENGTH (ans, len, type);
+ SCM_SET_UVECTOR_LENGTH (ans, len, type);
SCM_ALLOW_INTS;
return ans;
}
mem[len] = 0;
SCM_NEWCELL (s);
SCM_SETCHARS (s, mem);
- SCM_SETLENGTH (s, len, scm_tc7_string);
+ SCM_SET_STRING_LENGTH (s, len);
return s;
}
SCM answer;
SCM_NEWCELL (answer);
SCM_DEFER_INTS;
- SCM_SETLENGTH (answer, len, scm_tc7_string);
+ SCM_SET_STRING_LENGTH (answer, len);
scm_done_malloc (len + 1);
SCM_SETCHARS (answer, s);
SCM_ALLOW_INTS;
#define SCM_STRING_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x)))
#endif
#define SCM_STRING_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
+#define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), ((l) << 8) + scm_tc7_string))
#define SCM_STRING_COERCE_0TERMINATION_X(x) \
{ if (SCM_NIMP (x) && (SCM_TYP7 (x) == scm_tc7_substring)) \
SCM_SETCHARS (lsym, duplicate_string (name, len));
SCM_SET_SYMBOL_HASH (lsym, raw_hash);
SCM_SET_PROP_SLOTS (lsym, scm_cons (SCM_BOOL_F, SCM_EOL));
- SCM_SETLENGTH (lsym, (long) len, scm_tc7_symbol);
+ SCM_SET_SYMBOL_LENGTH (lsym, (long) len);
if (SCM_FALSEP (obarray))
{
SCM_SETCHARS (lsym, name);
SCM_SET_SYMBOL_HASH (lsym, raw_hash);
SCM_SET_PROP_SLOTS (lsym, scm_cons (SCM_BOOL_F, SCM_EOL));
- SCM_SETLENGTH (lsym, (long) len, scm_tc7_symbol);
+ SCM_SET_SYMBOL_LENGTH (lsym, (long) len);
lsym = scm_cons (lsym, SCM_UNDEFINED);
SCM_VELTS (scm_symhash)[hash] = scm_cons (lsym, SCM_VELTS (scm_symhash)[hash]);
#define SCM_SYMBOL_UCHARS(x) ((unsigned char *) (SCM_CELL_WORD_1 (x)))
#define SCM_SYMBOL_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x)))
#define SCM_SYMBOL_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
+#define SCM_SET_SYMBOL_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), ((l) << 8) + scm_tc7_symbol))
#define SCM_LENGTH_MAX (0xffffffL)
-#define SCM_SETLENGTH(x, v, t) (SCM_SET_CELL_WORD_0 ((x), ((v) << 8) + (t)))
#define SCM_SETCHARS(x, v) (SCM_SET_CELL_WORD_1 ((x), (scm_bits_t) (v)))
#define SCM_SUBSTR_STR(x) (SCM_CDDR (x))
#define SCM_SUBSTR_OFFSET(x) (SCM_CADR (x))
#define SCM_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
+#define SCM_SETLENGTH(x, v, t) (SCM_SET_CELL_WORD_0 ((x), ((v) << 8) + (t)))
#define SCM_ROSTRINGP(x) (SCM_NIMP(x) && ((SCM_TYP7S(x)==scm_tc7_string) \
|| (SCM_TYP7(x) == scm_tc7_symbol)))
#define SCM_ROLENGTH(x) SCM_LENGTH (x)
if (SCM_EQ_P (prot, SCM_BOOL_T))
{
- i = sizeof (long) * ((k + SCM_LONG_BIT - 1) / SCM_LONG_BIT);
- type = scm_tc7_bvect;
+ SCM_NEWCELL (v);
+ if (k > 0)
+ {
+ i = sizeof (long) * ((k + SCM_LONG_BIT - 1) / SCM_LONG_BIT);
+ SCM_SETCHARS (v, (char *) scm_must_malloc (i, "vector"));
+ SCM_SET_BITVECTOR_LENGTH (v, k);
+ }
+ else
+ {
+ SCM_SETCHARS (v, 0);
+ SCM_SET_BITVECTOR_LENGTH (v, 0);
+ }
+ return v;
}
else if (SCM_CHARP (prot) && (SCM_CHAR (prot) == '\0'))
{
else if (SCM_CHARP (prot))
{
i = sizeof (char) * k;
- type = scm_tc7_string;
+ return scm_makstr (i, 0);
}
else if (SCM_INUMP (prot))
{
SCM_NEWCELL (v);
SCM_DEFER_INTS;
SCM_SETCHARS (v, (char *) scm_must_malloc (i ? i : 1, "vector"));
- SCM_SETLENGTH (v, k, type);
+ SCM_SET_UVECTOR_LENGTH (v, k, type);
SCM_ALLOW_INTS;
return v;
}
#define SCM_UVECTOR_BASE(x) ((void *) (SCM_CELL_WORD_1 (x)))
#define SCM_UVECTOR_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
+#define SCM_SET_UVECTOR_LENGTH(v, l, t) (SCM_SET_CELL_WORD_0 ((v), ((l) << 8) + (t)))
#define SCM_BITVECTOR_P(x) (!SCM_IMP (x) && (SCM_TYP7 (x) == scm_tc7_bvect))
#define SCM_BITVECTOR_BASE(x) ((void *) (SCM_CELL_WORD_1 (x)))
#define SCM_BITVECTOR_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
+#define SCM_SET_BITVECTOR_LENGTH(v, l) (SCM_SET_CELL_WORD_0 ((v), ((l) << 8) + scm_tc7_bvect))
\f