this shouldn't be in svn
[supertux.git] / src / squirrel / squirrel / sqcompiler.cpp
index ed99a73..464a0c0 100644 (file)
@@ -303,7 +303,8 @@ public:
                case TK_MULEQ: oper = '*'; break;\r
                case TK_DIVEQ: oper = '/'; break;\r
                case TK_MODEQ: oper = '%'; break;\r
-               default: assert(0); break;\r
+               default: oper = 0; //shut up compiler\r
+                       assert(0); break;\r
                };\r
                if(deref) {\r
                        SQInteger val = _fs->PopTarget();\r
@@ -636,9 +637,15 @@ public:
                        _fs->AddInstruction(_OP_LOADNULLS, _fs->PushTarget(),1);\r
                        Lex();\r
                        break;\r
-               case TK_INTEGER: \r
-                       _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetNumericConstant(_lex._nvalue));\r
+               case TK_INTEGER: {\r
+                       if((_lex._nvalue & (~0x7FFFFFFF)) == 0) { //does it fit in 32 bits?\r
+                               _fs->AddInstruction(_OP_LOADINT, _fs->PushTarget(),_lex._nvalue);\r
+                       }\r
+                       else {\r
+                               _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetNumericConstant(_lex._nvalue));\r
+                       }\r
                        Lex();\r
+                                                }\r
                        break;\r
                case TK_FLOAT: \r
                        _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetNumericConstant(_lex._fvalue));\r
@@ -727,11 +734,18 @@ public:
                \r
                while(_token != terminator) {\r
                        bool hasattrs = false;\r
+                       bool isstatic = false;\r
                        //check if is an attribute\r
-                       if(separator == ';' && _token == TK_ATTR_OPEN) {\r
-                               _fs->AddInstruction(_OP_NEWTABLE, _fs->PushTarget()); Lex();\r
-                               ParseTableOrClass(',',TK_ATTR_CLOSE);\r
-                               hasattrs = true;\r
+                       if(separator == ';') {\r
+                               if(_token == TK_ATTR_OPEN) {\r
+                                       _fs->AddInstruction(_OP_NEWTABLE, _fs->PushTarget()); Lex();\r
+                                       ParseTableOrClass(',',TK_ATTR_CLOSE);\r
+                                       hasattrs = true;\r
+                               }\r
+                               if(_token == TK_STATIC) {\r
+                                       isstatic = true;\r
+                                       Lex();\r
+                               }\r
                        }\r
                        switch(_token) {\r
                                case TK_FUNCTION:\r
@@ -760,9 +774,10 @@ public:
                        SQInteger key = _fs->PopTarget();\r
                        SQInteger attrs = hasattrs ? _fs->PopTarget():-1;\r
                        assert(hasattrs && attrs == key-1 || !hasattrs);\r
+                       unsigned char flags = (hasattrs?NEW_SLOT_ATTRIBUTES_FLAG:0)|(isstatic?NEW_SLOT_STATIC_FLAG:0);\r
                        SQInteger table = _fs->TopTarget(); //<<BECAUSE OF THIS NO COMMON EMIT FUNC IS POSSIBLE\r
-                       _fs->AddInstruction(hasattrs?_OP_NEWSLOTA:_OP_NEWSLOT, _fs->PushTarget(), table, key, val);\r
-                       _fs->PopTarget();\r
+                       _fs->AddInstruction(_OP_NEWSLOTA, flags, table, key, val);\r
+                       //_fs->PopTarget();\r
                }\r
                if(separator == _SC(',')) //hack recognizes a table from the separator\r
                        _fs->SetIntructionParam(tpos, 1, nkeys);\r
@@ -943,6 +958,7 @@ public:
                SQInteger __nbreaks__ = _fs->_unresolvedbreaks.size();\r
                _fs->_breaktargets.push_back(0);\r
                while(_token == TK_CASE) {\r
+                       //_fs->AddLineInfos(_lex._currentline, _lineinfo); think about this one\r
                        if(!bfirst) {\r
                                _fs->AddInstruction(_OP_JMP, 0, 0);\r
                                skipcondjmp = _fs->GetCurrentPos();\r
@@ -966,6 +982,7 @@ public:
                if(tonextcondjmp != -1)\r
                        _fs->SetIntructionParam(tonextcondjmp, 1, _fs->GetCurrentPos() - tonextcondjmp);\r
                if(_token == TK_DEFAULT) {\r
+               //      _fs->AddLineInfos(_lex._currentline, _lineinfo);\r
                        Lex(); Expect(_SC(':'));\r
                        SQInteger stacksize = _fs->GetStackSize();\r
                        Statements();\r