Jacek Caban : jscript: Return double from parse_numeric_literal and parse_double_literal.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Sep 30 14:28:29 CDT 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep 30 16:51:24 2014 +0200

jscript: Return double from parse_numeric_literal and parse_double_literal.

---

 dlls/jscript/lex.c | 58 +++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 38 insertions(+), 20 deletions(-)

diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index 7318838..1796aed 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -388,7 +388,7 @@ literal_t *new_boolean_literal(parser_ctx_t *ctx, BOOL bval)
     return ret;
 }
 
-static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **literal)
+static BOOL parse_double_literal(parser_ctx_t *ctx, LONG int_part, double *ret)
 {
     LONGLONG d, hlp;
     int exp = 0;
@@ -435,13 +435,15 @@ static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **li
                 ctx->ptr++;
             }else if(!isdigitW(*ctx->ptr)) {
                 WARN("Expected exponent part\n");
-                return lex_error(ctx, E_FAIL);
+                lex_error(ctx, E_FAIL);
+                return FALSE;
             }
         }
 
         if(ctx->ptr == ctx->end) {
             WARN("unexpected end of file\n");
-            return lex_error(ctx, E_FAIL);
+            lex_error(ctx, E_FAIL);
+            return FALSE;
         }
 
         while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
@@ -457,14 +459,15 @@ static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **li
 
     if(is_identifier_char(*ctx->ptr)) {
         WARN("wrong char after zero\n");
-        return lex_error(ctx, JS_E_MISSING_SEMICOLON);
+        lex_error(ctx, JS_E_MISSING_SEMICOLON);
+        return FALSE;
     }
 
-    *literal = new_double_literal(ctx, exp>=0 ? d*pow(10, exp) : d/pow(10, -exp));
-    return tNumericLiteral;
+    *ret = exp>=0 ? d*pow(10, exp) : d/pow(10, -exp);
+    return TRUE;
 }
 
-static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
+static BOOL parse_numeric_literal(parser_ctx_t *ctx, double *ret)
 {
     LONG l, d;
 
@@ -473,7 +476,7 @@ static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
         if(*ctx->ptr == 'x' || *ctx->ptr == 'X') {
             if(++ctx->ptr == ctx->end) {
                 ERR("unexpected end of file\n");
-                return 0;
+                return FALSE;
             }
 
             while(ctx->ptr < ctx->end && (d = hex_to_int(*ctx->ptr)) != -1) {
@@ -483,11 +486,12 @@ static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
 
             if(ctx->ptr < ctx->end && is_identifier_char(*ctx->ptr)) {
                 WARN("unexpected identifier char\n");
-                return lex_error(ctx, JS_E_MISSING_SEMICOLON);
+                lex_error(ctx, JS_E_MISSING_SEMICOLON);
+                return FALSE;
             }
 
-            *literal = new_double_literal(ctx, l);
-            return tNumericLiteral;
+            *ret = l;
+            return TRUE;
         }
 
         if(isdigitW(*ctx->ptr)) {
@@ -509,20 +513,22 @@ static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
             /* 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);
+                lex_error(ctx, JS_E_MISSING_SEMICOLON);
+                return FALSE;
             }
 
-            *literal = new_double_literal(ctx, val);
-            return tNumericLiteral;
+            *ret = val;
+            return TRUE;
         }
 
         if(is_identifier_char(*ctx->ptr)) {
             WARN("wrong char after zero\n");
-            return lex_error(ctx, JS_E_MISSING_SEMICOLON);
+            lex_error(ctx, JS_E_MISSING_SEMICOLON);
+            return FALSE;
         }
     }
 
-    return parse_double_literal(ctx, l, literal);
+    return parse_double_literal(ctx, l, ret);
 }
 
 static int next_token(parser_ctx_t *ctx, void *lval)
@@ -550,8 +556,15 @@ static int next_token(parser_ctx_t *ctx, void *lval)
         return parse_identifier(ctx, lval);
     }
 
-    if(isdigitW(*ctx->ptr))
-        return parse_numeric_literal(ctx, lval);
+    if(isdigitW(*ctx->ptr)) {
+        double n;
+
+        if(!parse_numeric_literal(ctx, &n))
+            return -1;
+
+        *(literal_t**)lval = new_double_literal(ctx, n);
+        return tNumericLiteral;
+    }
 
     switch(*ctx->ptr) {
     case '{':
@@ -571,8 +584,13 @@ static int next_token(parser_ctx_t *ctx, void *lval)
         return '}';
 
     case '.':
-        if(++ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
-            return parse_double_literal(ctx, 0, lval);
+        if(++ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
+            double n;
+            if(!parse_double_literal(ctx, 0, &n))
+                return -1;
+            *(literal_t**)lval = new_double_literal(ctx, n);
+            return tNumericLiteral;
+        }
         return '.';
 
     case '<':




More information about the wine-cvs mailing list