summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/ChangeLog7
-rw-r--r--libguile/environments.c6
-rw-r--r--libguile/posix.c46
3 files changed, 30 insertions, 29 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index b16dbb77e..373e4b3a1 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,5 +1,12 @@
2000-11-01 Dirk Herrmann <D.Herrmann@tu-bs.de>
+ * environments.c (obarray_replace, obarray_retrieve,
+ obarray_remove): Don't use '==' to compare SCM objects.
+
+ * posix.c (scm_getgroups): Don't create a redundant string.
+
+2000-11-01 Dirk Herrmann <D.Herrmann@tu-bs.de>
+
* symbols.c (scm_sym2vcell, scm_sym2ovcell_soft,
scm_intern_symbol, scm_unintern_symbol): Symbol objects already
hold their hash values, no need to recompute them.
diff --git a/libguile/environments.c b/libguile/environments.c
index cb366f0fb..ced455be7 100644
--- a/libguile/environments.c
+++ b/libguile/environments.c
@@ -545,7 +545,7 @@ obarray_replace (SCM obarray, SCM symbol, SCM data)
for (lsym = SCM_VELTS (obarray)[hash]; !SCM_NULLP (lsym); lsym = SCM_CDR (lsym))
{
SCM old_entry = SCM_CAR (lsym);
- if (SCM_CAR (old_entry) == symbol)
+ if (SCM_EQ_P (SCM_CAR (old_entry), symbol))
{
SCM_SETCAR (lsym, new_entry);
return old_entry;
@@ -571,7 +571,7 @@ obarray_retrieve (SCM obarray, SCM sym)
for (lsym = SCM_VELTS (obarray)[hash]; !SCM_NULLP (lsym); lsym = SCM_CDR (lsym))
{
SCM entry = SCM_CAR (lsym);
- if (SCM_CAR (entry) == sym)
+ if (SCM_EQ_P (SCM_CAR (entry), sym))
return entry;
}
@@ -596,7 +596,7 @@ obarray_remove (SCM obarray, SCM sym)
lsym = *(lsymp = SCM_CDRLOC (lsym)))
{
SCM entry = SCM_CAR (lsym);
- if (SCM_CAR (entry) == sym)
+ if (SCM_EQ_P (SCM_CAR (entry), sym))
{
*lsymp = SCM_CDR (lsym);
return entry;
diff --git a/libguile/posix.c b/libguile/posix.c
index 623ca2012..8dfd4175e 100644
--- a/libguile/posix.c
+++ b/libguile/posix.c
@@ -205,33 +205,27 @@ SCM_DEFINE (scm_getgroups, "getgroups", 0, 0, 0,
"Returns a vector of integers representing the current supplimentary group IDs.")
#define FUNC_NAME s_scm_getgroups
{
- SCM grps, ans;
- int ngroups = getgroups (0, NULL);
- if (!ngroups)
+ SCM ans;
+ int ngroups;
+ scm_sizet size;
+ GETGROUPS_T *groups;
+
+ ngroups = getgroups (0, NULL);
+ if (ngroups <= 0)
SCM_SYSERROR;
- SCM_NEWCELL(grps);
- SCM_DEFER_INTS;
- {
- GETGROUPS_T *groups;
- int val;
-
- groups = SCM_MUST_MALLOC_TYPE_NUM(GETGROUPS_T,ngroups);
- val = getgroups(ngroups, groups);
- if (val < 0)
- {
- int en = errno;
- scm_must_free((char *)groups);
- errno = en;
- SCM_SYSERROR;
- }
- SCM_SETCHARS(grps, groups); /* set up grps as a GC protect */
- SCM_SETLENGTH(grps, 0L + ngroups * sizeof(GETGROUPS_T), scm_tc7_string);
- ans = scm_make_vector (SCM_MAKINUM(ngroups), SCM_UNDEFINED);
- while (--ngroups >= 0) SCM_VELTS(ans)[ngroups] = SCM_MAKINUM(groups[ngroups]);
- SCM_SETCHARS(grps, groups); /* to make sure grps stays around. */
- SCM_ALLOW_INTS;
- return ans;
- }
+
+ size = ngroups * sizeof (GETGROUPS_T);
+ groups = scm_must_malloc (size, FUNC_NAME);
+ getgroups (ngroups, groups);
+
+ ans = scm_make_vector (SCM_MAKINUM (ngroups), SCM_UNDEFINED);
+ while (--ngroups >= 0)
+ SCM_VELTS (ans) [ngroups] = SCM_MAKINUM (groups [ngroups]);
+
+ scm_must_free (groups);
+ scm_done_free (size);
+
+ return ans;
}
#undef FUNC_NAME
#endif