jscript: Fix parse_double_literal implementation.
diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index c066397..5b7e7a4 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -31,6 +31,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
 
+#define LONGLONG_MAX (((LONGLONG)0x7fffffff<<32)|0xffffffff)
+
 static const WCHAR breakW[] = {'b','r','e','a','k',0};
 static const WCHAR caseW[] = {'c','a','s','e',0};
 static const WCHAR catchW[] = {'c','a','t','c','h',0};
@@ -373,7 +375,8 @@
 
 static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **literal)
 {
-    double d, tmp = 1.0;
+    LONGLONG d, hlp;
+    int exp = 0;
 
     if(ctx->ptr == ctx->end || (!isdigitW(*ctx->ptr) &&
         *ctx->ptr!='.' && *ctx->ptr!='e' && *ctx->ptr!='E')) {
@@ -382,13 +385,32 @@
     }
 
     d = int_part;
-    while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
-        d = d*10 + *(ctx->ptr++) - '0';
+    while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
+        hlp = d*10 + *(ctx->ptr++) - '0';
+        if(d>LONGLONG_MAX/10 || hlp<0) {
+            exp++;
+            break;
+        }
+        else
+            d = hlp;
+    }
+    while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
+        exp++;
+        ctx->ptr++;
+    }
 
     if(*ctx->ptr == '.') ctx->ptr++;
 
+    while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
+        hlp = d*10 + *(ctx->ptr++) - '0';
+        if(d>LONGLONG_MAX/10 || hlp<0)
+            break;
+
+        d = hlp;
+        exp--;
+    }
     while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
-        d += (tmp /= 10.0)*(*ctx->ptr++ - '0');
+        ctx->ptr++;
 
     if(ctx->ptr < ctx->end && (*ctx->ptr == 'e' || *ctx->ptr == 'E')) {
         int sign = 1, e = 0;
@@ -411,16 +433,20 @@
             return lex_error(ctx, E_FAIL);
         }
 
-        while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
-            e = e*10 + *ctx->ptr++ - '0';
+        while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
+            if(e > INT_MAX/10 || (e = e*10 + *ctx->ptr++ - '0')<0)
+                e = INT_MAX;
+        }
         e *= sign;
 
-        d *= pow(10, e);
+        if(exp<0 && e<0 && e+exp>0) exp = INT_MIN;
+        else if(exp>0 && e>0 && e+exp<0) exp = INT_MAX;
+        else exp += e;
     }
 
     *literal = parser_alloc(ctx, sizeof(literal_t));
     (*literal)->vt = VT_R8;
-    (*literal)->u.dval = d;
+    (*literal)->u.dval = (double)d*pow(10, exp);
 
     return tNumericLiteral;
 }