Browse Source

Added type info to the comments in the squilu bytecode generation option

mingodad 8 years ago
parent
commit
a2333d71ef

+ 61 - 45
SquiLu/squirrel/sqcompiler.cpp

@@ -2150,10 +2150,56 @@ function_params_decl:
             Lex();
             Lex();
         }
         }
     }
     }
+    SQInteger GetVarTypeDeclaration(SQInteger declType, SQInteger dest=-1)
+    {
+        bool doAddInstruction = (dest >= 0);
+        switch(declType)
+        {
+        CASE_TK_LOCAL_CHAR_TYPES:
+            if(doAddInstruction) _fs->AddInstruction(_OP_LOADNULLS, dest,1);
+            declType = _VAR_STRING;
+            break;
+
+        case TK_LOCAL_BOOL_T:
+            //default value false
+            if(doAddInstruction) _fs->AddInstruction(_OP_LOADBOOL, dest,0);
+            declType = _VAR_BOOL;
+            break;
+
+        case TK_LOCAL_TABLE_T:
+            if(doAddInstruction) _fs->AddInstruction(_OP_LOADNULLS, dest,1);
+            declType = _VAR_TABLE;
+            break;
+        case TK_LOCAL_ARRAY_T:
+            if(doAddInstruction) _fs->AddInstruction(_OP_LOADNULLS, dest,1);
+            declType = _VAR_ARRAY;
+            break;
+
+        CASE_TK_LOCAL_INT_TYPES:
+            //default value 0
+            if(doAddInstruction) _fs->AddInstruction(_OP_LOADINT, dest,0);
+            declType = _VAR_INTEGER;
+            break;
+        CASE_TK_LOCAL_FLOAT_TYPES:
+        case TK_LOCAL_NUMBER_T: //start numbers as floats
+            //default value 0.0
+            //_OP_LOADFLOAT is only valid when SQFloat size == SQInt32 size
+            if(doAddInstruction) _fs->AddInstruction(_OP_LOADINT, dest,0);
+            declType = _VAR_FLOAT;
+            break;
+        //case TK_LOCAL:
+        default:
+            //default value null
+            if(doAddInstruction) _fs->AddInstruction(_OP_LOADNULLS, dest,1);
+            declType = _VAR_ANY;
+        }
+        return declType;
+    }
 #define CHECK_REF_DECLARATION(tk) if(tk == _SC('&')){is_reference_declaration = true;Lex();}
 #define CHECK_REF_DECLARATION(tk) if(tk == _SC('&')){is_reference_declaration = true;Lex();}
     void LocalDeclStatement()
     void LocalDeclStatement()
     {
     {
         SQObject varname;
         SQObject varname;
+        SQObject type_name = GetTokenObject(_token, false);
         //SQChar *param_type_name;
         //SQChar *param_type_name;
         bool is_void_declaration = _token == TK_VOID;
         bool is_void_declaration = _token == TK_VOID;
         bool is_const_declaration = _token == TK_CONST;
         bool is_const_declaration = _token == TK_CONST;
@@ -2169,12 +2215,14 @@ function_params_decl:
             CheckLocalNameScope(varname, _scope.nested);
             CheckLocalNameScope(varname, _scope.nested);
             Expect(_SC('('));
             Expect(_SC('('));
 function_params_decl:
 function_params_decl:
-#if 1 //doing this way works but prevents garbage collection when doing multiple reloads on the same vm
+#if 1
+            //doing this way works but prevents garbage collection when doing multiple reloads on the same vm
             //the following is an attempt to allow local declared functions be called recursivelly
             //the following is an attempt to allow local declared functions be called recursivelly
             SQInteger old_pos = _fs->GetCurrentPos(); //save current instructions position
             SQInteger old_pos = _fs->GetCurrentPos(); //save current instructions position
             _fs->PushLocalVariable(varname, _scope.nested, _VAR_CLOSURE); //add function name to find it as outer var if needed
             _fs->PushLocalVariable(varname, _scope.nested, _VAR_CLOSURE); //add function name to find it as outer var if needed
+            if(sq_type(type_name) == OT_STRING) _fs->AddParameterTypeName(type_name);
             //-1 to compensate default parameters when relocating
             //-1 to compensate default parameters when relocating
-            CreateFunction(varname, eFunctionType_local, -1);
+            CreateFunction(varname, eFunctionType_local, -1, declType);
             if(_is_parsing_extern)
             if(_is_parsing_extern)
             {
             {
                 if(_token == _SC(';')) //to parse thinscript
                 if(_token == _SC(';')) //to parse thinscript
@@ -2220,6 +2268,7 @@ function_params_decl:
             EatTemplateInitialization();
             EatTemplateInitialization();
             if(_token == _SC('('))
             if(_token == _SC('('))
             {
             {
+                declType = GetVarTypeDeclaration(declType);
                 //C/C++ style function declaration
                 //C/C++ style function declaration
                 Lex();
                 Lex();
                 goto function_params_decl;
                 goto function_params_decl;
@@ -2228,7 +2277,8 @@ function_params_decl:
             {
             {
                 //type specifier like typescript
                 //type specifier like typescript
                 Lex();
                 Lex();
-                ExpectTypeToken(); //ignore for now
+                declType = _token;
+                type_name = ExpectTypeToken(); //ignore for now
             }
             }
             if(is_void_declaration)
             if(is_void_declaration)
             {
             {
@@ -2245,7 +2295,7 @@ function_params_decl:
                 SQInteger src = _fs->PopTarget();
                 SQInteger src = _fs->PopTarget();
                 SQInteger dest = _fs->PushTarget();
                 SQInteger dest = _fs->PushTarget();
                 if(dest != src) _fs->AddInstruction(_OP_MOVE, dest, src);
                 if(dest != src) _fs->AddInstruction(_OP_MOVE, dest, src);
-                declType = _VAR_ANY;
+                declType = GetVarTypeDeclaration(declType);
             }
             }
             else if(is_const_declaration || is_reference_declaration)
             else if(is_const_declaration || is_reference_declaration)
                 Error(_SC("const/reference '%s' need an initializer"), _stringval(varname));
                 Error(_SC("const/reference '%s' need an initializer"), _stringval(varname));
@@ -2255,46 +2305,7 @@ function_params_decl:
                 if(!_is_parsing_extern)
                 if(!_is_parsing_extern)
                 {
                 {
                     SQInteger dest = _fs->PushTarget();
                     SQInteger dest = _fs->PushTarget();
-                    switch(declType)
-                    {
-CASE_TK_LOCAL_CHAR_TYPES:
-                        _fs->AddInstruction(_OP_LOADNULLS, dest,1);
-                        declType = _VAR_STRING;
-                        break;
-
-                    case TK_LOCAL_BOOL_T:
-                        //default value false
-                        _fs->AddInstruction(_OP_LOADBOOL, dest,0);
-                        declType = _VAR_BOOL;
-                        break;
-
-                    case TK_LOCAL_TABLE_T:
-                        _fs->AddInstruction(_OP_LOADNULLS, dest,1);
-                        declType = _VAR_TABLE;
-                        break;
-                    case TK_LOCAL_ARRAY_T:
-                        _fs->AddInstruction(_OP_LOADNULLS, dest,1);
-                        declType = _VAR_ARRAY;
-                        break;
-
-CASE_TK_LOCAL_INT_TYPES:
-                        //default value 0
-                        _fs->AddInstruction(_OP_LOADINT, dest,0);
-                        declType = _VAR_INTEGER;
-                        break;
-CASE_TK_LOCAL_FLOAT_TYPES:
-                    case TK_LOCAL_NUMBER_T: //start numbers as floats
-                        //default value 0.0
-                        //_OP_LOADFLOAT is only valid when SQFloat size == SQInt32 size
-                        _fs->AddInstruction(_OP_LOADINT, dest,0);
-                        declType = _VAR_FLOAT;
-                        break;
-                    //case TK_LOCAL:
-                    default:
-                        //default value null
-                        _fs->AddInstruction(_OP_LOADNULLS, dest,1);
-                        declType = _VAR_ANY;
-                    }
+                    declType = GetVarTypeDeclaration(declType, dest);
                 }
                 }
             }
             }
             if(_is_parsing_extern)
             if(_is_parsing_extern)
@@ -2309,6 +2320,7 @@ CASE_TK_LOCAL_FLOAT_TYPES:
                 _fs->PopTarget();
                 _fs->PopTarget();
                 _fs->PushLocalVariable(varname, _scope.nested, (is_const_declaration ? _VAR_CONST : declType)
                 _fs->PushLocalVariable(varname, _scope.nested, (is_const_declaration ? _VAR_CONST : declType)
                                        | (is_reference_declaration ? _VAR_REFERENCE : 0));
                                        | (is_reference_declaration ? _VAR_REFERENCE : 0));
+                if(sq_type(type_name) == OT_STRING) _fs->AddParameterTypeName(type_name);
             }
             }
             if(_token == _SC(',')) Lex();
             if(_token == _SC(',')) Lex();
             else break;
             else break;
@@ -2941,7 +2953,7 @@ error:
         }
         }
         _es = es;
         _es = es;
     }
     }
