Matteo Bruni : d3dcompiler: Parse "return" statement.

Alexandre Julliard julliard at winehq.org
Tue Sep 18 14:04:31 CDT 2012


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

Author: Matteo Bruni <mbruni at codeweavers.com>
Date:   Tue Sep 18 18:18:08 2012 +0200

d3dcompiler: Parse "return" statement.

---

 dlls/d3dcompiler_43/d3dcompiler_private.h |   22 +++++++++++++++++
 dlls/d3dcompiler_43/hlsl.y                |   31 ++++++++++++++++++-----
 dlls/d3dcompiler_43/utils.c               |   37 +++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+), 7 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 28e77d3..eb75448 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -706,6 +706,7 @@ enum hlsl_ir_node_type
     HLSL_IR_DEREF,
     HLSL_IR_EXPR,
     HLSL_IR_FUNCTION_DECL,
+    HLSL_IR_JUMP,
     HLSL_IR_SWIZZLE,
 };
 
@@ -837,6 +838,21 @@ struct hlsl_ir_expr
     struct list *subexpressions;
 };
 
+enum hlsl_ir_jump_type
+{
+    HLSL_IR_JUMP_BREAK,
+    HLSL_IR_JUMP_CONTINUE,
+    HLSL_IR_JUMP_DISCARD,
+    HLSL_IR_JUMP_RETURN,
+};
+
+struct hlsl_ir_jump
+{
+    struct hlsl_ir_node node;
+    enum hlsl_ir_jump_type type;
+    struct hlsl_ir_node *return_value;
+};
+
 struct hlsl_ir_swizzle
 {
     struct hlsl_ir_node node;
@@ -1003,6 +1019,12 @@ static inline struct hlsl_ir_constant *constant_from_node(const struct hlsl_ir_n
     return CONTAINING_RECORD(node, struct hlsl_ir_constant, node);
 }
 
+static inline struct hlsl_ir_jump *jump_from_node(const struct hlsl_ir_node *node)
+{
+    assert(node->type == HLSL_IR_JUMP);
+    return CONTAINING_RECORD(node, struct hlsl_ir_jump, node);
+}
+
 static inline struct hlsl_ir_assignment *assignment_from_node(const struct hlsl_ir_node *node)
 {
     assert(node->type == HLSL_IR_ASSIGNMENT);
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 35c9a4c..75b5741 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -497,6 +497,7 @@ static struct hlsl_ir_swizzle *get_swizzle(struct hlsl_ir_node *value, const cha
 %type <list> statement
 %type <list> statement_list
 %type <list> compound_statement
+%type <list> jump_statement
 %type <function> func_declaration
 %type <function> func_prototype
 %type <parameter> parameter
@@ -990,16 +991,32 @@ statement_list:           statement
                             }
 
 statement:                declaration_statement
-                            {
-                                $$ = $1;
-                            }
                         | expr_statement
-                            {
-                                $$ = $1;
-                            }
                         | compound_statement
+                        | jump_statement
+
+                          /* FIXME: add rule for return with no value */
+jump_statement:           KW_RETURN expr ';'
                             {
-                                $$ = $1;
+                                struct hlsl_ir_jump *jump = d3dcompiler_alloc(sizeof(*jump));
+                                if (!jump)
+                                {
+                                    ERR("Out of memory\n");
+                                    return -1;
+                                }
+                                jump->node.type = HLSL_IR_JUMP;
+                                set_location(&jump->node.loc, &@1);
+                                jump->type = HLSL_IR_JUMP_RETURN;
+                                jump->node.data_type = $2->data_type;
+                                jump->return_value = $2;
+
+                                FIXME("Check for valued return on void function.\n");
+                                FIXME("Implicit conversion to the return type if needed, "
+				        "error out if conversion not possible.\n");
+
+                                $$ = d3dcompiler_alloc(sizeof(*$$));
+                                list_init($$);
+                                list_add_tail($$, &jump->node.entry);
                             }
 
 expr_statement:           ';'
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index c403a98..e0d351c 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -1742,6 +1742,8 @@ static const char *debug_node_type(enum hlsl_ir_node_type type)
         "HLSL_IR_DEREF",
         "HLSL_IR_EXPR",
         "HLSL_IR_FUNCTION_DECL",
+        "HLSL_IR_JUMP",
+        "HLSL_IR_SWIZZLE",
     };
 
     if (type >= sizeof(names) / sizeof(names[0]))
@@ -1973,6 +1975,28 @@ static void debug_dump_ir_swizzle(const struct hlsl_ir_swizzle *swizzle)
     }
 }
 
+static void debug_dump_ir_jump(const struct hlsl_ir_jump *jump)
+{
+    switch (jump->type)
+    {
+        case HLSL_IR_JUMP_BREAK:
+            TRACE("break");
+            break;
+        case HLSL_IR_JUMP_CONTINUE:
+            TRACE("continue");
+            break;
+        case HLSL_IR_JUMP_DISCARD:
+            TRACE("discard");
+            break;
+        case HLSL_IR_JUMP_RETURN:
+            TRACE("return ");
+            if (jump->return_value)
+                debug_dump_instr(jump->return_value);
+            TRACE(";");
+            break;
+    }
+}
+
 static void debug_dump_instr(const struct hlsl_ir_node *instr)
 {
     switch (instr->type)
@@ -1995,6 +2019,9 @@ static void debug_dump_instr(const struct hlsl_ir_node *instr)
         case HLSL_IR_CONSTRUCTOR:
             debug_dump_ir_constructor(constructor_from_node(instr));
             break;
+        case HLSL_IR_JUMP:
+            debug_dump_ir_jump(jump_from_node(instr));
+            break;
         default:
             TRACE("No dump function for %s\n", debug_node_type(instr->type));
     }
@@ -2132,6 +2159,13 @@ static void free_ir_assignment(struct hlsl_ir_assignment *assignment)
     d3dcompiler_free(assignment);
 }
 
+static void free_ir_jump(struct hlsl_ir_jump *jump)
+{
+    if (jump->type == HLSL_IR_JUMP_RETURN)
+        free_instr(jump->return_value);
+    d3dcompiler_free(jump);
+}
+
 void free_instr(struct hlsl_ir_node *node)
 {
     switch (node->type)
@@ -2157,6 +2191,9 @@ void free_instr(struct hlsl_ir_node *node)
         case HLSL_IR_ASSIGNMENT:
             free_ir_assignment(assignment_from_node(node));
             break;
+        case HLSL_IR_JUMP:
+            free_ir_jump(jump_from_node(node));
+            break;
         default:
             FIXME("Unsupported node type %s\n", debug_node_type(node->type));
     }




More information about the wine-cvs mailing list