فهرست منبع

Remove call to new and replace with new placement, also updated the test-sqlexer.nut example

mingodad 9 سال پیش
والد
کامیت
22fc514011
2فایلهای تغییر یافته به همراه28 افزوده شده و 12 حذف شده
  1. 22 2
      SquiLu/samples/test-sqlexer.nut
  2. 6 10
      SquiLu/squirrel/sq_lexer.cpp

+ 22 - 2
SquiLu/samples/test-sqlexer.nut

@@ -3,18 +3,38 @@ local txt = fd.read(fd.len());
 fd.close();
 
 var lex = new SQLexer(txt);
-print(lex.first_enum_token(), lex.last_enum_token());
+
+local first_enum_token = lex.first_enum_token();
+local last_enum_token = lex.last_enum_token();
+print(first_enum_token, last_enum_token);
+
+var gconstants = getconsttable();
+for(var i=first_enum_token+1; i < last_enum_token; ++i)
+{
+	var tkname = lex.token_name(i);
+	table_rawset(gconstants, tkname, i);
+	print(tkname, i);
+}
 
 
 var tok =  lex.lex();
 while(tok > 0) {
+	local tkstr;
+	if(tok > first_enum_token) tkstr = lex.tok2str(tok);
+	else tkstr = tok.tochar();
 	print(
 		tok,
-		lex.tok2str(tok),
+		tkstr,
 		lex.token_name(tok),
 		lex.svalue(),
 		lex.currentline(),
 		lex.currentcolumn()
 		);
 	tok = lex.lex();
+	/*
+	if(tok == TK_CLASS)
+	{
+		print("class found");
+	}
+	*/
 }

+ 6 - 10
SquiLu/squirrel/sq_lexer.cpp

@@ -16,15 +16,9 @@ static const SQChar SQ_LIBNAME[] = _SC("SQLexer");
 SQ_OPT_STRING_STRLEN();
 
 
-struct MyLexer : public SQLexer
-{
-    MyLexer():SQLexer(){}
-
-};
-
 struct sq_lexer_st
 {
-    MyLexer *lex;
+    SQLexer *lex;
     HSQOBJECT source;
     SQStrBufState buf;
 };
@@ -40,7 +34,8 @@ static SQRESULT SQLexer_release_hook(SQUserPointer p, SQInteger size, HSQUIRRELV
 	if(self && self->lex)
     {
         sq_release(v, &self->source);
-        delete self->lex;
+        self->lex->~SQLexer();
+        sq_free(self->lex, sizeof(SQLexer));
         self->lex = nullptr;
         sq_free(self, sizeof(sq_lexer_st));
     }
@@ -55,13 +50,14 @@ static SQRESULT sq_SQLexer_constructor(HSQUIRRELVM v){
     sq_resetobject(&self->source);
     SQRESULT rc = sq_getstackobj(v, 2, &self->source);
     if(rc == SQ_OK) sq_addref(v, &self->source);
-    self->lex = new MyLexer();
+    self->lex = (SQLexer*)sq_malloc(sizeof(SQLexer));
+    new (self->lex) SQLexer();
     self->buf.buf = src;
     self->buf.ptr = 0;
     self->buf.size = src_size;
     self->lex->Init(v->_sharedstate, sq_strbuf_lexfeed, &self->buf, nullptr, nullptr);
 
-    sq_setinstanceup(v, 1, self);
+    sq_setinstanceup(v, 1, self);
     sq_setreleasehook(v,1, SQLexer_release_hook);
 
 	return 1;