Branch: Tag:

2008-07-08

2008-07-08 19:19:33 by Henrik Grubbström (Grubba) <grubba@grubba.org>

__func__ now supports local functions.
Fixed typo in behaviour when arrow-indexing with __func__.

Rev: src/language.yacc:1.442

2:   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: language.yacc,v 1.441 2008/06/29 12:50:04 nilsson Exp $ + || $Id: language.yacc,v 1.442 2008/07/08 19:19:33 grubba Exp $   */      %pure_parser
157:   /* #define LAMBDA_DEBUG 1 */      static void yyerror_reserved(const char *keyword); - static struct pike_string *get_new_name(); + static struct pike_string *get_new_name(struct pike_string *prefix);   int add_local_name(struct pike_string *, struct pike_type *, node *);   int low_add_local_name(struct compiler_frame *,    struct pike_string *, struct pike_type *, node *);
1281:    | TOK_MULTISET_ID { $$ = "multiset"; }    | TOK_OBJECT_ID { $$ = "object"; }    | TOK_FUNCTION_ID { $$ = "function"; } -  | TOK_FUNCTION_NAME { $$ = "__FUNCTION__"; } +  | TOK_FUNCTION_NAME { $$ = "__func__"; }    | TOK_PROGRAM_ID { $$ = "program"; }    | TOK_STRING_ID { $$ = "string"; }    | TOK_FLOAT_ID { $$ = "float"; }
2152:   implicit_identifier: /* empty */    {    struct pike_string *name; -  $$=mkstrnode(name = get_new_name()); +  $$=mkstrnode(name = get_new_name(NULL));    free_string(name);    }    ;
2340:    type=compiler_pop_type();    /***/    -  name = get_new_name(); +  name = get_new_name($1->u.sval.u.string);      #ifdef LAMBDA_DEBUG    fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n",
2473:    type=compiler_pop_type();    /***/    -  name = get_new_name(); +  name = get_new_name($2->u.sval.u.string);      #ifdef LAMBDA_DEBUG    fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n",
3507:       type=compiler_pop_type();    -  name = get_new_name(); +  name = get_new_name(NULL);      #ifdef LAMBDA_DEBUG    fprintf(stderr, "%d: IMPLICIT LAMBDA: %s 0x%08lx 0x%08lx\n",
4305:    } else {    struct identifier *id =    ID_FROM_INT(Pike_compiler->new_program, f->current_function_number); +  if (!id->name->size_shift) { +  int len; +  if ((len = strlen(id->name->str)) == id->name->len) { +  /* Most common case. */    $$ = mkstrnode(id->name); -  +  } else { +  struct pike_string *str = +  make_shared_binary_string(id->name->str, len); +  $$ = mkstrnode(str); +  free_string(str);    } -  +  } else { +  struct pike_string *str; +  struct array *split; +  MAKE_CONST_STRING(str, "\0"); +  split = explode(id->name, str); +  $$ = mkstrnode(split->item->u.string); +  free_array(split);    } -  +  } +  }    ;      string: string_segment
4455:    my_yyerror("%s is a reserved word.", keyword);   }    - static struct pike_string *get_new_name() + static struct pike_string *get_new_name(struct pike_string *prefix)   {    char buf[40];    /* Generate a name for a global symbol... */
4463:    (long)Pike_compiler->new_program->id,    (long)(Pike_compiler->local_class_counter++ & 0xffffffff), /* OSF/1 cc bug. */    (int) THIS_COMPILATION->lex.current_line); +  if (prefix) { +  struct string_builder sb; +  init_string_builder_alloc(&sb, prefix->len + strlen(buf) + 1, +  prefix->size_shift); +  string_builder_shared_strcat(&sb, prefix); +  string_builder_putchar(&sb, 0); +  string_builder_strcat(&sb, buf); +  return finish_string_builder(&sb); +  }    return make_shared_string(buf);   }   
4626:    p = p->previous;    }    -  tmp_name = get_new_name(); +  tmp_name = get_new_name(name);    id = define_parent_variable(p, tmp_name, type,    ID_PROTECTED|ID_PRIVATE|ID_INLINE);    free_string(tmp_name);
4643:    }    } else if (depth) {    f->lexical_scope|=SCOPE_SCOPE_USED; -  tmp_name = get_new_name(); +  tmp_name = get_new_name(name);    id = low_add_local_name(f, tmp_name, type, NULL);    free_string(tmp_name);    if(f->min_number_of_locals < id+1)