Explorar o código

Fix compiler bugs found using zzuf tool, also now accepts C++ namespace syntax "::" as an alias to ".", added the samples that crashed the compiler.

mingodad %!s(int64=8) %!d(string=hai) anos
pai
achega
69ab368819

+ 25 - 1
SquiLu/samples/class.nut

@@ -46,4 +46,28 @@ class FakeNamespace.Utils.SuperClass {
 	}
 }
 
-local testy = FakeNamespace.Utils.SuperClass();
+class FakeNamespace::Utils::SuperClass2 {
+	constructor()
+	{
+		::print("FakeNamespace::Utils::SuperClass2")
+	}
+}
+
+local testy = FakeNamespace.Utils.SuperClass();
+
+local testy2 = FakeNamespace::Utils::SuperClass2();
+
+class Base_Window /*extends Fl_Window*/ {
+}
+
+local mw = new Base_Window();
+
+class MainWindow extends Base_Window {
+}
+
+mw = new MainWindow();
+
+class MyMainWindow extends MainWindow {
+}
+
+mw = new MyMainWindow();

+ 9 - 0
SquiLu/samples/crash/crash.js

@@ -0,0 +1,9 @@
+
+function fib(n)
+{
+    if (n < 2) return 1;
+    return fib(n=2) + fib(n-1);
+}
+
+var n=10;
+console.log(n, fib(n));

+ 8 - 0
SquiLu/samples/crash/crash.nut

@@ -0,0 +1,8 @@
+local fib;
+fib = function(n)
+{
+    if (n < 2) return 1;
+    return fib(n=2) + fib(n-1);
+}
+
+fib(10);

+ 4 - 0
SquiLu/samples/crash/crash4.nut

@@ -0,0 +1,4 @@
+class!A {
+	conwtructor(){
+	}
+}

+ 8 - 0
SquiLu/samples/crash/do-zzuf

@@ -0,0 +1,8 @@
+#zzuf-env zzuf -s 0:10000 -c -C 0 -q -T 3 squilu fibo.nut
+#zzuf-env zzuf -s 0:10000 -c -C 0 -q -T 3 squilu test-bitwise.nut
+#zzuf-env zzuf -s 0:10000 -c -C 0 -q -T 3 squilu test-re.nut
+#zzuf-env zzuf -s 0:100000 -c -C 0 -q -T 3 squilu test-re2.nut
+#zzuf-env zzuf -s 0:10000 -c -C 0 -q -T 3 squilu csv-lib.nut
+zzuf-env zzuf -s 0:10000 -c -C 0 -q -T 3 squilu squilu-test.nut
+
+

+ 7 - 0
SquiLu/samples/crash/do-zzuf-samples

@@ -0,0 +1,7 @@
+#!/bin/sh
+srcPath="/home/mingo/dev/squilu-git/SquiLu/samples/test-*.nut"
+for fn in $srcPath
+do
+    echo $fn
+    zzuf-env zzuf -s 0:1000 -c -C 0 -q -T 3 squilu $fn
+done

+ 15 - 0
SquiLu/samples/crash/fibo.nut

@@ -0,0 +1,15 @@
+/*
+*
+* Original Javascript version by David Hedbor(http://www.bagley.org/~doug/shootout/)
+*
+*/
+
+int32_t fib(int32_t n)
+{
+    if (n < 2) return 1;
+    return fib(n-2) + fib(n-1);
+}
+
+int32_t n = vargv.len()>1?vargv[1].tointeger():10;
+
+print(n, fib(n));

+ 6 - 0
SquiLu/samples/crash/gen-failure

@@ -0,0 +1,6 @@
+#zzuf-env zzuf -r 0.004 -s 1878 < fibo.nut > crash.nut
+zzuf-env zzuf -r 0.004 -s 121 < /home/mingo/dev/squilu-git/SquiLu/samples/test-class-destructor.nut > crash2.nut
+zzuf-env zzuf -r 0.004 -s 635 < /home/mingo/dev/squilu-git/SquiLu/samples/test-class-destructor.nut > crash3.nut
+zzuf-env zzuf -r 0.004 -s 121 < /home/mingo/dev/squilu-git/SquiLu/samples/test-class-name-resolution.nut > crash4.nut
+zzuf-env zzuf -r 0.004 -s 273 < /home/mingo/dev/squilu-git/SquiLu/samples/test-class-static.nut > crash5.nut
+

