Jacek Caban : jscript: Added support for octal literals.

Alexandre Julliard julliard at winehq.org
Wed Nov 6 11:34:45 CST 2013


Module: wine
Branch: master
Commit: 4d9ea4b5635654cfcd65478a1cc47363ee1798ad
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4d9ea4b5635654cfcd65478a1cc47363ee1798ad

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Nov  6 17:18:28 2013 +0100

jscript: Added support for octal literals.

---

 dlls/jscript/lex.c         |   30 ++++++++++++++++++++++++++----
 dlls/jscript/tests/lang.js |   11 +++++++++++
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index 8b881f3..dfadccd 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -484,15 +484,37 @@ static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
             return tNumericLiteral;
         }
 
+        if(isdigitW(*ctx->ptr)) {
+            unsigned base = 8;
+            const WCHAR *ptr;
+            double val = 0;
+
+            for(ptr = ctx->ptr; ptr < ctx->end && isdigitW(*ptr); ptr++) {
+                if(*ptr > '7') {
+                    base = 10;
+                    break;
+                }
+            }
+
+            do {
+                val = val*base + *ctx->ptr-'0';
+            }while(++ctx->ptr < ctx->end && isdigitW(*ctx->ptr));
+
+            /* FIXME: Do we need it here? */
+            if(ctx->ptr < ctx->end && (is_identifier_char(*ctx->ptr) || *ctx->ptr == '.')) {
+                WARN("wrong char after octal literal: '%c'\n", *ctx->ptr);
+                return lex_error(ctx, JS_E_MISSING_SEMICOLON);
+            }
+
+            *literal = new_double_literal(ctx, val);
+            return tNumericLiteral;
+        }
+
         if(is_identifier_char(*ctx->ptr)) {
             WARN("wrong char after zero\n");
             return lex_error(ctx, E_FAIL);
         }
 
-        if(isdigitW(*ctx->ptr)) {
-            FIXME("octal literals not implemented\n");
-            return lex_error(ctx, E_NOTIMPL);
-        }
     }
 
     return parse_double_literal(ctx, l, literal);
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index bac2deb..ccbdb51 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -38,6 +38,17 @@ ok(1000000*1000000 === 1000000000000, "1000000*1000000 === 1000000000000 is fals
 ok(8.64e15 === 8640000000000000, "8.64e15 !== 8640000000000000");
 ok(1e2147483648 === Infinity, "1e2147483648 !== Infinity");
 
+ok(00 === 0, "00 != 0");
+ok(010 === 8, "010 != 8");
+ok(077 === 63, "077 != 63");
+ok(080 === 80, "080 != 80");
+ok(090 === 90, "090 != 90");
+ok(018 === 18, "018 != 18");
+tmp = 07777777777777777777777;
+ok(typeof(tmp) === "number" && tmp > 0xffffffff, "tmp = " + tmp);
+tmp = 07777777779777777777777;
+ok(typeof(tmp) === "number" && tmp > 0xffffffff, "tmp = " + tmp);
+
 ok(1 !== 2, "1 !== 2 is false");
 ok(null !== undefined, "null !== undefined is false");
 




More information about the wine-cvs mailing list