Преглед на файлове

Split the functionality in SQStringTable::Add with the intention of allocate SQStrings structures to work as buffers and add then without multiple copies.

mingodad преди 13 години
родител
ревизия
c34368131f
променени са 2 файла, в които са добавени 71 реда и са изтрити 35 реда
  1. 56 24
      squirrel/sqstate.cpp
  2. 15 11
      squirrel/sqstate.h

+ 56 - 24
squirrel/sqstate.cpp

@@ -39,10 +39,10 @@ SQSharedState::SQSharedState()
 bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
 bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
 {
 {
 	SQInteger i = 0;
 	SQInteger i = 0;
-	
+
 	SQInteger mask = 0;
 	SQInteger mask = 0;
 	while(typemask[i] != 0) {
 	while(typemask[i] != 0) {
-		
+
 		switch(typemask[i]){
 		switch(typemask[i]){
 				case 'o': mask |= _RT_NULL; break;
 				case 'o': mask |= _RT_NULL; break;
 				case 'i': mask |= _RT_INTEGER; break;
 				case 'i': mask |= _RT_INTEGER; break;
@@ -66,15 +66,15 @@ bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
 					return false;
 					return false;
 		}
 		}
 		i++;
 		i++;
-		if(typemask[i] == '|') { 
-			i++; 
+		if(typemask[i] == '|') {
+			i++;
 			if(typemask[i] == 0)
 			if(typemask[i] == 0)
 				return false;
 				return false;
-			continue; 
+			continue;
 		}
 		}
 		res.push_back(mask);
 		res.push_back(mask);
 		mask = 0;
 		mask = 0;
-		
+
 	}
 	}
 	return true;
 	return true;
 }
 }
@@ -96,7 +96,7 @@ SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)
 }
 }
 
 
 void SQSharedState::Init()
 void SQSharedState::Init()
-{	
+{
 	_scratchpad=NULL;
 	_scratchpad=NULL;
 	_scratchpadsize=0;
 	_scratchpadsize=0;
 #ifndef NO_GARBAGE_COLLECTOR
 #ifndef NO_GARBAGE_COLLECTOR
@@ -251,9 +251,9 @@ void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain)
 void SQSharedState::RunMark(SQVM *vm,SQCollectable **tchain)
 void SQSharedState::RunMark(SQVM *vm,SQCollectable **tchain)
 {
 {
 	SQVM *vms = _thread(_root_vm);
 	SQVM *vms = _thread(_root_vm);
-	
+
 	vms->Mark(tchain);
 	vms->Mark(tchain);
-	
+
 	_refs_table.Mark(tchain);
 	_refs_table.Mark(tchain);
 	MarkObject(_registry,tchain);
 	MarkObject(_registry,tchain);
 	MarkObject(_consts,tchain);
 	MarkObject(_consts,tchain);
@@ -354,7 +354,7 @@ SQInteger SQSharedState::CollectGarbage(SQVM *vm)
 		t = t->_next;
 		t = t->_next;
 	}
 	}
 	_gc_chain = tchain;
 	_gc_chain = tchain;
-	
+
 	return n;
 	return n;
 }
 }
 #endif
 #endif
@@ -487,7 +487,7 @@ void RefTable::Resize(SQUnsignedInteger size)
 			//add back;
 			//add back;
 			assert(t->refs != 0);
 			assert(t->refs != 0);
 			RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj);
 			RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj);
-			nn->refs = t->refs; 
+			nn->refs = t->refs;
 			t->obj.Null();
 			t->obj.Null();
 			nfound++;
 			nfound++;
 		}
 		}
@@ -585,30 +585,62 @@ void SQStringTable::AllocNodes(SQInteger size)
 	memset(_strings,0,sizeof(SQString*)*_numofslots);
 	memset(_strings,0,sizeof(SQString*)*_numofslots);
 }
 }
 
 
-SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
+SQString *SQStringTable::Contains(const SQChar *news, SQInteger &len, SQHash &newhash, SQHash &h)
 {
 {
 	if(len<0)
 	if(len<0)
 		len = (SQInteger)scstrlen(news);
 		len = (SQInteger)scstrlen(news);
-	SQHash newhash = ::_hashstr(news,len);
-	SQHash h = newhash&(_numofslots-1);
+	newhash = ::_hashstr(news,len);
+	h = newhash&(_numofslots-1);
 	SQString *s;
 	SQString *s;
+	SQInteger calculated_len = rsl(len);
 	for (s = _strings[h]; s; s = s->_next){
 	for (s = _strings[h]; s; s = s->_next){
-		if(s->_len == len && (!memcmp(news,s->_val,rsl(len))))
+		if(s->_len == len && (!memcmp(news,s->_val,calculated_len)))
 			return s; //found
 			return s; //found
 	}
 	}
+	return 0;
+}
 
 
-	SQString *t = (SQString *)SQ_MALLOC(rsl(len)+sizeof(SQString));
-	new (t) SQString;
-	t->_sharedstate = _sharedstate;
+SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
+{
+	SQHash newhash, h;
+    SQString *t = Contains(news, len, newhash, h);
+    if(t) return t;
+	t = NewStrBuf(len);
 	memcpy(t->_val,news,rsl(len));
 	memcpy(t->_val,news,rsl(len));
-	t->_val[len] = _SC('\0');
-	t->_len = len;
-	t->_hash = newhash;
-	t->_next = _strings[h];
-	_strings[h] = t;
+	return Add(t, newhash, h);
+}
+
+SQString *SQStringTable::Add(SQString *strBuf)
+{
+	SQHash newhash, h;
+    SQString *t = Contains(strBuf->_val, strBuf->_len, newhash, h);
+    if(t) {
+        SQ_FREE(strBuf,sizeof(SQString) + rsl(strBuf->_len));
+        return t;
+    }
+    return Add(strBuf, newhash, h);
+}
+
+SQString *SQStringTable::Add(SQString *strBuf, SQHash newhash, SQHash h)
+{
+	strBuf->_sharedstate = _sharedstate;
+	strBuf->_val[strBuf->_len] = _SC('\0');
+	strBuf->_hash = newhash;
+	strBuf->_next = _strings[h];
+	_strings[h] = strBuf;
 	_slotused++;
 	_slotused++;
 	if (_slotused > _numofslots)  /* too crowded? */
 	if (_slotused > _numofslots)  /* too crowded? */
 		Resize(_numofslots*2);
 		Resize(_numofslots*2);
+	return strBuf;
+}
+
+SQString *SQStringTable::NewStrBuf(SQInteger len)
+{
+    SQInteger calculated_size = rsl(len)+sizeof(SQString);
+	SQString *t = (SQString *)SQ_MALLOC(calculated_size);
+	memset(t, 0, calculated_size);
+	new (t) SQString;
+	t->_len = len;
 	return t;
 	return t;
 }
 }
 
 
