shithub: sl

Download patch

ref: dbb92f94adb6431054f12c296795dffd134e8f03
parent: e228d9b24953a72ca8e10c0b8024f3ac9ce1fcb4
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Feb 6 22:49:17 EST 2025

symbols created on init: specialize to avoid useless operations

--- a/src/compress.c
+++ b/src/compress.c
@@ -73,6 +73,6 @@
 void
 compress_init(void)
 {
-	FL_sizesym = symbol(":size", false);
-	FL_tosym = symbol(":to", false);
+	FL_sizesym = csymbol(":size");
+	FL_tosym = csymbol(":to");
 }
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -804,7 +804,7 @@
 
 #define cv_intern(tok) \
 	do{ \
-		FL_##tok##sym = symbol(#tok, false); \
+		FL_##tok##sym = csymbol(#tok); \
 	}while(0)
 
 #define ctor_cv_intern(tok, nt, ctype) \
@@ -1330,10 +1330,10 @@
 
 	ctor_cv_intern(array, NONNUMERIC, int);
 
-	FL_stringtypesym = symbol("*string-type*", false);
+	FL_stringtypesym = csymbol("*string-type*");
 	setc(FL_stringtypesym, fl_list2(FL_arraysym, FL_bytesym));
 
-	FL_runestringtypesym = symbol("*runestring-type*", false);
+	FL_runestringtypesym = csymbol("*runestring-type*");
 	setc(FL_runestringtypesym, fl_list2(FL_arraysym, FL_runesym));
 
 	mk_primtype(int8, int8_t);
--- a/src/flisp.c
+++ b/src/flisp.c
@@ -220,6 +220,14 @@
 	return tagptr(v, TAG_SYM);
 }
 
