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);
}