Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_expressions.c
          +++ new/usr/src/tools/smatch/src/smatch_expressions.c
↓ open down ↓ 157 lines elided ↑ open up ↑
 158  158          ret = alloc_tmp_expression(get_cur_pos(), EXPR_STRING);
 159  159          ret->wide = 0;
 160  160          ret->string = string;
 161  161  
 162  162          return ret;
 163  163  }
 164  164  
 165  165  struct expression *gen_expression_from_key(struct expression *arg, const char *key)
 166  166  {
 167  167          struct expression *ret;
 168      -        struct token *token, *end;
      168 +        struct token *token, *prev, *end;
 169  169          const char *p = key;
 170  170          char buf[4095];
 171  171          char *alloc;
 172  172          size_t len;
 173  173  
 174  174          /* The idea is that we can parse either $0->foo or $->foo */
 175  175          if (key[0] != '$')
 176  176                  return NULL;
 177  177          p++;
 178  178          while (*p >= '0' && *p <= '9')
↓ open down ↓ 3 lines elided ↑ open up ↑
 182  182  
 183  183          token = tokenize_buffer(alloc, len, &end);
 184  184          if (!token)
 185  185                  return NULL;
 186  186          if (token_type(token) != TOKEN_STREAMBEGIN)
 187  187                  return NULL;
 188  188          token = token->next;
 189  189  
 190  190          ret = arg;
 191  191          while (token_type(token) == TOKEN_SPECIAL &&
 192      -               token->special == SPECIAL_DEREFERENCE) {
      192 +               (token->special == SPECIAL_DEREFERENCE || token->special == '.')) {
      193 +                prev = token;
 193  194                  token = token->next;
 194  195                  if (token_type(token) != TOKEN_IDENT)
 195  196                          return NULL;
 196  197                  ret = deref_expression(ret);
 197      -                ret = member_expression(ret, '*', token->ident);
      198 +                ret = member_expression(ret,
      199 +                                        (prev->special == SPECIAL_DEREFERENCE) ? '*' : '.',
      200 +                                        token->ident);
 198  201                  token = token->next;
 199  202          }
 200  203  
 201  204          if (token_type(token) != TOKEN_STREAMEND)
 202  205                  return NULL;
 203  206  
 204  207          return ret;
 205  208  }
 206  209  
 207  210  void expr_set_parent_expr(struct expression *expr, struct expression *parent)
↓ open down ↓ 34 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX