[pure-lang-svn] SF.net SVN: pure-lang:[619] pure/trunk
Status: Beta
Brought to you by:
agraef
|
From: <ag...@us...> - 2008-08-26 22:37:46
|
Revision: 619
http://pure-lang.svn.sourceforge.net/pure-lang/?rev=619&view=rev
Author: agraef
Date: 2008-08-26 22:37:56 +0000 (Tue, 26 Aug 2008)
Log Message:
-----------
Refactoring of symbol table code.
Modified Paths:
--------------
pure/trunk/lexer.ll
pure/trunk/pure.cc
pure/trunk/symtable.hh
Modified: pure/trunk/lexer.ll
===================================================================
--- pure/trunk/lexer.ll 2008-08-26 16:10:07 UTC (rev 618)
+++ pure/trunk/lexer.ll 2008-08-26 22:37:56 UTC (rev 619)
@@ -143,7 +143,7 @@
command_generator(const char *text, int state)
{
static int list_index, len;
- static symbol_map::iterator it, end;
+ static int32_t f, n;
const char *name;
assert(interpreter::g_interp);
interpreter& interp = *interpreter::g_interp;
@@ -154,8 +154,7 @@
/* Must do this here, so that symbols are entered into the globalvars
table. */
interp.compile();
- it = interp.symtab.tab.begin();
- end = interp.symtab.tab.end();
+ f = 1; n = interp.symtab.nsyms();
len = strlen(text);
}
@@ -169,18 +168,17 @@
/* Return the next name which partially matches from the
symbol list. */
- while (it != end) {
- int32_t f = it->second.f;
+ while (f <= n) {
/* Skip non-toplevel symbols. */
if (interp.globenv.find(f) == interp.globenv.end() &&
interp.macenv.find(f) == interp.macenv.end() &&
interp.globalvars.find(f) == interp.globalvars.end() &&
interp.externals.find(f) == interp.externals.end()) {
- it++;
+ f++;
continue;
}
- const string& s = it->first;
- it++;
+ const string& s = interp.symtab.sym(f).s;
+ f++;
if (strncmp(s.c_str(), text, len) == 0)
return strdup(s.c_str());
}
Modified: pure/trunk/pure.cc
===================================================================
--- pure/trunk/pure.cc 2008-08-26 16:10:07 UTC (rev 618)
+++ pure/trunk/pure.cc 2008-08-26 22:37:56 UTC (rev 619)
@@ -67,7 +67,7 @@
command_generator(const char *text, int state)
{
static int list_index, len;
- static symbol_map::iterator it, end;
+ static int32_t f, n;
const char *name;
assert(interpreter::g_interp);
interpreter& interp = *interpreter::g_interp;
@@ -78,8 +78,7 @@
/* Must do this here, so that symbols are entered into the globalvars
table. */
interp.compile();
- it = interp.symtab.tab.begin();
- end = interp.symtab.tab.end();
+ f = 1; n = interp.symtab.nsyms();
len = strlen(text);
}
@@ -93,18 +92,17 @@
/* Return the next name which partially matches from the
symbol list. */
- while (it != end) {
- int32_t f = it->second.f;
+ while (f <= n) {
/* Skip non-toplevel symbols. */
if (interp.globenv.find(f) == interp.globenv.end() &&
interp.macenv.find(f) == interp.macenv.end() &&
interp.globalvars.find(f) == interp.globalvars.end() &&
interp.externals.find(f) == interp.externals.end()) {
- it++;
+ f++;
continue;
}
- const string& s = it->first;
- it++;
+ const string& s = interp.symtab.sym(f).s;
+ f++;
if (strncmp(s.c_str(), text, len) == 0)
return strdup(s.c_str());
}
@@ -117,7 +115,7 @@
symbol_generator(const char *text, int state)
{
static int len;
- static symbol_map::iterator it, end;
+ static int32_t f, n;
assert(interpreter::g_interp);
interpreter& interp = *interpreter::g_interp;
@@ -126,25 +124,23 @@
/* Must do this here, so that symbols are entered into the globalvars
table. */
interp.compile();
- it = interp.symtab.tab.begin();
- end = interp.symtab.tab.end();
+ f = 1; n = interp.symtab.nsyms();
len = strlen(text);
}
/* Return the next name which partially matches from the
symbol list. */
- while (it != end) {
- int32_t f = it->second.f;
+ while (f <= n) {
/* Skip non-toplevel symbols. */
if (interp.globenv.find(f) == interp.globenv.end() &&
interp.macenv.find(f) == interp.macenv.end() &&
interp.globalvars.find(f) == interp.globalvars.end() &&
interp.externals.find(f) == interp.externals.end()) {
- it++;
+ f++;
continue;
}
- const string& s = it->first;
- it++;
+ const string& s = interp.symtab.sym(f).s;
+ f++;
if (strncmp(s.c_str(), text, len) == 0)
return strdup(s.c_str());
}
Modified: pure/trunk/symtable.hh
===================================================================
--- pure/trunk/symtable.hh 2008-08-26 16:10:07 UTC (rev 618)
+++ pure/trunk/symtable.hh 2008-08-26 22:37:56 UTC (rev 619)
@@ -32,13 +32,16 @@
class symtable {
int32_t fno;
-public:
map<string, symbol> tab;
vector<symbol*> rtab;
+public:
symtable();
// add default declarations for the builtin constants and operators (to be
// invoked *after* possibly reading the prelude)
void init_builtins();
+ // get current number of symbols in table (symbols are always numbered
+ // consecutively from 1 to nsyms())
+ int32_t nsyms() { return fno; }
// look up an existing symbol (return 0 if not in table)
symbol* lookup(const string& s);
// get a symbol by its name (create if necessary)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|