Jacek Caban : jscript: Added new ccval_t type for CC variable values.

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


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

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

jscript: Added new ccval_t type for CC variable values.

---

 dlls/jscript/lex.c    | 43 +++++++++++++------------------------------
 dlls/jscript/parser.h | 24 ++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c
index 1796aed..8d8e2d9 100644
--- a/dlls/jscript/lex.c
+++ b/dlls/jscript/lex.c
@@ -789,11 +789,7 @@ static int next_token(parser_ctx_t *ctx, void *lval)
 }
 
 struct _cc_var_t {
-    BOOL is_num;
-    union {
-        BOOL b;
-        DOUBLE n;
-    } u;
+    ccval_t val;
     struct _cc_var_t *next;
     unsigned name_len;
     WCHAR name[0];
@@ -811,18 +807,18 @@ void release_cc(cc_ctx_t *cc)
     heap_free(cc);
 }
 
-static BOOL add_cc_var(cc_ctx_t *cc, const WCHAR *name, cc_var_t *v)
+static BOOL new_cc_var(cc_ctx_t *cc, const WCHAR *name, int len, ccval_t v)
 {
     cc_var_t *new_v;
-    unsigned len;
 
-    len = strlenW(name);
+    if(len == -1)
+        len = strlenW(name);
 
     new_v = heap_alloc(sizeof(cc_var_t) + (len+1)*sizeof(WCHAR));
     if(!new_v)
         return FALSE;
 
-    memcpy(new_v, v, sizeof(*v));
+    new_v->val = v;
     memcpy(new_v->name, name, (len+1)*sizeof(WCHAR));
     new_v->name_len = len;
     new_v->next = cc->vars;
@@ -845,7 +841,6 @@ static cc_var_t *find_cc_var(cc_ctx_t *cc, const WCHAR *name, unsigned name_len)
 static int init_cc(parser_ctx_t *ctx)
 {
     cc_ctx_t *cc;
-    cc_var_t v;
 
     static const WCHAR _win32W[] = {'_','w','i','n','3','2',0};
     static const WCHAR _win64W[] = {'_','w','i','n','6','4',0};
@@ -863,24 +858,12 @@ static int init_cc(parser_ctx_t *ctx)
         return lex_error(ctx, E_OUTOFMEMORY);
 
     cc->vars = NULL;
-    v.is_num = FALSE;
-    v.u.b = TRUE;
-    if(!add_cc_var(cc, _jscriptW, &v)
-       || !add_cc_var(cc, sizeof(void*) == 8 ? _win64W : _win32W, &v)
-       || !add_cc_var(cc, sizeof(void*) == 8 ? _amd64W : _x86W, &v)) {
-        release_cc(cc);
-        return lex_error(ctx, E_OUTOFMEMORY);
-    }
-
-    v.is_num = TRUE;
-    v.u.n = JSCRIPT_BUILD_VERSION;
-    if(!add_cc_var(cc, _jscript_buildW, &v)) {
-        release_cc(cc);
-        return lex_error(ctx, E_OUTOFMEMORY);
-    }
 
-    v.u.n = JSCRIPT_MAJOR_VERSION + (DOUBLE)JSCRIPT_MINOR_VERSION/10.0;
-    if(!add_cc_var(cc, _jscript_versionW, &v)) {
+    if(!new_cc_var(cc, _jscriptW, -1, ccval_bool(TRUE))
+       || !new_cc_var(cc, sizeof(void*) == 8 ? _win64W : _win32W, -1, ccval_bool(TRUE))
+       || !new_cc_var(cc, sizeof(void*) == 8 ? _amd64W : _x86W, -1, ccval_bool(TRUE))
+       || !new_cc_var(cc, _jscript_versionW, -1, ccval_num(JSCRIPT_MAJOR_VERSION + (DOUBLE)JSCRIPT_MINOR_VERSION/10.0))
+       || !new_cc_var(cc, _jscript_buildW, -1, ccval_num(JSCRIPT_BUILD_VERSION))) {
         release_cc(cc);
         return lex_error(ctx, E_OUTOFMEMORY);
     }
@@ -941,12 +924,12 @@ static int cc_token(parser_ctx_t *ctx, void *lval)
 
     var = find_cc_var(ctx->script->cc, ctx->ptr, id_len);
     ctx->ptr += id_len;
-    if(!var || var->is_num) {
-        *(literal_t**)lval = new_double_literal(ctx, var ? var->u.n : NAN);
+    if(!var || var->val.is_num) {
+        *(literal_t**)lval = new_double_literal(ctx, var ? var->val.u.n : NAN);
         return tNumericLiteral;
     }
 
-    *(literal_t**)lval = new_boolean_literal(ctx, var->u.b);
+    *(literal_t**)lval = new_boolean_literal(ctx, var->val.u.b);
     return tBooleanLiteral;
 }
 
diff --git a/dlls/jscript/parser.h b/dlls/jscript/parser.h
index ff50cb1..5d15bc3 100644
--- a/dlls/jscript/parser.h
+++ b/dlls/jscript/parser.h
@@ -20,6 +20,14 @@ typedef struct _source_elements_t source_elements_t;
 typedef struct _expression_t expression_t;
 typedef struct _statement_t statement_t;
 
+typedef struct {
+    BOOL is_num;
+    union {
+        BOOL b;
+        double n;
+    } u;
+} ccval_t;
+
 typedef struct _parser_ctx_t {
     const WCHAR *begin;
     const WCHAR *end;
@@ -352,3 +360,19 @@ typedef struct {
     expression_t expr;
     prop_val_t *property_list;
 } property_value_expression_t;
+
+static inline ccval_t ccval_num(double n)
+{
+    ccval_t r;
+    r.is_num = TRUE;
+    r.u.n = n;
+    return r;
+}
+
+static inline ccval_t ccval_bool(BOOL b)
+{
+    ccval_t r;
+    r.is_num = FALSE;
+    r.u.b = b;
+    return r;
+}




More information about the wine-cvs mailing list