summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-08-20 20:07:57 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-08-20 20:07:57 -0700
commit607f0d271211e37d96ce7ba50a3f69372c000779 (patch)
treeff6f9a5220fbe2ae2f82d8675b3e3840a51806a1 /lib.c
parenta38d8cad117770db020c470adc3397da072aab6d (diff)
downloadtxr-607f0d271211e37d96ce7ba50a3f69372c000779.tar.gz
txr-607f0d271211e37d96ce7ba50a3f69372c000779.tar.bz2
txr-607f0d271211e37d96ce7ba50a3f69372c000779.zip
lib: streamline interning slightly.
We get rid of some defaulting and error checks from interning. This saves a few cycles on startup in the large number of intern calls that are performed. * eval.c (eval_init): Wire the intern intrinsic to the new intern_intrinsic function rather than intern. * lib.c (intern): Remove package lookup and error check on str argument. (intern_intrinsic): New function, which has the package lookup and error check. (intern_fallback): Remove package lookup and error check. * lib.h (intern_intrinsic): Declared. * txr.c (txr_main): Fix one instance of an intern call that relies on defaulting of the second argument, by passing cur_package.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/lib.c b/lib.c
index e2683245..9d40f21c 100644
--- a/lib.c
+++ b/lib.c
@@ -5393,17 +5393,11 @@ val find_symbol_fb(val name, val package_in, val notfound_val_in)
return default_null_arg(notfound_val_in);
}
-val intern(val str, val package_in)
+val intern(val str, val package)
{
val self = lit("intern");
val new_p;
- loc place;
- val package = get_package(self, package_in, t);
-
- if (!stringp(str))
- uw_throwf(error_s, lit("~a: name ~s isn't a string"), self, str, nao);
-
- place = gethash_l(self, package->pk.symhash, str, mkcloc(new_p));
+ loc place = gethash_l(self, package->pk.symhash, str, mkcloc(new_p));
if (!new_p) {
return deref(place);
@@ -5414,6 +5408,17 @@ val intern(val str, val package_in)
}
}
+val intern_intrinsic(val str, val package_in)
+{
+ val self = lit("intern");
+ val package = get_package(self, package_in, t);
+
+ if (!stringp(str))
+ uw_throwf(error_s, lit("~a: name ~s isn't a string"), self, str, nao);
+
+ return intern(str, package);
+}
+
val unintern(val symbol, val package_in)
{
val self = lit("unintern");
@@ -5492,15 +5497,11 @@ val set_package_fallback_list(val package_in, val list_in)
return set_hash_userdata(package->pk.symhash, list);
}
-val intern_fallback(val str, val package_in)
+val intern_fallback(val str, val package)
{
val self = lit("intern-fallback");
- val package = get_package(self, package_in, nil);
val fblist = get_hash_userdata(package->pk.symhash);
- if (!stringp(str))
- uw_throwf(error_s, lit("~a: name ~s isn't a string"), self, str, nao);
-
if (fblist) {
val found = gethash_e(self, package->pk.symhash, str);