+value_t
+csymbol_(const char *str, int len)
+{
+	symbol_t *v = mk_symbol(str, len, false);
+	FL(symtab) = Tsetl(FL(symtab), str, len, v);
+	return tagptr(v, TAG_SYM);
+}
+
 BUILTIN("gensym", gensym)
 {
 	argcount(nargs, 0);
@@ -1316,61 +1324,61 @@
 		goto failed;
 	comparehash_init();
 
-	FL_lambda = symbol("λ", false);
-	FL_function = symbol("function", false);
-	FL_quote = symbol("quote", false);
-	FL_trycatch = symbol("trycatch", false);
-	FL_backquote = symbol("quasiquote", false);
-	FL_comma = symbol("unquote", false);
-	FL_commaat = symbol("unquote-splicing", false);
-	FL_commadot = symbol("unquote-nsplicing", false);
-	FL_IOError = symbol("io-error", false);
-	FL_ParseError = symbol("parse-error", false);
-	FL_TypeError = symbol("type-error", false);
-	FL_ArgError = symbol("arg-error", false);
-	FL_UnboundError = symbol("unbound-error", false);
-	FL_KeyError = symbol("key-error", false);
-	FL_MemoryError = symbol("memory-error", false);
-	FL_BoundsError = symbol("bounds-error", false);
-	FL_DivideError = symbol("divide-error", false);
-	FL_Error = symbol("error", false);
-	FL_conssym = symbol("cons", false);
-	FL_symbolsym = symbol("symbol", false);
-	FL_fixnumsym = symbol("fixnum", false);
-	FL_vectorsym = symbol("vector", false);
-	FL_builtinsym = symbol("builtin", false);
-	FL_booleansym = symbol("boolean", false);
-	FL_nullsym = symbol("null", false);
-	FL_definesym = symbol("define", false);
-	FL_defmacrosym = symbol("define-macro", false);
-	FL_forsym = symbol("for", false);
-	FL_setqsym = symbol("set!", false);
-	FL_evalsym = symbol("eval", false);
-	FL_vu8sym = symbol("vu8", false);
-	FL_fnsym = symbol("fn", false);
-	FL_nulsym = symbol("nul", false);
-	FL_alarmsym = symbol("alarm", false);
-	FL_backspacesym = symbol("backspace", false);
-	FL_tabsym = symbol("tab", false);
-	FL_linefeedsym = symbol("linefeed", false);
-	FL_vtabsym = symbol("vtab", false);
-	FL_pagesym = symbol("page", false);
-	FL_returnsym = symbol("return", false);
-	FL_escsym = symbol("esc", false);
-	FL_spacesym = symbol("space", false);
-	FL_deletesym = symbol("delete", false);
-	FL_newlinesym = symbol("newline", false);
-	FL_tsym = symbol("t", false);
-	FL_Tsym = symbol("T", false);
-	FL_fsym = symbol("f", false);
-	FL_Fsym = symbol("F", false);
-	FL_builtins_table_sym = symbol("*builtins*", false);
+	FL_lambda = csymbol("λ");
+	FL_function = csymbol("function");
+	FL_quote = csymbol("quote");
+	FL_trycatch = csymbol("trycatch");
+	FL_backquote = csymbol("quasiquote");
+	FL_comma = csymbol("unquote");
+	FL_commaat = csymbol("unquote-splicing");
+	FL_commadot = csymbol("unquote-nsplicing");
+	FL_IOError = csymbol("io-error");
+	FL_ParseError = csymbol("parse-error");
+	FL_TypeError = csymbol("type-error");
+	FL_ArgError = csymbol("arg-error");
+	FL_UnboundError = csymbol("unbound-error");
+	FL_KeyError = csymbol("key-error");
+	FL_MemoryError = csymbol("memory-error");
+	FL_BoundsError = csymbol("bounds-error");
+	FL_DivideError = csymbol("divide-error");
+	FL_Error = csymbol("error");
+	FL_conssym = csymbol("cons");
+	FL_symbolsym = csymbol("symbol");
+	FL_fixnumsym = csymbol("fixnum");
+	FL_vectorsym = csymbol("vector");
+	FL_builtinsym = csymbol("builtin");
+	FL_booleansym = csymbol("boolean");
+	FL_nullsym = csymbol("null");
+	FL_definesym = csymbol("define");
+	FL_defmacrosym = csymbol("define-macro");
+	FL_forsym = csymbol("for");
+	FL_setqsym = csymbol("set!");
+	FL_evalsym = csymbol("eval");
+	FL_vu8sym = csymbol("vu8");
+	FL_fnsym = csymbol("fn");
+	FL_nulsym = csymbol("nul");
+	FL_alarmsym = csymbol("alarm");
+	FL_backspacesym = csymbol("backspace");
+	FL_tabsym = csymbol("tab");
+	FL_linefeedsym = csymbol("linefeed");
+	FL_vtabsym = csymbol("vtab");
+	FL_pagesym = csymbol("page");
+	FL_returnsym = csymbol("return");
+	FL_escsym = csymbol("esc");
+	FL_spacesym = csymbol("space");
+	FL_deletesym = csymbol("delete");
+	FL_newlinesym = csymbol("newline");
+	FL_tsym = csymbol("t");
+	FL_Tsym = csymbol("T");
+	FL_fsym = csymbol("f");
+	FL_Fsym = csymbol("F");
+	FL_builtins_table_sym = csymbol("*builtins*");
 
-	set(FL_printprettysym = symbol("*print-pretty*", false), FL_t);
-	set(FL_printreadablysym = symbol("*print-readably*", false), FL_t);
-	set(FL_printwidthsym = symbol("*print-width*", false), fixnum(FL(scr_width)));
-	set(FL_printlengthsym = symbol("*print-length*", false), FL_f);
-	set(FL_printlevelsym = symbol("*print-level*", false), FL_f);
+	set(FL_printprettysym = csymbol("*print-pretty*"), FL_t);
+	set(FL_printreadablysym = csymbol("*print-readably*"), FL_t);
+	set(FL_printwidthsym = csymbol("*print-width*"), fixnum(FL(scr_width)));
+	set(FL_printlengthsym = csymbol("*print-length*"), FL_f);
+	set(FL_printlevelsym = csymbol("*print-level*"), FL_f);
 	FL(lasterror) = FL_nil;
 
 	for(i = 0; i < nelem(builtins); i++){
@@ -1377,8 +1385,8 @@
 		if(builtins[i].name)
 			set(symbol(builtins[i].name, false), builtin(i));
 	}
-	setc(symbol("procedure?", false), builtin(OP_FUNCTIONP));
-	setc(symbol("top-level-bound?", false), builtin(OP_BOUNDP));
+	setc(csymbol("procedure?"), builtin(OP_FUNCTIONP));
+	setc(csymbol("top-level-bound?"), builtin(OP_BOUNDP));
 
 	FL(the_empty_vector) = tagptr(alloc_words(1), TAG_VECTOR);
 	vector_setsize(FL(the_empty_vector), 0);
@@ -1385,9 +1393,9 @@
 
 	cvalues_init();
 
-	set(symbol("*os-name*", false), cvalue_static_cstring(__os_name__));
+	set(csymbol("*os-name*"), cvalue_static_cstring(__os_name__));
 #if defined(__os_version__)
-	set(symbol("*os-version*", false), cvalue_static_cstring(__os_version__));
+	set(csymbol("*os-version*"), cvalue_static_cstring(__os_version__));
 #endif
 	FL(memory_exception_value) = fl_list2(FL_MemoryError, cvalue_static_cstring("out of memory"));
 
--- a/src/flisp.h
+++ b/src/flisp.h
@@ -193,6 +193,8 @@
 /* symbol table */
 value_t gensym(void);
 value_t symbol(const char *str, bool copy) fl_hotfn;
+value_t csymbol_(const char *str, int len);
+#define csymbol(str) csymbol_(str, sizeof(str)-1)
 const char *symbol_name(value_t v);
 
 /* read, eval, print main entry points */
--- a/src/iostream.c
+++ b/src/iostream.c
@@ -438,16 +438,16 @@
 void
 iostream_init(void)
 {
-	FL_iostreamsym = symbol("iostream", false);
-	FL_rdsym = symbol(":read", false);
-	FL_wrsym = symbol(":write", false);
-	FL_apsym = symbol(":append", false);
-	FL_crsym = symbol(":create", false);
-	FL_truncsym = symbol(":truncate", false);
-	FL_instrsym = symbol("*input-stream*", false);
-	FL_outstrsym = symbol("*output-stream*", false);
+	FL_iostreamsym = csymbol("iostream");
+	FL_rdsym = csymbol(":read");
+	FL_wrsym = csymbol(":write");
+	FL_apsym = csymbol(":append");
+	FL_crsym = csymbol(":create");
+	FL_truncsym = csymbol(":truncate");
+	FL_instrsym = csymbol("*input-stream*");
+	FL_outstrsym = csymbol("*output-stream*");
 	FL(iostreamtype) = define_opaque_type(FL_iostreamsym, sizeof(ios_t), &iostream_vtable, nil);
-	set(symbol("*stdout*", false), cvalue_from_ref(FL(iostreamtype), ios_stdout, sizeof(ios_t)));
-	set(symbol("*stderr*", false), cvalue_from_ref(FL(iostreamtype), ios_stderr, sizeof(ios_t)));
-	set(symbol("*stdin*", false), cvalue_from_ref(FL(iostreamtype), ios_stdin, sizeof(ios_t)));
+	set(csymbol("*stdout*"), cvalue_from_ref(FL(iostreamtype), ios_stdout, sizeof(ios_t)));
+	set(csymbol("*stderr*"), cvalue_from_ref(FL(iostreamtype), ios_stderr, sizeof(ios_t)));
+	set(csymbol("*stdin*"), cvalue_from_ref(FL(iostreamtype), ios_stdin, sizeof(ios_t)));
 }