+ 14 - 0
SquiLu/samples/crash/test-bitwise.nut

@@ -0,0 +1,14 @@
+local nbits = 31;
+local one = 1;
+local expected = 0;
+local zero = 0;
+for(local i=0; i < nbits; ++i)
+{
+	local bit = i+1;
+	local value = zero;
+	value |= bit;
+	local value1 = zero | bit;
+	local value2 = value1 & (~value1)
+	//print(i, value, value1, value2);
+	//if(value != value1) throw("Unexpected result");
+}

+ 3 - 0
SquiLu/samples/crash/test-re.nut

@@ -0,0 +1,3 @@
+local a = "aaa aa a aaa a".gsub("%f[%w]a", "x");
+if(a == "xaa xa x xaa x") a = 1;
+else a = 0;

+ 19 - 0
SquiLu/samples/crash/test-re2.nut

@@ -0,0 +1,19 @@
+const RE_E_OK = 1;
+const RE_E_FAIL = 2;
+const RE_E_SYNTAX = 3;
+const RE_E_NOTIMPL = 3;
+
+local function re_match(re_str, test_str)
+{
+	local result;
+	try {
+		local re = regexp(re_str);
+		result = (re.match(test_str) != null) ? RE_E_OK : RE_E_FAIL;
+	} catch(e) {result = RE_E_SYNTAX;}
+	return result;
+}
+
+local a = re_match("a{,2}b{2,4}", "aabbbb") == RE_E_OK;
+a = re_match("a{0,2}b{2,4}", "aabbbb") == RE_E_FAIL;
+a = re_match("0[xX][\\da-fA-F]{1,4}", "0x12a6") == RE_E_SYNTAX;
+ 

+ 15 - 5
SquiLu/squirrel/sqcompiler.cpp

@@ -1473,6 +1473,7 @@ start_again:
         {
             switch(_token)
             {
+            case TK_DOUBLE_COLON: //C++ style namespace
             case _SC('.'):
                 pos = -1;
                 Lex();
@@ -1898,11 +1899,12 @@ start_again:
             //Warning("Keyword ignored \"%s\" at line %d:%d\n", _lex.Tok2Str(_token),
             //        _lex.data->currentline, _lex.data->currentcolumn);
             Lex();
-            Factor();
+            return Factor();
             break;
         default:
             Error(_SC("expression expected"));
         }
+        _es.etype = EXPR;
         return -1;
     }
     void EmitLoadConstInt(SQInteger value,SQInteger target)
@@ -1969,7 +1971,7 @@ start_again:
             }
             break;
         }
-        return (!_es.donot_get || ( _es.donot_get && (_token == _SC('.') || _token == _SC('['))));
+        return (!_es.donot_get || ( _es.donot_get && (_token == _SC('.') || _token == _SC('[') || _token == TK_DOUBLE_COLON)));
     }
     void FunctionCallArgs(bool rawcall = false)
     {
@@ -2782,9 +2784,17 @@ lbl_commaexpr:
         Lex();
         if(_token == TK_IDENTIFIER)
         {
-            class_name = SQString::Create(_ss(_vm), _lex.data->svalue);
-            CheckGlobalName(class_name, true);
-            CheckTypeName(class_name, true); //to allow C/C++ style instance declarations
+            SQInteger lhtk = _lex.LookaheadLex();
+            switch(lhtk)
+            {
+            case TK_DOUBLE_COLON: //C++ style namespace
+            case _SC('.'):
+            break;
+            default:
+                class_name = SQString::Create(_ss(_vm), _lex.data->svalue);
+                CheckGlobalName(class_name, true);
+                CheckTypeName(class_name, true); //to allow C/C++ style instance declarations
+            }
         }
         es = _es;
         _es.donot_get = true;