Print this page
7085 add support for "if" and "else" statements in dtrace

@@ -21,12 +21,13 @@
  * CDDL HEADER END
  *
  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
+
 /*
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2014 by Delphix. All rights reserved.
  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
  */
 
 #include <dt_impl.h>
 

@@ -153,10 +154,12 @@
 %type   <l_node>        probe_definition
 %type   <l_node>        probe_specifiers
 %type   <l_node>        probe_specifier_list
 %type   <l_node>        probe_specifier
 %type   <l_node>        statement_list
+%type   <l_node>        statement_list_impl
+%type   <l_node>        statement_or_block
 %type   <l_node>        statement
 %type   <l_node>        declaration
 %type   <l_node>        init_declarator_list
 %type   <l_node>        init_declarator
 

@@ -315,21 +318,24 @@
                         if (yypcb->pcb_fileptr != NULL) {
                                 dnerror($1, D_SYNTAX, "expected predicate and/"
                                     "or actions following probe description\n");
                         }
                         $$ = dt_node_clause($1, NULL, NULL);
+                        yybegin(YYS_CLAUSE);
                 }
         |       probe_specifiers '{' statement_list '}' {
                         $$ = dt_node_clause($1, NULL, $3);
+                        yybegin(YYS_CLAUSE);
                 }
         |       probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED {
                         dnerror($3, D_SYNTAX, "expected actions { } following "
                             "probe description and predicate\n");
                 }
         |       probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED
                     '{' statement_list '}' {
                         $$ = dt_node_clause($1, $3, $6);
+                        yybegin(YYS_CLAUSE);
                 }
         ;
 
 probe_specifiers:
                 probe_specifier_list { yybegin(YYS_EXPR); $$ = $1; }

@@ -345,18 +351,36 @@
 probe_specifier:
                 DT_TOK_PSPEC { $$ = dt_node_pdesc_by_name($1); }
         |       DT_TOK_INT   { $$ = dt_node_pdesc_by_id($1); }
         ;
 
-statement_list: statement { $$ = $1; }
-        |       statement_list ';' statement { $$ = LINK($1, $3); }
+statement_list_impl: /* empty */ { $$ = NULL; }
+        |       statement_list_impl statement { $$ = LINK($1, $2); }
         ;
 
-statement:      /* empty */ { $$ = NULL; }
-        |       expression { $$ = dt_node_statement($1); }
+statement_list:
+                statement_list_impl { $$ = $1; }
+        |       statement_list_impl expression {
+                        $$ = LINK($1, dt_node_statement($2));
+                }
         ;
 
+statement_or_block:
+                statement
+        |       '{' statement_list '}' { $$ = $2; }
+
+statement:      ';' { $$ = NULL; }
+        |       expression ';' { $$ = dt_node_statement($1); }
+        |       DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR statement_or_block {
+                        $$ = dt_node_if($3, $5, NULL);
+                }
+        |       DT_KEY_IF DT_TOK_LPAR expression DT_TOK_RPAR
+                statement_or_block DT_KEY_ELSE statement_or_block {
+                        $$ = dt_node_if($3, $5, $7);
+                }
+        ;
+
 argument_expression_list:
                 assignment_expression
         |       argument_expression_list DT_TOK_COMMA assignment_expression {
                         $$ = LINK($1, $3);
                 }