@@ -635,7 +667,7 @@ void SQStringTable::Remove(SQString *bs)
 	SQString *s;
 	SQString *s;
 	SQString *prev=NULL;
 	SQString *prev=NULL;
 	SQHash h = bs->_hash&(_numofslots - 1);
 	SQHash h = bs->_hash&(_numofslots - 1);
-	
+
 	for (s = _strings[h]; s; ){
 	for (s = _strings[h]; s; ){
 		if(s == bs){
 		if(s == bs){
 			if(prev)
 			if(prev)

+ 15 - 11
squirrel/sqstate.h

@@ -14,8 +14,12 @@ struct SQStringTable
 	SQStringTable(SQSharedState*ss);
 	SQStringTable(SQSharedState*ss);
 	~SQStringTable();
 	~SQStringTable();
 	SQString *Add(const SQChar *,SQInteger len);
 	SQString *Add(const SQChar *,SQInteger len);
+	SQString *Add(SQString *strBuf);
+	SQString *NewStrBuf(SQInteger len);
 	void Remove(SQString *);
 	void Remove(SQString *);
 private:
 private:
+    SQString *Contains(const SQChar *news, SQInteger &len, SQHash &newhash, SQHash &h);
+	SQString *Add(SQString *strBuf, SQHash newhash, SQHash h);
 	void Resize(SQInteger size);
 	void Resize(SQInteger size);
 	void AllocNodes(SQInteger size);
 	void AllocNodes(SQInteger size);
 	SQString **_strings;
 	SQString **_strings;
@@ -103,7 +107,7 @@ public:
 	static SQRegFunction _instance_default_delegate_funcz[];
 	static SQRegFunction _instance_default_delegate_funcz[];
 	SQObjectPtr _weakref_default_delegate;
 	SQObjectPtr _weakref_default_delegate;
 	static SQRegFunction _weakref_default_delegate_funcz[];
 	static SQRegFunction _weakref_default_delegate_funcz[];
-	
+
 	SQCOMPILERERROR _compilererrorhandler;
 	SQCOMPILERERROR _compilererrorhandler;
 	SQPRINTFUNCTION _printfunc;
 	SQPRINTFUNCTION _printfunc;
 	SQPRINTFUNCTION _errorfunc;
 	SQPRINTFUNCTION _errorfunc;
@@ -117,16 +121,16 @@ private:
 #define _sp(s) (_sharedstate->GetScratchPad(s))
 #define _sp(s) (_sharedstate->GetScratchPad(s))
 #define _spval (_sharedstate->GetScratchPad(-1))
 #define _spval (_sharedstate->GetScratchPad(-1))
 
 
-#define _table_ddel		_table(_sharedstate->_table_default_delegate) 
-#define _array_ddel		_table(_sharedstate->_array_default_delegate) 
-#define _string_ddel	_table(_sharedstate->_string_default_delegate) 
-#define _number_ddel	_table(_sharedstate->_number_default_delegate) 
-#define _generator_ddel	_table(_sharedstate->_generator_default_delegate) 
-#define _closure_ddel	_table(_sharedstate->_closure_default_delegate) 
-#define _thread_ddel	_table(_sharedstate->_thread_default_delegate) 
-#define _class_ddel		_table(_sharedstate->_class_default_delegate) 
-#define _instance_ddel	_table(_sharedstate->_instance_default_delegate) 
-#define _weakref_ddel	_table(_sharedstate->_weakref_default_delegate) 
+#define _table_ddel		_table(_sharedstate->_table_default_delegate)
+#define _array_ddel		_table(_sharedstate->_array_default_delegate)
+#define _string_ddel	_table(_sharedstate->_string_default_delegate)
+#define _number_ddel	_table(_sharedstate->_number_default_delegate)
+#define _generator_ddel	_table(_sharedstate->_generator_default_delegate)
+#define _closure_ddel	_table(_sharedstate->_closure_default_delegate)
+#define _thread_ddel	_table(_sharedstate->_thread_default_delegate)
+#define _class_ddel		_table(_sharedstate->_class_default_delegate)
+#define _instance_ddel	_table(_sharedstate->_instance_default_delegate)
+#define _weakref_ddel	_table(_sharedstate->_weakref_default_delegate)
 
 
 #ifdef SQUNICODE //rsl REAL STRING LEN
 #ifdef SQUNICODE //rsl REAL STRING LEN
 #define rsl(l) ((l)<<1)
 #define rsl(l) ((l)<<1)