-    void CreateFunction(SQObject &name, int ftype, int stack_offset=0)
+    void CreateFunction(SQObject &name, int ftype, int stack_offset=0, int fdeclType=0)
     {
     {
         SQFuncState *funcstate = _fs->PushChildState(_ss(_vm));
         SQFuncState *funcstate = _fs->PushChildState(_ss(_vm));
         funcstate->_name = name;
         funcstate->_name = name;
@@ -2952,6 +2964,10 @@ error:
         bool is_reference_declaration = 0;
         bool is_reference_declaration = 0;
         const SQChar *param_type_name = 0;
         const SQChar *param_type_name = 0;
         bool isVoid = false;
         bool isVoid = false;
+        if(fdeclType)
+        {
+            funcstate->SetReturnTypeName(SQGetVarTypeName(fdeclType));
+        }
         while(_token!=_SC(')'))
         while(_token!=_SC(')'))
         {
         {
             if(isVoid)
             if(isVoid)

+ 4 - 0
SquiLu/squirrel/sqfuncstate.cpp

@@ -371,6 +371,10 @@ void SQFuncState::AddParameterTypeName(const SQChar *type_name)
 	if(type_name) AddParameterTypeName(CreateString(type_name, scstrlen(type_name)));
 	if(type_name) AddParameterTypeName(CreateString(type_name, scstrlen(type_name)));
 }
 }
 
 
+void SQFuncState::SetReturnTypeName(const SQChar *type_name)
+{
+	if(type_name) _return_type = CreateString(type_name, scstrlen(type_name));
+}
 SQInteger SQFuncState::FindGotoTarget(const SQObject &name)
 SQInteger SQFuncState::FindGotoTarget(const SQObject &name)
 {
 {
 	for(size_t i=0, len=_gototargets.size(); i < len; ++i){
 	for(size_t i=0, len=_gototargets.size(); i < len; ++i){

+ 1 - 0
SquiLu/squirrel/sqfuncstate.h

@@ -32,6 +32,7 @@ struct SQFuncState
 	void AddParameter(const SQObject &name, SQInteger scope, SQInteger type=_VAR_ANY);
 	void AddParameter(const SQObject &name, SQInteger scope, SQInteger type=_VAR_ANY);
 	void AddParameterTypeName(const SQObject &type_name);
 	void AddParameterTypeName(const SQObject &type_name);
 	void AddParameterTypeName(const SQChar *type_name);
 	void AddParameterTypeName(const SQChar *type_name);
+	void SetReturnTypeName(const SQChar *type_name);
 	//void AddOuterValue(const SQObject &name);
 	//void AddOuterValue(const SQObject &name);
 	SQInteger GetLocalVariable(const SQObject &name);
 	SQInteger GetLocalVariable(const SQObject &name);
 	void MarkLocalAsOuter(SQInteger pos);
 	void MarkLocalAsOuter(SQInteger pos);

+ 21 - 3
SquiLu/squirrel/sqobject.cpp

@@ -605,6 +605,21 @@ const SQChar *SQGetNewObjTypeName(int it){
 #undef SCASE
 #undef SCASE
 }
 }
 
 
+const SQChar *SQGetVarTypeName(int it){
+#define SCASE(x) case _VAR_##x: return _SC(#x); break;
+    switch(it){
+        SCASE(ANY)
+        SCASE(INTEGER)
+        SCASE(FLOAT)
+        SCASE(BOOL)
+        SCASE(STRING)
+        SCASE(TABLE)
+        SCASE(ARRAY)
+        SCASE(CLOSURE)
+        default: return _SC("?");
+    }
+#undef SCASE
+}
 const SQChar *SQGetArithOpName(int it){
 const SQChar *SQGetArithOpName(int it){
 #define SCASE(x, z) case x: return _SC(#z); break;
 #define SCASE(x, z) case x: return _SC(#z); break;
     switch(it){
     switch(it){
@@ -642,7 +657,9 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
 	_CHECK_IO(WriteObjectAsCode(v,up,write,_sourcename));
 	_CHECK_IO(WriteObjectAsCode(v,up,write,_sourcename));
 	SafeWriteFmt(v,write,up,",\n\tfunction_name = ");
 	SafeWriteFmt(v,write,up,",\n\tfunction_name = ");
 	_CHECK_IO(WriteObjectAsCode(v,up,write,_name));
 	_CHECK_IO(WriteObjectAsCode(v,up,write,_name));
-	SafeWriteFmt(v,write,up,"\n");
+	SafeWriteFmt(v,write,up,",\n\tfunction_return_type = ");
+	_CHECK_IO(WriteObjectAsCode(v,up,write,_return_type));
+	SafeWriteFmt(v,write,up,",\n");
 
 
 	SafeWriteFmt(v,write,up,"\tliterals = [\n");
 	SafeWriteFmt(v,write,up,"\tliterals = [\n");
 	for(i=0;i<nliterals;i++){
 	for(i=0;i<nliterals;i++){
@@ -679,7 +696,8 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
 		SafeWriteFmt(v,write,up,", %d", lvi._start_op);
 		SafeWriteFmt(v,write,up,", %d", lvi._start_op);
 		SafeWriteFmt(v,write,up,", %d", lvi._end_op);
 		SafeWriteFmt(v,write,up,", %d", lvi._end_op);
 		SafeWriteFmt(v,write,up,", %d", lvi._scope);
 		SafeWriteFmt(v,write,up,", %d", lvi._scope);
-		SafeWriteFmt(v,write,up,", %d],\n", lvi._type);
+		const char* type_name = (sq_type(lvi._type_name) == OT_STRING) ? _stringval(lvi._type_name) : "";
+		SafeWriteFmt(v,write,up,", %d], //%s : %s\n", lvi._type, SQGetVarTypeName(lvi._type), type_name);
 	}
 	}
     SafeWriteFmt(v,write,up,"\t],\n");
     SafeWriteFmt(v,write,up,"\t],\n");
 
 
@@ -854,7 +872,7 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
 	    _CHECK_IO(_funcproto(_functions[i])->SaveAsSource(v,up,write));
 	    _CHECK_IO(_funcproto(_functions[i])->SaveAsSource(v,up,write));
 	    SafeWriteFmt(v,write,up,",\n");
 	    SafeWriteFmt(v,write,up,",\n");
 	}
 	}
-    SafeWriteFmt(v,write,up,"],\n");
+    SafeWriteFmt(v,write,up,"\t],\n");
 
 
 	SafeWriteFmt(v,write,up,"\tstacksize = %d,\n", _stacksize);
 	SafeWriteFmt(v,write,up,"\tstacksize = %d,\n", _stacksize);
 	SafeWriteFmt(v,write,up,"\tbgenerator = %d,\n", _bgenerator);
 	SafeWriteFmt(v,write,up,"\tbgenerator = %d,\n", _bgenerator);

+ 1 - 0
SquiLu/squirrel/sqobject.h

@@ -371,5 +371,6 @@ const SQChar *SQGetNewObjTypeName(int it);
 const SQChar *SQGetArrayAppendTypeName(int it);
 const SQChar *SQGetArrayAppendTypeName(int it);
 const SQChar *SQGetCmpOpName(int it);
 const SQChar *SQGetCmpOpName(int it);
 const SQChar *SQGetBitwiseOpName(int it);
 const SQChar *SQGetBitwiseOpName(int it);
+const SQChar *SQGetVarTypeName(int it);
 
 
 #endif //_SQOBJECT_H_
 #endif //_SQOBJECT_H_