e576bb2002-10-11Martin Nilsson /* -*- c -*- || 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. */
1b10db2002-10-08Martin Nilsson 
3c7fe72015-12-28Per Hedbor %pure-parser
f76b4c2000-05-11Henrik Grubbström (Grubba) 
70c3b12016-12-14Henrik Grubbström (Grubba) /* Expect a single shift/reduce conflict (dangling else). */
3c0f892017-12-10Henrik Grubbström (Grubba) %expect 2
70c3b12016-12-14Henrik Grubbström (Grubba) 
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_ARROW "->"
215bed1996-09-28Fredrik Hübinette (Hubbe)  /* * Basic value pushing */
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_CONSTANT "constant" %token TOK_FLOAT "float literal" %token TOK_STRING "string literal" %token TOK_NUMBER "integer literal"
f76b4c2000-05-11Henrik Grubbström (Grubba) 
215bed1996-09-28Fredrik Hübinette (Hubbe) /* * These are the predefined functions that can be accessed from Pike. */
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_INC "++" %token TOK_DEC "--" %token TOK_RETURN "return" %token TOK_EQ "==" %token TOK_GE ">=" %token TOK_LE "<=" %token TOK_NE "!=" %token TOK_NOT "!" %token TOK_LSH "<<" %token TOK_RSH ">>" %token TOK_LAND "&&" %token TOK_LOR "||" %token TOK_SWITCH "switch" %token TOK_SSCANF "sscanf" %token TOK_CATCH "catch" %token TOK_FOREACH "foreach"
215bed1996-09-28Fredrik Hübinette (Hubbe) 
db271d1998-04-27Henrik Grubbström (Grubba) /* This is the end of file marker used by the lexer * to enable nicer EOF in error handling. */
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_LEX_EOF "end of file" %token TOK_ADD_EQ "+=" %token TOK_AND_EQ "&=" %token TOK_ARRAY_ID "array" %token TOK_ATTRIBUTE_ID "__attribute__" %token TOK_BREAK "break" %token TOK_CASE "case" %token TOK_CLASS "class" %token TOK_COLON_COLON "::" %token TOK_CONTINUE "continue" %token TOK_DEFAULT "default" %token TOK_DEPRECATED_ID "__deprecated__" %token TOK_DIV_EQ "/=" %token TOK_DO "do" %token TOK_DOT_DOT ".." %token TOK_DOT_DOT_DOT "..." %token TOK_ELSE "else" %token TOK_ENUM "enum" %token TOK_EXTERN "extern" %token TOK_FLOAT_ID "float" %token TOK_FOR "for" %token TOK_FUNCTION_ID "function" %token TOK_GAUGE "gauge" %token TOK_GLOBAL "global" %token TOK_IDENTIFIER "identifier" %token TOK_RESERVED "reserved identifier" %token TOK_IF "if" %token TOK_IMPORT "import" %token TOK_INHERIT "inherit" %token TOK_INLINE "inline" %token TOK_LOCAL_ID "local" %token TOK_FINAL_ID "final" %token TOK_FUNCTION_NAME "__func__" %token TOK_INT_ID "int" %token TOK_LAMBDA "lambda" %token TOK_MULTISET_ID "multiset" %token TOK_MULTISET_END ">)" %token TOK_MULTISET_START "(<" %token TOK_LSH_EQ "<<=" %token TOK_MAPPING_ID "mapping" %token TOK_MIXED_ID "mixed" %token TOK_MOD_EQ "%=" %token TOK_MULT_EQ "*=" %token TOK_OBJECT_ID "object" %token TOK_OR_EQ "|=" %token TOK_POW "**" %token TOK_POW_EQ "**=" %token TOK_PRIVATE "private" %token TOK_PROGRAM_ID "program" %token TOK_PROTECTED "protected" %token TOK_PREDEF "predef" %token TOK_PUBLIC "public" %token TOK_RSH_EQ ">>=" %token TOK_STATIC "static"
c595602018-09-09Henrik Grubbström (Grubba) %token TOK_STATIC_ASSERT "_Static_assert"
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_STRING_ID "string" %token TOK_SUB_EQ "-=" %token TOK_TYPEDEF "typedef" %token TOK_TYPEOF "typeof"
bfd1d42019-11-27Henrik Grubbström (Grubba) %token TOK_UNUSED "__unused__"
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_VARIANT "variant" %token TOK_VERSION "version prefix" %token TOK_VOID_ID "void" %token TOK_WEAK "__weak__" %token TOK_WHILE "while" %token TOK_XOR_EQ "^=" %token TOK_OPTIONAL "optional"
19582d2019-11-02Peter Bortas %token TOK_SAFE_INDEX "->?"
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_SAFE_START_INDEX "[?"
aab83d2019-11-03Marcus Comstedt %token TOK_SAFE_APPLY "(?"
fec03b2017-07-08Henrik Grubbström (Grubba) %token TOK_BITS "bits" %token TOK_AUTO_ID "auto"
39a59c2020-11-11Henrik Grubbström (Grubba) %token TOK_ATOMIC_GET_SET "?="
f76b4c2000-05-11Henrik Grubbström (Grubba) 
215bed1996-09-28Fredrik Hübinette (Hubbe)  %right '=' %right '?'
0ad6502012-10-02Per Hedbor 
f76b4c2000-05-11Henrik Grubbström (Grubba) %left TOK_LOR %left TOK_LAND
215bed1996-09-28Fredrik Hübinette (Hubbe) %left '|' %left '^' %left '&'
f76b4c2000-05-11Henrik Grubbström (Grubba) %left TOK_EQ TOK_NE %left '>' TOK_GE '<' TOK_LE /* nonassoc? */ %left TOK_LSH TOK_RSH
215bed1996-09-28Fredrik Hübinette (Hubbe) %left '+' '-'
413c8e1996-11-01Fredrik Hübinette (Hubbe) %left '*' '%' '/'
f76b4c2000-05-11Henrik Grubbström (Grubba) %right TOK_NOT '~'
a495492016-11-08Henrik Grubbström (Grubba) %right TOK_POW
f76b4c2000-05-11Henrik Grubbström (Grubba) %nonassoc TOK_INC TOK_DEC
215bed1996-09-28Fredrik Hübinette (Hubbe)  %{ /* This is the grammar definition of Pike. */ #include "global.h" #ifdef HAVE_MEMORY_H #include <memory.h> #endif #include "interpret.h" #include "array.h" #include "object.h"
c8feb52006-02-27Martin Stjernholm #include "mapping.h"
215bed1996-09-28Fredrik Hübinette (Hubbe) #include "stralloc.h" #include "las.h" #include "interpret.h" #include "program.h" #include "pike_types.h" #include "constants.h"
bb55f81997-03-16Fredrik Hübinette (Hubbe) #include "pike_macros.h"
bb8a782000-12-01Fredrik Hübinette (Hubbe) #include "pike_error.h"
215bed1996-09-28Fredrik Hübinette (Hubbe) #include "docode.h"
1a26b22004-12-30Henrik Grubbström (Grubba) #include "pike_embed.h"
f76b4c2000-05-11Henrik Grubbström (Grubba) #include "opcodes.h"
a418ce2001-03-31Henrik Grubbström (Grubba) #include "operators.h"
65e0e12019-03-28Henrik Grubbström (Grubba) #include "builtin_functions.h"
96c3932002-08-27Henrik Grubbström (Grubba) #include "bignum.h"
215bed1996-09-28Fredrik Hübinette (Hubbe) 
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) #define YYMAXDEPTH 1000
215bed1996-09-28Fredrik Hübinette (Hubbe) 
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
8c77b61998-04-13Henrik Grubbström (Grubba) #ifndef YYDEBUG /* May also be defined by machine.h */
189fd01997-01-28Fredrik Hübinette (Hubbe) #define YYDEBUG 1
8c77b61998-04-13Henrik Grubbström (Grubba) #endif /* YYDEBUG */
189fd01997-01-28Fredrik Hübinette (Hubbe) #endif
4492b12002-01-03Henrik Grubbström (Grubba) /* Get verbose parse error reporting. */ #define YYERROR_VERBOSE 1
c68a292001-06-10Henrik Grubbström (Grubba) /* #define LAMBDA_DEBUG 1 */
215bed1996-09-28Fredrik Hübinette (Hubbe) 
94d66b2008-05-24Henrik Grubbström (Grubba) static void yyerror_reserved(const char *keyword);
28b7362008-07-08Henrik Grubbström (Grubba) static struct pike_string *get_new_name(struct pike_string *prefix);
3699402001-02-20Henrik Grubbström (Grubba) int add_local_name(struct pike_string *, struct pike_type *, node *);
97f6282000-03-07Fredrik Hübinette (Hubbe) int low_add_local_name(struct compiler_frame *,
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_string *, struct pike_type *, node *);
6572be2008-01-05Henrik Grubbström (Grubba) static void mark_lvalues_as_used(node *n);
4218011999-01-31Fredrik Hübinette (Hubbe) static node *lexical_islocal(struct pike_string *);
e33ab92008-07-18Henrik Grubbström (Grubba) static node *safe_inc_enum(node *n);
7f012e2014-11-09Henrik Grubbström (Grubba) static node *find_versioned_identifier(struct pike_string *identifier, int major, int minor);
0880972019-03-26Henrik Grubbström (Grubba) static int call_handle_import(void); static void update_current_type(void);
215bed1996-09-28Fredrik Hübinette (Hubbe) 
8c64232000-06-26Henrik Grubbström (Grubba) static int inherit_depth; static struct program_state *inherit_state = NULL;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
cd89d71997-09-10Henrik Grubbström (Grubba) /* * Kludge for Bison not using prototypes. */ #ifndef __GNUC__ #ifndef __cplusplus
d5fa6a2002-09-24Henrik Grubbström (Grubba) static void __yy_memcpy(char *to, YY_FROM_CONST char *from, YY_COUNT_TYPE count);
cd89d71997-09-10Henrik Grubbström (Grubba) #endif /* !__cplusplus */ #endif /* !__GNUC__ */
215bed1996-09-28Fredrik Hübinette (Hubbe) %}
e2acf71997-04-23Henrik Grubbström (Grubba) 
215bed1996-09-28Fredrik Hübinette (Hubbe) %union { int number; FLOAT_TYPE fnum; struct node_s *n;
315aa81999-12-17Fredrik Hübinette (Hubbe)  char *str;
a993572002-10-12Henrik Grubbström (Grubba)  void *ptr;
215bed1996-09-28Fredrik Hübinette (Hubbe) }
4b974c1999-02-20Henrik Grubbström (Grubba) %{
e021fe2008-04-14Henrik Grubbström (Grubba) /* Need to be included after YYSTYPE is defined. */
00dc302004-03-23Martin Stjernholm #define INCLUDED_FROM_LANGUAGE_YACC
4b974c1999-02-20Henrik Grubbström (Grubba) #include "lex.h"
e021fe2008-04-14Henrik Grubbström (Grubba) #include "pike_compiler.h"
4b974c1999-02-20Henrik Grubbström (Grubba) %}
e2acf71997-04-23Henrik Grubbström (Grubba) %{
7ee3801998-11-10Henrik Grubbström (Grubba) /* Include <stdio.h> our selves, so that we can do our magic * without being disturbed... */ #include <stdio.h>
e2acf71997-04-23Henrik Grubbström (Grubba) int yylex(YYSTYPE *yylval);
7ee3801998-11-10Henrik Grubbström (Grubba) /* Bison is stupid, and tries to optimize for space... */
beb25e2005-10-14Henrik Grubbström (Grubba) #ifdef YYBISON #define short int #endif /* YYBISON */
a993572002-10-12Henrik Grubbström (Grubba) 
e2acf71997-04-23Henrik Grubbström (Grubba) %}
f76b4c2000-05-11Henrik Grubbström (Grubba) %type <fnum> TOK_FLOAT %type <number> TOK_ARRAY_ID %type <number> TOK_BREAK %type <number> TOK_CASE %type <number> TOK_CATCH %type <number> TOK_CONTINUE %type <number> TOK_DEFAULT %type <number> TOK_DO %type <number> TOK_ELSE %type <number> TOK_FLOAT_ID %type <number> TOK_FOR %type <number> TOK_FOREACH %type <number> TOK_FUNCTION_ID %type <number> TOK_GAUGE %type <number> TOK_IF %type <number> TOK_INHERIT %type <number> TOK_INLINE %type <number> TOK_INT_ID %type <number> TOK_LAMBDA %type <number> TOK_LOCAL_ID %type <number> TOK_MAPPING_ID %type <number> TOK_MIXED_ID %type <number> TOK_MULTISET_ID %type <number> TOK_OBJECT_ID %type <number> TOK_PREDEF %type <number> TOK_PRIVATE %type <number> TOK_PROGRAM_ID %type <number> TOK_PROTECTED %type <number> TOK_PUBLIC %type <number> TOK_RETURN %type <number> TOK_SSCANF %type <number> TOK_STATIC %type <number> TOK_STRING_ID
6e0fce2013-05-28Per Hedbor %type <number> TOK_AUTO_ID
f76b4c2000-05-11Henrik Grubbström (Grubba) %type <number> TOK_SWITCH %type <number> TOK_VOID_ID %type <number> TOK_WHILE
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <number> arguments %type <number> arguments2
febbc81997-04-22Fredrik Hübinette (Hubbe) %type <number> func_args
c20a522000-07-08Henrik Grubbström (Grubba) %type <number> create_arguments %type <number> create_arguments2 %type <number> create_arg
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <number> assign %type <number> modifier %type <number> modifier_list %type <number> modifiers
2a343f2008-04-04Henrik Grubbström (Grubba) %type <number> implicit_modifiers
8c64232000-06-26Henrik Grubbström (Grubba) %type <number> inherit_specifier
cbae7e2000-03-30Henrik Grubbström (Grubba) %type <number> function_type_list %type <number> function_type_list2
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <number> optional_dot_dot_dot
cbae7e2000-03-30Henrik Grubbström (Grubba) %type <number> optional_comma
6fe35d2007-09-14Henrik Grubbström (Grubba) %type <number> optional_constant
d0f7342019-08-22Henrik Grubbström (Grubba) %type <number> optional_continue
1104c62007-10-08Henrik Grubbström (Grubba) %type <number> optional_create_arguments
8457542016-05-13Henrik Grubbström (Grubba) %type <number> save_block_level %type <number> save_locals
215bed1996-09-28Fredrik Hübinette (Hubbe) 
315aa81999-12-17Fredrik Hübinette (Hubbe) %type <str> magic_identifiers %type <str> magic_identifiers1 %type <str> magic_identifiers2 %type <str> magic_identifiers3
8c77b61998-04-13Henrik Grubbström (Grubba) /* The following symbols return type information */
215bed1996-09-28Fredrik Hübinette (Hubbe) 
b878692019-12-21Henrik Grubbström (Grubba) %type <n> number
011ad31999-10-22Fredrik Hübinette (Hubbe) %type <n> number_or_minint %type <n> number_or_maxint
3c0c281998-01-26Fredrik Hübinette (Hubbe) %type <n> cast
1d73ef1999-11-23Henrik Grubbström (Grubba) %type <n> soft_cast
a83d122013-11-08Henrik Grubbström (Grubba) %type <n> real_string_constant %type <n> real_string_or_identifier
3c0c281998-01-26Fredrik Hübinette (Hubbe) %type <n> string_constant
a83d122013-11-08Henrik Grubbström (Grubba) %type <n> string_or_identifier
9aee972008-05-06Henrik Grubbström (Grubba) %type <n> string_segment
3c0c281998-01-26Fredrik Hübinette (Hubbe) %type <n> string
f76b4c2000-05-11Henrik Grubbström (Grubba) %type <n> TOK_STRING %type <n> TOK_NUMBER
e04ce12013-12-11Per Hedbor %type <n> TOK_BITS
3c0c281998-01-26Fredrik Hübinette (Hubbe) %type <n> optional_rename_inherit %type <n> optional_identifier
ff02322008-05-07Henrik Grubbström (Grubba) %type <n> implicit_identifier
f76b4c2000-05-11Henrik Grubbström (Grubba) %type <n> TOK_IDENTIFIER
32bc322008-06-18Henrik Grubbström (Grubba) %type <n> TOK_RESERVED
a0af022006-01-21Henrik Grubbström (Grubba) %type <n> TOK_VERSION
8020bf2018-11-05Henrik Grubbström (Grubba) %type <n> annotation
843d2f2018-11-06Henrik Grubbström (Grubba) %type <n> annotation_list
316e7d2008-04-04Henrik Grubbström (Grubba) %type <n> attribute
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> assoc_pair
9b39022003-03-27Martin Stjernholm %type <n> line_number_info
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> block
a30f092000-07-12Fredrik Hübinette (Hubbe) %type <n> optional_block
01d3e21997-04-23Fredrik Hübinette (Hubbe) %type <n> failsafe_block
aab83d2019-11-03Marcus Comstedt %type <n> safe_apply_with_line_info
10fe602003-10-01Martin Stjernholm %type <n> open_paren_with_line_info
aab83d2019-11-03Marcus Comstedt %type <n> open_paren_or_safe_apply_with_line_info
bb213c1999-12-27Henrik Grubbström (Grubba) %type <n> close_paren_or_missing
10fe602003-10-01Martin Stjernholm %type <n> open_bracket_with_line_info
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> block_or_semi %type <n> break %type <n> case %type <n> catch %type <n> catch_arg
6dddaa2016-11-09Henrik Grubbström (Grubba) %type <n> anon_class %type <n> named_class
a418ce2001-03-31Henrik Grubbström (Grubba) %type <n> enum
e33ab92008-07-18Henrik Grubbström (Grubba) %type <n> enum_value
4d21331998-04-14Henrik Grubbström (Grubba) %type <n> safe_comma_expr
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> comma_expr %type <n> comma_expr2
408a1e2004-10-30Martin Stjernholm %type <n> range_bound
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> cond %type <n> continue %type <n> default %type <n> do
8020bf2018-11-05Henrik Grubbström (Grubba) %type <n> constant_expr
998e1f1998-04-15Henrik Grubbström (Grubba) %type <n> safe_expr0
615cf52016-02-02Henrik Grubbström (Grubba) %type <n> splice_expr
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> expr01 %type <n> expr1 %type <n> expr2 %type <n> expr3 expr0
55bd772005-02-18Henrik Grubbström (Grubba) %type <n> apply
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> expr4
aea6a42016-05-09Henrik Grubbström (Grubba) %type <n> expr5
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> expr_list %type <n> expr_list2 %type <n> for %type <n> for_expr %type <n> foreach %type <n> gauge
7bf71d2017-12-10Henrik Grubbström (Grubba) %type <n> unqualified_idents %type <n> qualified_ident %type <n> qualified_idents
d2c6081996-11-07Fredrik Hübinette (Hubbe) %type <n> idents
5a0fd52001-01-10Martin Stjernholm %type <n> labeled_statement
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> lambda
f99cdd2016-05-08Henrik Grubbström (Grubba) %type <n> literal_expr
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> local_name_list
591c0c1997-01-19Fredrik Hübinette (Hubbe) %type <n> low_idents
998e1f1998-04-15Henrik Grubbström (Grubba) %type <n> safe_lvalue
3ddb531996-11-02Fredrik Hübinette (Hubbe) %type <n> lvalue
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> lvalue_list
2a32691998-01-31Fredrik Hübinette (Hubbe) %type <n> low_lvalue_list
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> m_expr_list %type <n> m_expr_list2 %type <n> new_local_name
5a0fd52001-01-10Martin Stjernholm %type <n> normal_label_statement
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> optional_else_part
5a0fd52001-01-10Martin Stjernholm %type <n> optional_label
e33ab92008-07-18Henrik Grubbström (Grubba) %type <n> propagated_enum_value
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> return %type <n> sscanf %type <n> statement %type <n> statements
71bde82001-03-16Fredrik Hübinette (Hubbe) %type <n> statement_with_semicolon
7e50571996-11-02Fredrik Hübinette (Hubbe) %type <n> switch %type <n> typeof %type <n> unused %type <n> unused2 %type <n> while
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) %type <n> optional_comma_expr
61e9a01998-01-25Fredrik Hübinette (Hubbe) %type <n> low_program_ref
2ebdad2004-03-16Henrik Grubbström (Grubba) %type <n> inherit_ref
a566ca1999-12-14Fredrik Hübinette (Hubbe) %type <n> local_function
3bc6c12019-09-17Henrik Grubbström (Grubba) %type <n> local_generator
315aa81999-12-17Fredrik Hübinette (Hubbe) %type <n> magic_identifier
5e3aa52001-04-01Henrik Grubbström (Grubba) %type <n> simple_identifier
4cdb802001-02-23Fredrik Hübinette (Hubbe) %type <n> foreach_lvalues %type <n> foreach_optional_lvalue
bc62892009-06-22Henrik Grubbström (Grubba) 
f2dbd22016-01-25Henrik Grubbström (Grubba) %type <ptr> start_function %type <ptr> start_lambda
215bed1996-09-28Fredrik Hübinette (Hubbe) %%
db271d1998-04-27Henrik Grubbström (Grubba) all: program { YYACCEPT; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | program TOK_LEX_EOF { YYACCEPT; } /* | error TOK_LEX_EOF { YYABORT; } */
8c77b61998-04-13Henrik Grubbström (Grubba)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
9ce6b62000-09-20Henrik Grubbström (Grubba) program: program def | program ';'
7e50571996-11-02Fredrik Hübinette (Hubbe)  | /* empty */ ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
a83d122013-11-08Henrik Grubbström (Grubba) real_string_or_identifier: TOK_IDENTIFIER | real_string_constant
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
a83d122013-11-08Henrik Grubbström (Grubba) optional_rename_inherit: ':' real_string_or_identifier { $$=$2; }
8c77b61998-04-13Henrik Grubbström (Grubba)  | ':' bad_identifier { $$=0; }
4d21331998-04-14Henrik Grubbström (Grubba)  | ':' error { $$=0; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | { $$=0; } ;
d2c6081996-11-07Fredrik Hübinette (Hubbe) 
66c2361998-08-29Henrik Grubbström (Grubba) /* NOTE: This rule pushes a string "name" on the stack in addition * to resolving the program reference. */
65e0e12019-03-28Henrik Grubbström (Grubba) low_program_ref: safe_expr0
d2c6081996-11-07Fredrik Hübinette (Hubbe)  {
65e0e12019-03-28Henrik Grubbström (Grubba)  node *n = $1;
a993572002-10-12Henrik Grubbström (Grubba)  STACK_LEVEL_START(0);
65e0e12019-03-28Henrik Grubbström (Grubba)  while (n) { switch (n->token) { case F_EXTERNAL: case F_GET_SET: $$ = n; add_ref(n); free_node($1); goto got_program_ref; case F_APPLY: { if ((CAR(n)->token == F_CONSTANT) && (TYPEOF(CAR(n)->u.sval) == T_FUNCTION) && (SUBTYPEOF(CAR(n)->u.sval) == FUNCTION_BUILTIN) && (CAR(n)->u.sval.u.efun->function == debug_f_aggregate)) { /* Disambiguate multiple inherit ::-reference. */ node *arg; while(1) { while ((arg = CDR(n))) { n = arg; if (n->token != F_ARG_LIST) goto found_program_ref; } /* Paranoia. */ if ((arg = CAR(n))) { n = arg; continue; } /* FIXME: Ought to go up a level and try the car there... * But as this code probably won't be reached, we * just fail. */ yyerror("Failed to get last argument from empty array."); n = NULL; break; } found_program_ref: /* NB: The traditional C grammar requires a statement * after a label. */ continue; } } /* FALLTHRU */ default: /* Evaluate the expression. */ break; } break;
10e16f1999-11-04Henrik Grubbström (Grubba)  }
65e0e12019-03-28Henrik Grubbström (Grubba)  resolv_constant(n); free_node($1); if (TYPEOF(Pike_sp[-1]) == T_STRING) { if (call_handle_inherit(Pike_sp[-1].u.string)) { STACK_LEVEL_CHECK(2); $$ = mksvaluenode(Pike_sp-1); pop_stack(); } else $$ = mknewintnode(0); STACK_LEVEL_CHECK(1); if($$->name) free_string($$->name);
cf2ad92008-06-24Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG
65e0e12019-03-28Henrik Grubbström (Grubba)  if (TYPEOF(Pike_sp[-1]) != T_STRING) { Pike_fatal("Compiler lost track of program name.\n"); }
cf2ad92008-06-24Henrik Grubbström (Grubba) #endif /* PIKE_DEBUG */
a993572002-10-12Henrik Grubbström (Grubba) 
65e0e12019-03-28Henrik Grubbström (Grubba)  add_ref( $$->name=Pike_sp[-1].u.string ); } else { $$ = mksvaluenode(Pike_sp-1); pop_stack();
a993572002-10-12Henrik Grubbström (Grubba) 
65e0e12019-03-28Henrik Grubbström (Grubba)  got_program_ref: STACK_LEVEL_CHECK(0); if (Pike_compiler->last_identifier) { ref_push_string(Pike_compiler->last_identifier); } else { push_empty_string(); }
8d7bda1997-02-10Fredrik Hübinette (Hubbe)  }
a993572002-10-12Henrik Grubbström (Grubba)  STACK_LEVEL_DONE(1);
61e9a01998-01-25Fredrik Hübinette (Hubbe)  } ;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
2ebdad2004-03-16Henrik Grubbström (Grubba) inherit_ref: { SET_FORCE_RESOLVE($<number>$); } low_program_ref { UNSET_FORCE_RESOLVE($<number>1); $$ = $2; } ; inheritance: modifiers TOK_INHERIT inherit_ref optional_rename_inherit ';'
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (($1 & ID_EXTERN) && (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
8fd9311999-12-30Henrik Grubbström (Grubba)  yywarning("Extern declared inherit."); }
d165152008-05-03Henrik Grubbström (Grubba)  if($3)
d2c6081996-11-07Fredrik Hübinette (Hubbe)  {
f077582000-07-06Fredrik Hübinette (Hubbe)  struct pike_string *s=Pike_sp[-1].u.string;
2ebdad2004-03-16Henrik Grubbström (Grubba)  if($4) s=$4->u.sval.u.string; compiler_do_inherit($3,$1,s);
d2c6081996-11-07Fredrik Hübinette (Hubbe)  }
2ebdad2004-03-16Henrik Grubbström (Grubba)  if($4) free_node($4);
a993572002-10-12Henrik Grubbström (Grubba)  pop_stack();
2ebdad2004-03-16Henrik Grubbström (Grubba)  if ($3) free_node($3);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
2ebdad2004-03-16Henrik Grubbström (Grubba)  | modifiers TOK_INHERIT inherit_ref error ';'
8c77b61998-04-13Henrik Grubbström (Grubba)  {
2ebdad2004-03-16Henrik Grubbström (Grubba)  if ($3) free_node($3);
48e4102001-12-20Martin Stjernholm  pop_stack(); yyerrok;
8c77b61998-04-13Henrik Grubbström (Grubba)  }
2ebdad2004-03-16Henrik Grubbström (Grubba)  | modifiers TOK_INHERIT inherit_ref error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  {
2ebdad2004-03-16Henrik Grubbström (Grubba)  if ($3) free_node($3);
48e4102001-12-20Martin Stjernholm  pop_stack();
db271d1998-04-27Henrik Grubbström (Grubba)  yyerror("Missing ';'."); yyerror("Unexpected end of file."); }
2ebdad2004-03-16Henrik Grubbström (Grubba)  | modifiers TOK_INHERIT inherit_ref error '}'
db271d1998-04-27Henrik Grubbström (Grubba)  {
2ebdad2004-03-16Henrik Grubbström (Grubba)  if ($3) free_node($3);
48e4102001-12-20Martin Stjernholm  pop_stack(); yyerror("Missing ';'.");
db271d1998-04-27Henrik Grubbström (Grubba)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
0880972019-03-26Henrik Grubbström (Grubba) import: TOK_IMPORT constant_expr ';'
591c0c1997-01-19Fredrik Hübinette (Hubbe)  {
97358e1998-04-23Fredrik Hübinette (Hubbe)  resolv_constant($2); free_node($2);
fd0ff82019-04-28Tobias S. Josefowitz  if (TYPEOF(Pike_sp[-1]) != PIKE_T_STRING || call_handle_import()) { use_module(Pike_sp-1); pop_stack();
0880972019-03-26Henrik Grubbström (Grubba)  }
591c0c1997-01-19Fredrik Hübinette (Hubbe)  } ;
f76b4c2000-05-11Henrik Grubbström (Grubba) constant_name: TOK_IDENTIFIER '=' safe_expr0
d2c6081996-11-07Fredrik Hübinette (Hubbe)  { /* This can be made more lenient in the future */
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  /* Ugly hack to make sure that $3 is optimized */
b5c9052000-08-19Henrik Grubbström (Grubba)  { int tmp=Pike_compiler->compiler_pass; $3=mknode(F_COMMA_EXPR,$3,0); Pike_compiler->compiler_pass=tmp; }
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
3a30d72014-10-05Martin Nilsson  if (Pike_compiler->current_modifiers & ID_EXTERN) {
bcf72b2008-07-13Henrik Grubbström (Grubba)  int depth = 0; struct program_state *state = Pike_compiler; node *n = $3; while (((n->token == F_COMMA_EXPR) || (n->token == F_ARG_LIST)) && ((!CAR(n)) ^ (!CDR(n)))) { if (CAR(n)) n = CAR(n); else n = CDR(n); } if (n->token == F_EXTERNAL) { while (state && (state->new_program->id != n->u.integer.a)) { depth++; state = state->previous;
09afd22008-06-19Henrik Grubbström (Grubba)  }
bcf72b2008-07-13Henrik Grubbström (Grubba)  } if (depth && state) { /* Alias for a symbol in a surrounding scope. */ int id = really_low_reference_inherited_identifier(state, 0, n->u.integer.b); define_alias($1->u.sval.u.string, n->type, Pike_compiler->current_modifiers & ~ID_EXTERN, depth, id);
bdfe4e2017-12-11Henrik Grubbström (Grubba)  } else if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) {
bcf72b2008-07-13Henrik Grubbström (Grubba)  yyerror("Invalid extern declared constant."); add_constant($1->u.sval.u.string, &svalue_undefined,
019b3d2000-07-09Henrik Grubbström (Grubba)  Pike_compiler->current_modifiers & ~ID_EXTERN);
bcf72b2008-07-13Henrik Grubbström (Grubba)  }
d2c6081996-11-07Fredrik Hübinette (Hubbe)  } else {
1adcc92018-02-14Henrik Grubbström (Grubba)  if(!is_const($3)) {
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
325f8b2018-02-12Henrik Grubbström (Grubba)  yyerror("Constant definition is not constant.");
8b07b32008-07-13Henrik Grubbström (Grubba)  } add_constant($1->u.sval.u.string, 0,
bcf72b2008-07-13Henrik Grubbström (Grubba)  Pike_compiler->current_modifiers & ~ID_EXTERN); } else { if(!Pike_compiler->num_parse_error)
57cddc1998-04-19Per Hedbor  {
1adcc92018-02-14Henrik Grubbström (Grubba)  ptrdiff_t tmp=eval_low($3,1);
bcf72b2008-07-13Henrik Grubbström (Grubba)  if(tmp < 1) { yyerror("Error in constant definition."); push_undefined(); }else{
bd67392015-10-14Martin Nilsson  pop_n_elems((INT32)(tmp - 1));
bcf72b2008-07-13Henrik Grubbström (Grubba)  } } else {
f23f062004-03-12Henrik Grubbström (Grubba)  push_undefined();
57cddc1998-04-19Per Hedbor  }
bcf72b2008-07-13Henrik Grubbström (Grubba)  add_constant($1->u.sval.u.string, Pike_sp-1, Pike_compiler->current_modifiers & ~ID_EXTERN); pop_stack();
c6ae0c1996-11-26Fredrik Hübinette (Hubbe)  }
d2c6081996-11-07Fredrik Hübinette (Hubbe)  }
bcf72b2008-07-13Henrik Grubbström (Grubba)  const_def_ok:
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  if($3) free_node($3);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($1);
d2c6081996-11-07Fredrik Hübinette (Hubbe)  }
998e1f1998-04-15Henrik Grubbström (Grubba)  | bad_identifier '=' safe_expr0 { if ($3) free_node($3); } | error '=' safe_expr0 { if ($3) free_node($3); }
d2c6081996-11-07Fredrik Hübinette (Hubbe)  ; constant_list: constant_name | constant_list ',' constant_name ;
f76b4c2000-05-11Henrik Grubbström (Grubba) constant: modifiers TOK_CONSTANT constant_list ';' {} | modifiers TOK_CONSTANT error ';' { yyerrok; } | modifiers TOK_CONSTANT error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  { yyerror("Missing ';'."); yyerror("Unexpected end of file."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | modifiers TOK_CONSTANT error '}' { yyerror("Missing ';'."); }
d2c6081996-11-07Fredrik Hübinette (Hubbe)  ;
7e50571996-11-02Fredrik Hübinette (Hubbe) block_or_semi: block {
0b84582007-10-06Henrik Grubbström (Grubba)  $$ = mknode(F_COMMA_EXPR,$1,mknode(F_RETURN,mkintnode(0),0));
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $1);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
76b4491999-12-09Henrik Grubbström (Grubba)  | ';' { $$ = NULL; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF { yyerror("Expected ';'."); $$ = NULL; }
76b4491999-12-09Henrik Grubbström (Grubba)  | error { $$ = NULL; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
10fe602003-10-01Martin Stjernholm open_paren_with_line_info: '(' { /* Used to hold line-number info */ $$ = mkintnode(0); } ;
aab83d2019-11-03Marcus Comstedt safe_apply_with_line_info: TOK_SAFE_APPLY { /* Used to hold line-number info */ $$ = mkintnode(0); } ; open_paren_or_safe_apply_with_line_info: open_paren_with_line_info | safe_apply_with_line_info ;
76b4491999-12-09Henrik Grubbström (Grubba) close_paren_or_missing: ')'
bb213c1999-12-27Henrik Grubbström (Grubba)  { /* Used to hold line-number info */ $$ = mkintnode(0); }
76b4491999-12-09Henrik Grubbström (Grubba)  | /* empty */ { yyerror("Missing ')'.");
bb213c1999-12-27Henrik Grubbström (Grubba)  /* Used to hold line-number info */ $$ = mkintnode(0);
76b4491999-12-09Henrik Grubbström (Grubba)  } ; close_brace_or_missing: '}' | /* empty */ { yyerror("Missing '}'."); } ;
d4c3e02002-05-02Henrik Grubbström (Grubba) close_brace_or_eof: '}' | TOK_LEX_EOF { yyerror("Missing '}'."); } ;
10fe602003-10-01Martin Stjernholm open_bracket_with_line_info: '[' { /* Used to hold line-number info */ $$ = mkintnode(0); } ;
76b4491999-12-09Henrik Grubbström (Grubba) close_bracket_or_missing: ']' | /* empty */ { yyerror("Missing ']'."); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
ab6b782016-05-07Henrik Grubbström (Grubba) /* This variant is used to start a new compiler frame for functions * with a declared return type. * * On entry the return type to be is taken from
acabf12016-01-09Henrik Grubbström (Grubba)  * * compiler_frame->current_type *
ab6b782016-05-07Henrik Grubbström (Grubba)  * in the current frame (stored there eg via simple_type). This is * then copied to * * compiler_frame->current_return_type * * for the new frame.
acabf12016-01-09Henrik Grubbström (Grubba)  */
f2dbd22016-01-25Henrik Grubbström (Grubba) start_function: /* empty */
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  {
8322b62000-05-08Fredrik Hübinette (Hubbe)  push_compiler_frame(SCOPE_LOCAL);
b5aa651999-12-16Henrik Grubbström (Grubba) 
bad5162000-06-23Fredrik Hübinette (Hubbe)  if(!Pike_compiler->compiler_frame->previous || !Pike_compiler->compiler_frame->previous->current_type)
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  {
f2dbd22016-01-25Henrik Grubbström (Grubba)  yyerror("Internal compiler error (start_function).");
ab6b782016-05-07Henrik Grubbström (Grubba)  copy_pike_type(Pike_compiler->compiler_frame->current_return_type,
f2dbd22016-01-25Henrik Grubbström (Grubba)  mixed_type_string);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }else{
ab6b782016-05-07Henrik Grubbström (Grubba)  copy_pike_type(Pike_compiler->compiler_frame->current_return_type, Pike_compiler->compiler_frame->previous->current_type);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }
bc62892009-06-22Henrik Grubbström (Grubba)  $$ = Pike_compiler->compiler_frame;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }
3ec3df1999-12-16Henrik Grubbström (Grubba)  ;
6fe35d2007-09-14Henrik Grubbström (Grubba) optional_constant: /* empty */ { $$ = OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT; } | TOK_CONSTANT { $$ = 0; } ;
e17b7b2016-01-16Henrik Grubbström (Grubba) def: modifiers optional_attributes simple_type optional_constant
f2dbd22016-01-25Henrik Grubbström (Grubba)  TOK_IDENTIFIER start_function
0ad6502012-10-02Per Hedbor  '('
1e9a882007-10-05Henrik Grubbström (Grubba)  { $<number>$ = 0; /* Check for the (very special) case of create and create_args. */ if (Pike_compiler->num_create_args) { struct pike_string *create_string = NULL; int e; MAKE_CONST_STRING(create_string, "create");
eb6ba72016-01-11Henrik Grubbström (Grubba)  if ($5->u.sval.u.string == create_string) {
1e9a882007-10-05Henrik Grubbström (Grubba)  /* Prepend the create arguments. */ if (Pike_compiler->num_create_args < 0) { Pike_compiler->varargs = 1; for (e = 0; e < -Pike_compiler->num_create_args; e++) { struct identifier *id = Pike_compiler->new_program->identifiers + e; add_ref(id->type);
1104c62007-10-08Henrik Grubbström (Grubba)  add_local_name(empty_pike_string, id->type, 0);
1686e22008-06-25Henrik Grubbström (Grubba)  /* Note: add_local_name() above will return e. */ Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED;
1e9a882007-10-05Henrik Grubbström (Grubba)  } } else { for (e = 0; e < Pike_compiler->num_create_args; e++) { struct identifier *id = Pike_compiler->new_program->identifiers + e; add_ref(id->type);
1104c62007-10-08Henrik Grubbström (Grubba)  add_local_name(empty_pike_string, id->type, 0);
1686e22008-06-25Henrik Grubbström (Grubba)  /* Note: add_local_name() above will return e. */ Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED;
1e9a882007-10-05Henrik Grubbström (Grubba)  } } $<number>$ = e; } } } arguments close_paren_or_missing
7e50571996-11-02Fredrik Hübinette (Hubbe)  { int e;
6fe35d2007-09-14Henrik Grubbström (Grubba)  /* Adjust opt_flags in case we've got an optional_constant. */
316e7d2008-04-04Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->opt_flags = $4;
6fe35d2007-09-14Henrik Grubbström (Grubba) 
7e50571996-11-02Fredrik Hübinette (Hubbe)  /* construct the function type */
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->current_return_type);
0ad6502012-10-02Per Hedbor 
ba00032019-08-22Henrik Grubbström (Grubba)  if ($1 & ID_GENERATOR) {
9e59352019-09-10Henrik Grubbström (Grubba)  /* Adjust the type to be a function that returns
e01eb92019-09-10Henrik Grubbström (Grubba)  * a function(mixed|void, function(mixed|void...:void)|void:X).
9e59352019-09-10Henrik Grubbström (Grubba)  */ push_type(T_VOID); push_type(T_MANY);
e01eb92019-09-10Henrik Grubbström (Grubba)  push_type(T_VOID);
9e59352019-09-10Henrik Grubbström (Grubba)  push_type(T_VOID);
ba00032019-08-22Henrik Grubbström (Grubba)  push_type(T_VOID);
9e59352019-09-10Henrik Grubbström (Grubba)  push_type(T_MIXED); push_type(T_OR);
ba00032019-08-22Henrik Grubbström (Grubba)  push_type(T_MANY);
e01eb92019-09-10Henrik Grubbström (Grubba)  push_type(T_OR);
9e59352019-09-10Henrik Grubbström (Grubba)  push_type(T_FUNCTION); push_type(T_VOID); push_type(T_MIXED); push_type(T_OR); push_type(T_FUNCTION);
ba00032019-08-22Henrik Grubbström (Grubba)  /* Entry point variable. */ add_ref(int_type_string);
b3c52f2019-08-25Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->generator_local = add_local_name(empty_pike_string, int_type_string, 0);
9e59352019-09-10Henrik Grubbström (Grubba) 
779ebd2019-08-29Henrik Grubbström (Grubba)  /* Stack contents to restore. */ add_ref(array_type_string); add_local_name(empty_pike_string, array_type_string, 0);
b3c52f2019-08-25Henrik Grubbström (Grubba) 
9e59352019-09-10Henrik Grubbström (Grubba)  /* Resumption argument. */ add_ref(mixed_type_string); add_local_name(empty_pike_string, mixed_type_string, 0); /* Resumption callback. */ add_ref(function_type_string); add_local_name(empty_pike_string, function_type_string, 0);
b3c52f2019-08-25Henrik Grubbström (Grubba)  for (e = 0; e <= Pike_compiler->compiler_frame->generator_local; e++) { Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED | LOCAL_VAR_USED_IN_SCOPE; } Pike_compiler->compiler_frame->lexical_scope |= SCOPE_SCOPE_USED;
ba00032019-08-22Henrik Grubbström (Grubba)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  e = $<number>8 + $9 - 1;
1e9a882007-10-05Henrik Grubbström (Grubba)  if(Pike_compiler->varargs &&
eb6ba72016-01-11Henrik Grubbström (Grubba)  (!$<number>8 || (Pike_compiler->num_create_args >= 0)))
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
7e50571996-11-02Fredrik Hübinette (Hubbe)  e--;
5b368e2001-03-31Henrik Grubbström (Grubba)  pop_type_stack(T_ARRAY);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }else{ push_type(T_VOID); } push_type(T_MANY); for(; e>=0; e--) {
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
dfed932001-03-03Henrik Grubbström (Grubba)  push_type(T_FUNCTION);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
3c0c281998-01-26Fredrik Hübinette (Hubbe) 
a2af982014-03-01Henrik Grubbström (Grubba)  if (Pike_compiler->current_attributes) { node *n = Pike_compiler->current_attributes;
316e7d2008-04-04Henrik Grubbström (Grubba)  while (n) { push_type_attribute(CDR(n)->u.sval.u.string); n = CAR(n); } }
3c0c281998-01-26Fredrik Hübinette (Hubbe)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *s=compiler_pop_type();
eb6ba72016-01-11Henrik Grubbström (Grubba)  int i = isidentifier($5->u.sval.u.string);
be57ea2000-07-14Henrik Grubbström (Grubba) 
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass != COMPILER_PASS_FIRST) {
28c83a2013-05-26Henrik Grubbström (Grubba)  if (i < 0) {
2c448d2004-11-05Henrik Grubbström (Grubba)  my_yyerror("Identifier %S lost after first pass.",
eb6ba72016-01-11Henrik Grubbström (Grubba)  $5->u.sval.u.string);
be57ea2000-07-14Henrik Grubbström (Grubba)  } }
3699402001-02-20Henrik Grubbström (Grubba)  $<n>$ = mktypenode(s);
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(s);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  }
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
be57ea2000-07-14Henrik Grubbström (Grubba) 
bdfe4e2017-12-11Henrik Grubbström (Grubba) /* if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) */
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  {
6fd5172000-04-25Fredrik Hübinette (Hubbe)  /* FIXME: * set current_function_number for local functions as well */
bad5162000-06-23Fredrik Hübinette (Hubbe)  Pike_compiler->compiler_frame->current_function_number=
eb6ba72016-01-11Henrik Grubbström (Grubba)  define_function($5->u.sval.u.string,
0b84582007-10-06Henrik Grubbström (Grubba)  $<n>$->u.sval.u.type,
6fd5172000-04-25Fredrik Hübinette (Hubbe)  $1 & (~ID_EXTERN),
3116ce2002-11-22Henrik Grubbström (Grubba)  IDENTIFIER_PIKE_FUNCTION | (Pike_compiler->varargs?IDENTIFIER_VARARGS:0),
1ef5572000-08-30Henrik Grubbström (Grubba)  0,
316e7d2008-04-04Henrik Grubbström (Grubba)  $4);
be57ea2000-07-14Henrik Grubbström (Grubba) 
3116ce2002-11-22Henrik Grubbström (Grubba)  Pike_compiler->varargs=0;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  } block_or_semi { int e;
eb6ba72016-01-11Henrik Grubbström (Grubba)  if($12)
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
22edc21998-01-29Fredrik Hübinette (Hubbe)  int f;
b9188f1999-12-13Henrik Grubbström (Grubba)  node *check_args = NULL;
e021fe2008-04-14Henrik Grubbström (Grubba)  struct compilation *c = THIS_COMPILATION; struct pike_string *save_file = c->lex.current_file; int save_line = c->lex.current_line;
9039702000-08-15Henrik Grubbström (Grubba)  int num_required_args = 0;
1ef5572000-08-30Henrik Grubbström (Grubba)  struct identifier *i;
eb6ba72016-01-11Henrik Grubbström (Grubba)  c->lex.current_file = $5->current_file; c->lex.current_line = $5->line_number;
b9188f1999-12-13Henrik Grubbström (Grubba) 
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (($1 & ID_EXTERN) && (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
8fd9311999-12-30Henrik Grubbström (Grubba)  yywarning("Extern declared function definition."); }
b3c52f2019-08-25Henrik Grubbström (Grubba)  if ($1 & ID_GENERATOR) { struct pike_type *generator_type;
779ebd2019-08-29Henrik Grubbström (Grubba)  int generator_stack_local;
b3c52f2019-08-25Henrik Grubbström (Grubba)  ref_push_string($5->u.sval.u.string); push_constant_text("\0generator");
1f977e2019-08-26Henrik Grubbström (Grubba)  f_add(2);
b3c52f2019-08-25Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST && Pike_compiler->compiler_frame->current_return_type->type == PIKE_T_AUTO) { /* Change "auto" return type to actual return type. */ push_finished_type(Pike_compiler->compiler_frame->current_return_type->car); } else { push_finished_type(Pike_compiler->compiler_frame->current_return_type); }
9e59352019-09-10Henrik Grubbström (Grubba)  /* Adjust the type to be a function that returns
e01eb92019-09-10Henrik Grubbström (Grubba)  * a function(mixed|void, function(mixed|void...:void)|void:X).
9e59352019-09-10Henrik Grubbström (Grubba)  */
b3c52f2019-08-25Henrik Grubbström (Grubba)  push_type(T_VOID); push_type(T_MANY);
e01eb92019-09-10Henrik Grubbström (Grubba)  push_type(T_VOID);
9e59352019-09-10Henrik Grubbström (Grubba)  push_type(T_VOID); push_type(T_VOID); push_type(T_MIXED); push_type(T_OR); push_type(T_MANY);
e01eb92019-09-10Henrik Grubbström (Grubba)  push_type(T_OR);
9e59352019-09-10Henrik Grubbström (Grubba)  push_type(T_FUNCTION); push_type(T_VOID); push_type(T_MIXED); push_type(T_OR); push_type(T_FUNCTION);
b3c52f2019-08-25Henrik Grubbström (Grubba)  generator_type = compiler_pop_type(); f = dooptcode(Pike_sp[-1].u.string, $12, generator_type,
ece5192019-09-10Henrik Grubbström (Grubba)  ID_INLINE|ID_PROTECTED|ID_PRIVATE|ID_USED);
b3c52f2019-08-25Henrik Grubbström (Grubba)  pop_stack();
779ebd2019-08-29Henrik Grubbström (Grubba)  generator_stack_local = Pike_compiler->compiler_frame->generator_local + 1;
b3c52f2019-08-25Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->generator_local = -1; free_type(Pike_compiler->compiler_frame->current_return_type); Pike_compiler->compiler_frame->current_return_type = generator_type;
779ebd2019-08-29Henrik Grubbström (Grubba)  $12 = mknode(F_COMMA_EXPR, mknode(F_ASSIGN, mklocalnode(generator_stack_local, 0), mkefuncallnode("aggregate", NULL)), mknode(F_RETURN, mkgeneratornode(f), NULL));
b3c52f2019-08-25Henrik Grubbström (Grubba)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  for(e=0; e<$<number>8+$9; e++)
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
eb6ba72016-01-11Henrik Grubbström (Grubba)  if((e >= $<number>8) &&
1104c62007-10-08Henrik Grubbström (Grubba)  (!Pike_compiler->compiler_frame->variable[e].name || !Pike_compiler->compiler_frame->variable[e].name->len))
b9188f1999-12-13Henrik Grubbström (Grubba)  {
eb6ba72016-01-11Henrik Grubbström (Grubba)  my_yyerror("Missing name for argument %d.", e - $<number>8);
b9188f1999-12-13Henrik Grubbström (Grubba)  } else {
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
9039702000-08-15Henrik Grubbström (Grubba)  /* FIXME: Should probably use some other flag. */ if ((runtime_options & RUNTIME_CHECK_TYPES) &&
babd872001-02-23Henrik Grubbström (Grubba)  (Pike_compiler->compiler_frame->variable[e].type != mixed_type_string)) {
9039702000-08-15Henrik Grubbström (Grubba)  node *local_node; /* fprintf(stderr, "Creating soft cast node for local #%d\n", e);*/
faa3232013-02-19Henrik Grubbström (Grubba)  local_node = mkcastnode(mixed_type_string, mklocalnode(e, 0));
9039702000-08-15Henrik Grubbström (Grubba) 
faa3232013-02-19Henrik Grubbström (Grubba)  /* NOTE: The cast to mixed above is needed to avoid generating * compilation errors, as well as avoiding optimizations * in mksoftcastnode().
9039702000-08-15Henrik Grubbström (Grubba)  */ check_args = mknode(F_COMMA_EXPR, check_args, mksoftcastnode(Pike_compiler->compiler_frame->variable[e].type, local_node)); }
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }
b9188f1999-12-13Henrik Grubbström (Grubba)  } }
eb6ba72016-01-11Henrik Grubbström (Grubba)  if ($<number>8) {
1e9a882007-10-05Henrik Grubbström (Grubba)  /* Hook in the initializers for the create arguments. */
eb6ba72016-01-11Henrik Grubbström (Grubba)  for (e = $<number>8; e--;) { $12 = mknode(F_COMMA_EXPR,
1e9a882007-10-05Henrik Grubbström (Grubba)  mknode(F_POP_VALUE,
a1af302017-03-18Henrik Grubbström (Grubba)  mknode(F_ASSIGN, mkidentifiernode(e), mklocalnode(e, 0)), NULL),
eb6ba72016-01-11Henrik Grubbström (Grubba)  $12);
1e9a882007-10-05Henrik Grubbström (Grubba)  } }
587c6a2001-06-30Martin Stjernholm  {
eb6ba72016-01-11Henrik Grubbström (Grubba)  int l = $12->line_number; struct pike_string *f = $12->current_file;
587c6a2001-06-30Martin Stjernholm  if (check_args) { /* Prepend the arg checking code. */
eb6ba72016-01-11Henrik Grubbström (Grubba)  $12 = mknode(F_COMMA_EXPR, mknode(F_POP_VALUE, check_args, NULL), $12);
587c6a2001-06-30Martin Stjernholm  }
e021fe2008-04-14Henrik Grubbström (Grubba)  c->lex.current_line = l; c->lex.current_file = f;
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
329cc01997-02-17Fredrik Hübinette (Hubbe) 
eb6ba72016-01-11Henrik Grubbström (Grubba)  f=dooptcode($5->u.sval.u.string, $12, $<n>11->u.sval.u.type, $1);
be57ea2000-07-14Henrik Grubbström (Grubba) 
1ef5572000-08-30Henrik Grubbström (Grubba)  i = ID_FROM_INT(Pike_compiler->new_program, f); i->opt_flags = Pike_compiler->compiler_frame->opt_flags;
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST &&
3c7fe72015-12-28Per Hedbor  Pike_compiler->compiler_frame->current_return_type->type == PIKE_T_AUTO)
6e0fce2013-05-28Per Hedbor  {
3c7fe72015-12-28Per Hedbor  /* Change "auto" return type to actual return type. */ push_finished_type(Pike_compiler->compiler_frame->current_return_type->car);
eb6ba72016-01-11Henrik Grubbström (Grubba)  e = $<number>8 + $9 - 1;
3c7fe72015-12-28Per Hedbor  if(Pike_compiler->varargs &&
eb6ba72016-01-11Henrik Grubbström (Grubba)  (!$<number>8 || (Pike_compiler->num_create_args >= 0)))
3c7fe72015-12-28Per Hedbor  { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); e--; pop_type_stack(T_ARRAY); }else{ push_type(T_VOID); } push_type(T_MANY); for(; e>=0; e--) { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); push_type(T_FUNCTION); } if (Pike_compiler->current_attributes) { node *n = Pike_compiler->current_attributes; while (n) { push_type_attribute(CDR(n)->u.sval.u.string); n = CAR(n);
6e0fce2013-05-28Per Hedbor  }
3c7fe72015-12-28Per Hedbor  } free_type( i->type ); i->type = compiler_pop_type();
6e0fce2013-05-28Per Hedbor  }
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
be57ea2000-07-14Henrik Grubbström (Grubba)  if(Pike_interpreter.recoveries && ((Pike_sp - Pike_interpreter.evaluator_stack) < Pike_interpreter.recoveries->stack_pointer))
5aad932002-08-15Marcus Comstedt  Pike_fatal("Stack error (underflow)\n");
ae95031999-04-07Fredrik Hübinette (Hubbe) 
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if((Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) &&
d4c3e02002-05-02Henrik Grubbström (Grubba)  (f != Pike_compiler->compiler_frame->current_function_number)) { fprintf(stderr, "define_function()/do_opt_code() failed for symbol %s\n",
eb6ba72016-01-11Henrik Grubbström (Grubba)  $5->u.sval.u.string->str);
d4c3e02002-05-02Henrik Grubbström (Grubba)  dump_program_desc(Pike_compiler->new_program);
5aad932002-08-15Marcus Comstedt  Pike_fatal("define_function screwed up! %d != %d\n",
be57ea2000-07-14Henrik Grubbström (Grubba)  f, Pike_compiler->compiler_frame->current_function_number);
d4c3e02002-05-02Henrik Grubbström (Grubba)  }
294dc51997-08-03Fredrik Hübinette (Hubbe) #endif
c3453f2001-06-30Martin Stjernholm 
e021fe2008-04-14Henrik Grubbström (Grubba)  c->lex.current_line = save_line; c->lex.current_file = save_file;
b715a92008-01-04Henrik Grubbström (Grubba)  } else { /* Prototype; don't warn about unused arguments. */
0b7dff2008-01-04Henrik Grubbström (Grubba)  for (e = Pike_compiler->compiler_frame->current_number_of_locals; e--;) {
b715a92008-01-04Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED; }
6e0fce2013-05-28Per Hedbor  if( Pike_compiler->compiler_frame->current_return_type->type == PIKE_T_AUTO ) yyerror("'auto' return type not allowed for prototypes\n");
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
bc62892009-06-22Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG
eb6ba72016-01-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_frame != $6) {
bc62892009-06-22Henrik Grubbström (Grubba)  Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n",
eb6ba72016-01-11Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame, $6,
bc62892009-06-22Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->previous); } #endif
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  pop_compiler_frame();
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($5); free_node($10); free_node($<n>11);
b5aa651999-12-16Henrik Grubbström (Grubba)  }
e17b7b2016-01-16Henrik Grubbström (Grubba)  | modifiers optional_attributes simple_type
f2dbd22016-01-25Henrik Grubbström (Grubba)  optional_constant TOK_IDENTIFIER start_function
b5aa651999-12-16Henrik Grubbström (Grubba)  error {
bc62892009-06-22Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG
eb6ba72016-01-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_frame != $6) {
bc62892009-06-22Henrik Grubbström (Grubba)  Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n",
eb6ba72016-01-11Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame, $6,
bc62892009-06-22Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->previous); } #endif
b5aa651999-12-16Henrik Grubbström (Grubba)  pop_compiler_frame();
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($5);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
e17b7b2016-01-16Henrik Grubbström (Grubba)  | modifiers optional_attributes simple_type optional_constant bad_identifier
8c77b61998-04-13Henrik Grubbström (Grubba)  {
884b6f2008-06-17Martin Stjernholm  compiler_discard_type();
33b82c1999-12-19Henrik Grubbström (Grubba)  } '(' arguments ')' block_or_semi {
eb6ba72016-01-11Henrik Grubbström (Grubba)  if ($10) free_node($10);
316e7d2008-04-04Henrik Grubbström (Grubba)  }
e17b7b2016-01-16Henrik Grubbström (Grubba)  | modifiers optional_attributes simple_type optional_constant name_list ';'
7e50571996-11-02Fredrik Hübinette (Hubbe)  | inheritance {}
591c0c1997-01-19Fredrik Hübinette (Hubbe)  | import {}
d2c6081996-11-07Fredrik Hübinette (Hubbe)  | constant {}
6dddaa2016-11-09Henrik Grubbström (Grubba)  | modifiers named_class { free_node($2); }
2a343f2008-04-04Henrik Grubbström (Grubba)  | modifiers enum { free_node($2); }
843d2f2018-11-06Henrik Grubbström (Grubba)  | annotation ';' {
02d8da2018-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) { $1 = mknode(F_COMMA_EXPR, $1, NULL); compiler_add_program_annotations(0, $1); }
843d2f2018-11-06Henrik Grubbström (Grubba)  free_node($1); }
906fbd2018-11-07Henrik Grubbström (Grubba)  | '@' TOK_CONSTANT ';' { Pike_compiler->new_program->flags |= PROGRAM_CONSTANT; }
5e3aa52001-04-01Henrik Grubbström (Grubba)  | typedef {}
975c1e2018-09-10Henrik Grubbström (Grubba)  | static_assertion expected_semicolon {}
f76b4c2000-05-11Henrik Grubbström (Grubba)  | error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  { reset_type_stack(); yyerror("Missing ';'."); yyerror("Unexpected end of file"); }
07f33e1998-11-05Henrik Grubbström (Grubba)  | error ';' { reset_type_stack(); yyerrok;
bad5162000-06-23Fredrik Hübinette (Hubbe) /* if(Pike_compiler->num_parse_error>5) YYACCEPT; */
07f33e1998-11-05Henrik Grubbström (Grubba)  }
2968361998-04-14Henrik Grubbström (Grubba)  | error '}' { reset_type_stack();
db271d1998-04-27Henrik Grubbström (Grubba)  yyerror("Missing ';'.");
eb5c901998-04-19Fredrik Hübinette (Hubbe)  /* yychar = '}'; */ /* Put the '}' back on the input stream */
2968361998-04-14Henrik Grubbström (Grubba)  }
21b2c91999-12-17Fredrik Hübinette (Hubbe)  | modifiers
0ad6502012-10-02Per Hedbor  '{'
21b2c91999-12-17Fredrik Hübinette (Hubbe)  {
e021fe2008-04-14Henrik Grubbström (Grubba)  $<number>$=THIS_COMPILATION->lex.pragmas; THIS_COMPILATION->lex.pragmas|=$1;
843d2f2018-11-06Henrik Grubbström (Grubba)  if (Pike_compiler->current_annotations) { yywarning("Annotation blocks are not supported."); }
21b2c91999-12-17Fredrik Hübinette (Hubbe)  } program
d4c3e02002-05-02Henrik Grubbström (Grubba)  close_brace_or_eof
21b2c91999-12-17Fredrik Hübinette (Hubbe)  {
e021fe2008-04-14Henrik Grubbström (Grubba)  THIS_COMPILATION->lex.pragmas=$<number>3;
21b2c91999-12-17Fredrik Hübinette (Hubbe)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
975c1e2018-09-10Henrik Grubbström (Grubba) static_assertion: TOK_STATIC_ASSERT '(' expr0 ',' expr0 ')'
c595602018-09-09Henrik Grubbström (Grubba)  { Pike_compiler->init_node = mknode(F_COMMA_EXPR, Pike_compiler->init_node, mkefuncallnode("_Static_assert", mknode(F_ARG_LIST, $3, $5))); } ;
f76b4c2000-05-11Henrik Grubbström (Grubba) optional_dot_dot_dot: TOK_DOT_DOT_DOT { $$=1; }
a7c3a42000-07-10Henrik Grubbström (Grubba)  | TOK_DOT_DOT { yyerror("Range indicator ('..') where elipsis ('...') expected."); $$=1; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | /* empty */ { $$=0; } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f76b4c2000-05-11Henrik Grubbström (Grubba) optional_identifier: TOK_IDENTIFIER
97358e1998-04-23Fredrik Hübinette (Hubbe)  | bad_identifier { $$=0; }
d2c6081996-11-07Fredrik Hübinette (Hubbe)  | /* empty */ { $$=0; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
dd46aa2014-08-11Per Hedbor new_arg_name: full_type optional_dot_dot_dot optional_identifier
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
01e7e52008-01-03Henrik Grubbström (Grubba)  int i;
c3cfe92000-07-10Henrik Grubbström (Grubba)  if(Pike_compiler->varargs) yyerror("Can't define more arguments after ...");
215bed1996-09-28Fredrik Hübinette (Hubbe) 
7e50571996-11-02Fredrik Hübinette (Hubbe)  if($2) {
04017d2020-01-02Henrik Grubbström (Grubba)  push_unlimited_array_type(T_ARRAY);
c3cfe92000-07-10Henrik Grubbström (Grubba)  Pike_compiler->varargs=1;
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
3c0c281998-01-26Fredrik Hübinette (Hubbe) 
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  if(!$3)
3c0c281998-01-26Fredrik Hübinette (Hubbe)  {
de56ec2003-02-08Martin Stjernholm  $3=mkstrnode(empty_pike_string);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  }
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
96ab241998-02-28Fredrik Hübinette (Hubbe)  if($3->u.sval.u.string->len &&
fe80612000-09-05Henrik Grubbström (Grubba)  islocal($3->u.sval.u.string) >= 0)
2c448d2004-11-05Henrik Grubbström (Grubba)  my_yyerror("Variable %S appears twice in argument list.", $3->u.sval.u.string);
0ad6502012-10-02Per Hedbor 
01e7e52008-01-03Henrik Grubbström (Grubba)  i = add_local_name($3->u.sval.u.string, compiler_pop_type(),0);
ceb95a2008-06-26Henrik Grubbström (Grubba)  if (i >= 0) { /* Don't warn about unused arguments. */
01e7e52008-01-03Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->variable[i].flags |= LOCAL_VAR_IS_USED; }
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($3);
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
bb213c1999-12-27Henrik Grubbström (Grubba) func_args: '(' arguments close_paren_or_missing { free_node($3); $$=$2; } ;
febbc81997-04-22Fredrik Hübinette (Hubbe) 
215bed1996-09-28Fredrik Hübinette (Hubbe) arguments: /* empty */ optional_comma { $$=0; }
97358e1998-04-23Fredrik Hübinette (Hubbe)  | arguments2 optional_comma
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  arguments2: new_arg_name { $$ = 1; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | arguments2 ',' new_arg_name { $$ = $1 + 1; }
76b4491999-12-09Henrik Grubbström (Grubba)  | arguments2 ':' new_arg_name { yyerror("Unexpected ':' in argument list."); $$ = $1 + 1; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
a7c3a42000-07-10Henrik Grubbström (Grubba) modifier:
0085e42014-10-05Martin Nilsson  TOK_FINAL_ID { $$ = ID_FINAL | ID_INLINE; }
2181762014-08-15Martin Nilsson  | TOK_STATIC { $$ = ID_PROTECTED; if( !(THIS_COMPILATION->lex.pragmas & ID_NO_DEPRECATION_WARNINGS) &&
bdfe4e2017-12-11Henrik Grubbström (Grubba)  !TEST_COMPAT(7, 8) && (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) )
edd1962014-11-12Stephen R. van den Berg  yywarning("Keyword static is deprecated in favour of 'protected'.");
2181762014-08-15Martin Nilsson  }
789eee2020-03-11Henrik Grubbström (Grubba)  | TOK_EXTERN { $$ = ID_EXTERN | ID_OPTIONAL; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_OPTIONAL { $$ = ID_OPTIONAL; }
789eee2020-03-11Henrik Grubbström (Grubba)  | TOK_PRIVATE { $$ = ID_PRIVATE | ID_PROTECTED | ID_INLINE; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LOCAL_ID { $$ = ID_INLINE; } | TOK_PUBLIC { $$ = ID_PUBLIC; } | TOK_PROTECTED { $$ = ID_PROTECTED; } | TOK_INLINE { $$ = ID_INLINE; }
8f733e2000-07-12Henrik Grubbström (Grubba)  | TOK_VARIANT { $$ = ID_VARIANT; }
91f4112016-11-05Henrik Grubbström (Grubba)  | TOK_WEAK { $$ = ID_WEAK; }
ba00032019-08-22Henrik Grubbström (Grubba)  | TOK_CONTINUE { $$ = ID_GENERATOR; }
bfd1d42019-11-27Henrik Grubbström (Grubba)  | TOK_UNUSED { $$ = ID_USED; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
315aa81999-12-17Fredrik Hübinette (Hubbe) magic_identifiers1:
0085e42014-10-05Martin Nilsson  TOK_FINAL_ID { $$ = "final"; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_STATIC { $$ = "static"; }
a7c3a42000-07-10Henrik Grubbström (Grubba)  | TOK_EXTERN { $$ = "extern"; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PRIVATE { $$ = "private"; } | TOK_LOCAL_ID { $$ = "local"; } | TOK_PUBLIC { $$ = "public"; } | TOK_PROTECTED { $$ = "protected"; } | TOK_INLINE { $$ = "inline"; } | TOK_OPTIONAL { $$ = "optional"; }
8f733e2000-07-12Henrik Grubbström (Grubba)  | TOK_VARIANT { $$ = "variant"; }
fa47dd2016-09-27Henrik Grubbström (Grubba)  | TOK_WEAK { $$ = "__weak__"; }
bfd1d42019-11-27Henrik Grubbström (Grubba)  | TOK_UNUSED { $$ = "__unused__"; }
c595602018-09-09Henrik Grubbström (Grubba)  | TOK_STATIC_ASSERT { $$ = "_Static_assert"; }
315aa81999-12-17Fredrik Hübinette (Hubbe)  ; magic_identifiers2:
f76b4c2000-05-11Henrik Grubbström (Grubba)  TOK_VOID_ID { $$ = "void"; } | TOK_MIXED_ID { $$ = "mixed"; } | TOK_ARRAY_ID { $$ = "array"; }
d315082008-03-27Henrik Grubbström (Grubba)  | TOK_ATTRIBUTE_ID { $$ = "__attribute__"; }
316e7d2008-04-04Henrik Grubbström (Grubba)  | TOK_DEPRECATED_ID { $$ = "__deprecated__"; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_MAPPING_ID { $$ = "mapping"; } | TOK_MULTISET_ID { $$ = "multiset"; } | TOK_OBJECT_ID { $$ = "object"; } | TOK_FUNCTION_ID { $$ = "function"; }
28b7362008-07-08Henrik Grubbström (Grubba)  | TOK_FUNCTION_NAME { $$ = "__func__"; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PROGRAM_ID { $$ = "program"; } | TOK_STRING_ID { $$ = "string"; } | TOK_FLOAT_ID { $$ = "float"; } | TOK_INT_ID { $$ = "int"; }
76e7f92001-03-18Henrik Grubbström (Grubba)  | TOK_ENUM { $$ = "enum"; }
5e3aa52001-04-01Henrik Grubbström (Grubba)  | TOK_TYPEDEF { $$ = "typedef"; }
6e0fce2013-05-28Per Hedbor  /* | TOK_AUTO_ID { $$ = "auto"; } */
315aa81999-12-17Fredrik Hübinette (Hubbe)  ; magic_identifiers3:
f76b4c2000-05-11Henrik Grubbström (Grubba)  TOK_IF { $$ = "if"; } | TOK_DO { $$ = "do"; } | TOK_FOR { $$ = "for"; } | TOK_WHILE { $$ = "while"; } | TOK_ELSE { $$ = "else"; } | TOK_FOREACH { $$ = "foreach"; } | TOK_CATCH { $$ = "catch"; } | TOK_GAUGE { $$ = "gauge"; } | TOK_CLASS { $$ = "class"; } | TOK_BREAK { $$ = "break"; } | TOK_CASE { $$ = "case"; } | TOK_CONSTANT { $$ = "constant"; } | TOK_CONTINUE { $$ = "continue"; } | TOK_DEFAULT { $$ = "default"; } | TOK_IMPORT { $$ = "import"; } | TOK_INHERIT { $$ = "inherit"; } | TOK_LAMBDA { $$ = "lambda"; } | TOK_PREDEF { $$ = "predef"; } | TOK_RETURN { $$ = "return"; } | TOK_SSCANF { $$ = "sscanf"; } | TOK_SWITCH { $$ = "switch"; } | TOK_TYPEOF { $$ = "typeof"; }
1977e22002-08-18Martin Stjernholm  | TOK_GLOBAL { $$ = "global"; }
315aa81999-12-17Fredrik Hübinette (Hubbe)  ;
21b2c91999-12-17Fredrik Hübinette (Hubbe) magic_identifiers: magic_identifiers1 | magic_identifiers2 | magic_identifiers3 ;
32bc322008-06-18Henrik Grubbström (Grubba) magic_identifier: TOK_IDENTIFIER | TOK_RESERVED
21b2c91999-12-17Fredrik Hübinette (Hubbe)  | magic_identifiers
315aa81999-12-17Fredrik Hübinette (Hubbe)  { struct pike_string *tmp=make_shared_string($1); $$=mkstrnode(tmp); free_string(tmp); } ;
8020bf2018-11-05Henrik Grubbström (Grubba) annotation: '@' constant_expr { $$ = $2; } ;
843d2f2018-11-06Henrik Grubbström (Grubba) annotation_list: /* empty */ { $$ = NULL; } | annotation ':' annotation_list { $$ = mknode(F_COMMA_EXPR, $1, $3); } ; modifiers: annotation_list modifier_list { free_node(Pike_compiler->current_annotations); Pike_compiler->current_annotations = $1; $$ = Pike_compiler->current_modifiers = $2 | (THIS_COMPILATION->lex.pragmas & ID_MODIFIER_MASK); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  modifier_list: /* empty */ { $$ = 0; }
2a343f2008-04-04Henrik Grubbström (Grubba)  | modifier_list modifier { $$ = $1 | $2; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
316e7d2008-04-04Henrik Grubbström (Grubba) attribute: TOK_ATTRIBUTE_ID '(' string_constant optional_comma ')' { $$ = $3; } | TOK_DEPRECATED_ID '(' ')' { struct pike_string *deprecated_string; MAKE_CONST_STRING(deprecated_string, "deprecated"); $$ = mkstrnode(deprecated_string); } | TOK_DEPRECATED_ID { struct pike_string *deprecated_string; MAKE_CONST_STRING(deprecated_string, "deprecated"); $$ = mkstrnode(deprecated_string); } ;
a2af982014-03-01Henrik Grubbström (Grubba) optional_attributes: /* empty */ { if (Pike_compiler->current_attributes) { free_node(Pike_compiler->current_attributes); } if ((Pike_compiler->current_attributes = THIS_COMPILATION->lex.attributes)) { add_ref(Pike_compiler->current_attributes); } } | optional_attributes attribute { if ($2) { Pike_compiler->current_attributes = mknode(F_ARG_LIST, Pike_compiler->current_attributes, $2); } }
316e7d2008-04-04Henrik Grubbström (Grubba)  ;
10fe602003-10-01Martin Stjernholm cast: open_paren_with_line_info type ')'
3c0c281998-01-26Fredrik Hübinette (Hubbe)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *s = compiler_pop_type(); $$ = mktypenode(s);
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(s);
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $1);
10fe602003-10-01Martin Stjernholm  free_node ($1);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  }
2e4e451997-02-13Fredrik Hübinette (Hubbe)  ;
6bc9281998-04-10Fredrik Hübinette (Hubbe) 
10fe602003-10-01Martin Stjernholm soft_cast: open_bracket_with_line_info type ']'
1d73ef1999-11-23Henrik Grubbström (Grubba)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *s = compiler_pop_type(); $$ = mktypenode(s);
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(s);
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $1);
10fe602003-10-01Martin Stjernholm  free_node ($1);
1d73ef1999-11-23Henrik Grubbström (Grubba)  } ;
b59ab22016-01-10Henrik Grubbström (Grubba) /* Either a basic_type-prefixed expression, or an identifier type. * Value on type stack. */
dd46aa2014-08-11Per Hedbor type2: type | identifier_type ;
6bc9281998-04-10Fredrik Hübinette (Hubbe) 
e17b7b2016-01-16Henrik Grubbström (Grubba) /* Full type expression. * Value moved to compiler_frame->current_type. */
dd46aa2014-08-11Per Hedbor simple_type: full_type
6bc9281998-04-10Fredrik Hübinette (Hubbe)  {
b754192016-01-19Henrik Grubbström (Grubba)  update_current_type();
6bc9281998-04-10Fredrik Hübinette (Hubbe)  } ;
58949e2016-01-15Henrik Grubbström (Grubba) /* Basic_type-prefixed expression or an identifier type.
35a4052016-01-24Henrik Grubbström (Grubba)  * Value moved to compiler_frame->current_type.
58949e2016-01-15Henrik Grubbström (Grubba)  */ simple_type2: type2
3c0c281998-01-26Fredrik Hübinette (Hubbe)  {
35a4052016-01-24Henrik Grubbström (Grubba)  update_current_type();
3c0c281998-01-26Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
b59ab22016-01-10Henrik Grubbström (Grubba) /* Full type expression. Value on type stack. * Typically used in contexts where there must be a type, * and expressions are invalid. */
dd46aa2014-08-11Per Hedbor full_type: full_type '|' type3 { push_type(T_OR); } | type3
1220212001-05-08Henrik Grubbström (Grubba)  ;
b59ab22016-01-10Henrik Grubbström (Grubba) /* Basic_type-prefixed expression. Value on type stack. * Typically used in contexts where expressions are valid. */
dd46aa2014-08-11Per Hedbor type: type '|' type3 { push_type(T_OR); }
0ad6502012-10-02Per Hedbor  | basic_type
1220212001-05-08Henrik Grubbström (Grubba)  ;
b59ab22016-01-10Henrik Grubbström (Grubba) /* Either a basic_type or an identifier type. Value on type stack. */
dd46aa2014-08-11Per Hedbor type3: basic_type | identifier_type ;
1220212001-05-08Henrik Grubbström (Grubba) 
b59ab22016-01-10Henrik Grubbström (Grubba) /* Literal type. Value on type stack. */
1220212001-05-08Henrik Grubbström (Grubba) basic_type: TOK_FLOAT_ID { push_type(T_FLOAT); } | TOK_VOID_ID { push_type(T_VOID); } | TOK_MIXED_ID { push_type(T_MIXED); }
ec9bc12016-05-01Henrik Grubbström (Grubba)  | TOK_AUTO_ID { push_type(T_ZERO); push_type(PIKE_T_AUTO); }
157fc62007-03-03Henrik Grubbström (Grubba)  | TOK_STRING_ID opt_string_width {}
1220212001-05-08Henrik Grubbström (Grubba)  | TOK_INT_ID opt_int_range {} | TOK_MAPPING_ID opt_mapping_type {} | TOK_FUNCTION_ID opt_function_type {}
0e2ad42017-11-24Henrik Grubbström (Grubba)  | TOK_OBJECT_ID opt_program_type {}
6513262014-02-16Henrik Grubbström (Grubba)  | TOK_PROGRAM_ID opt_program_type { push_type(T_PROGRAM); }
1bcfb72020-01-09Henrik Grubbström (Grubba)  | TOK_ARRAY_ID opt_array_type {} | TOK_MULTISET_ID opt_multiset_type { push_type(T_MULTISET); }
dd46aa2014-08-11Per Hedbor  | TOK_ATTRIBUTE_ID '(' string_constant ',' full_type ')'
d315082008-03-27Henrik Grubbström (Grubba)  { push_type_attribute($3->u.sval.u.string); free_node($3); } | TOK_ATTRIBUTE_ID '(' string_constant error ')' { push_type(T_MIXED); push_type_attribute($3->u.sval.u.string); free_node($3); } | TOK_ATTRIBUTE_ID error { push_type(T_MIXED); }
dd46aa2014-08-11Per Hedbor  | TOK_DEPRECATED_ID '(' full_type ')'
316e7d2008-04-04Henrik Grubbström (Grubba)  { struct pike_string *deprecated_string; MAKE_CONST_STRING(deprecated_string, "deprecated"); push_type_attribute(deprecated_string); } | TOK_DEPRECATED_ID '(' error ')' { struct pike_string *deprecated_string; MAKE_CONST_STRING(deprecated_string, "deprecated"); push_type(T_MIXED); push_type_attribute(deprecated_string); }
1220212001-05-08Henrik Grubbström (Grubba)  ;
3c0f892017-12-10Henrik Grubbström (Grubba) /* Identifier type. Value on type stack. * * NB: Introduces shift-reduce conflict on TOK_LOCAL_ID. */ identifier_type: idents
0ad6502012-10-02Per Hedbor  {
17f4dc2014-05-04Henrik Grubbström (Grubba)  if ($1) { fix_type_field($1);
ff85722021-03-22Henrik Grubbström (Grubba)  if (!pike_types_le($1->type, typeable_type_string, 0, 0) &&
17f4dc2014-05-04Henrik Grubbström (Grubba)  (THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) { yytype_report(REPORT_WARNING, $1->current_file, $1->line_number, typeable_type_string, $1->current_file, $1->line_number, $1->type, 0, "Invalid type."); }
38f9312014-05-03Henrik Grubbström (Grubba)  }
94d5aa2017-11-25Henrik Grubbström (Grubba)  resolv_type($1);
7a08f32000-01-25Henrik Grubbström (Grubba) 
f62c412001-03-05Henrik Grubbström (Grubba)  /* Attempt to name the type. */ if (Pike_compiler->last_identifier) { push_type_name(Pike_compiler->last_identifier); }
cb1f782017-11-26Henrik Grubbström (Grubba) 
7a08f32000-01-25Henrik Grubbström (Grubba)  free_node($1); }
960a872016-05-14Henrik Grubbström (Grubba)  | typeof {
e9fbb72018-05-21Henrik Grubbström (Grubba)  if ($1 && CAR($1)) { fix_type_field($1); push_finished_type(CAR($1)->type);
960a872016-05-14Henrik Grubbström (Grubba)  free_node($1); } else { push_finished_type(mixed_type_string); } }
7a08f32000-01-25Henrik Grubbström (Grubba)  ;
6bc9281998-04-10Fredrik Hübinette (Hubbe) 
b878692019-12-21Henrik Grubbström (Grubba) number: TOK_NUMBER
f76b4c2000-05-11Henrik Grubbström (Grubba)  | '-' TOK_NUMBER
3dc8561999-12-30Henrik Grubbström (Grubba)  { #ifdef PIKE_DEBUG
017b572011-10-28Henrik Grubbström (Grubba)  if (($2->token != F_CONSTANT) || (TYPEOF($2->u.sval) != T_INT)) {
5aad932002-08-15Marcus Comstedt  Pike_fatal("Unexpected number in negative int-range.\n");
3dc8561999-12-30Henrik Grubbström (Grubba)  } #endif /* PIKE_DEBUG */ $$ = mkintnode(-($2->u.sval.u.integer)); free_node($2); }
f5fd531999-03-29Henrik Grubbström (Grubba)  ;
b878692019-12-21Henrik Grubbström (Grubba) number_or_maxint: /* Empty */
f5fd531999-03-29Henrik Grubbström (Grubba)  {
b878692019-12-21Henrik Grubbström (Grubba)  $$ = mkintnode(MAX_INT_TYPE);
f5fd531999-03-29Henrik Grubbström (Grubba)  }
b878692019-12-21Henrik Grubbström (Grubba)  | number; number_or_minint: /* Empty */
3dc8561999-12-30Henrik Grubbström (Grubba)  {
b878692019-12-21Henrik Grubbström (Grubba)  $$ = mkintnode(MIN_INT_TYPE);
3dc8561999-12-30Henrik Grubbström (Grubba)  }
b878692019-12-21Henrik Grubbström (Grubba)  | number;
f5fd531999-03-29Henrik Grubbström (Grubba) 
a7c3a42000-07-10Henrik Grubbström (Grubba) expected_dot_dot: TOK_DOT_DOT | TOK_DOT_DOT_DOT { yyerror("Elipsis ('...') where range indicator ('..') expected."); } ;
1bcfb72020-01-09Henrik Grubbström (Grubba) safe_int_range_type: TOK_BITS
e04ce12013-12-11Per Hedbor  {
1bcfb72020-01-09Henrik Grubbström (Grubba)  push_int_type( 0, (1<<$1->u.sval.u.integer)-1 ); free_node( $1 );
e04ce12013-12-11Per Hedbor  }
1bcfb72020-01-09Henrik Grubbström (Grubba)  | number_or_minint expected_dot_dot number_or_maxint
f5fd531999-03-29Henrik Grubbström (Grubba)  {
69aa4b2003-01-26Mirar (Pontus Hagland)  INT_TYPE min = MIN_INT_TYPE; INT_TYPE max = MAX_INT_TYPE;
3611422001-02-20Henrik Grubbström (Grubba) 
1bcfb72020-01-09Henrik Grubbström (Grubba)  /* FIXME: Check that $3 is >= $1. */ if($3->token == F_CONSTANT) { if (TYPEOF($3->u.sval) == T_INT) { max = $3->u.sval.u.integer; } else if (is_bignum_object_in_svalue(&$3->u.sval)) {
96c3932002-08-27Henrik Grubbström (Grubba)  push_int(0);
1bcfb72020-01-09Henrik Grubbström (Grubba)  if (is_lt(&$3->u.sval, Pike_sp-1)) {
69aa4b2003-01-26Mirar (Pontus Hagland)  max = MIN_INT_TYPE;
96c3932002-08-27Henrik Grubbström (Grubba)  } pop_stack(); }
011ad31999-10-22Fredrik Hübinette (Hubbe)  }
1bcfb72020-01-09Henrik Grubbström (Grubba)  if($1->token == F_CONSTANT) { if (TYPEOF($1->u.sval) == T_INT) { min = $1->u.sval.u.integer; } else if (is_bignum_object_in_svalue(&$1->u.sval)) {
96c3932002-08-27Henrik Grubbström (Grubba)  push_int(0);
1bcfb72020-01-09Henrik Grubbström (Grubba)  if (is_lt(Pike_sp-1, &$1->u.sval)) {
69aa4b2003-01-26Mirar (Pontus Hagland)  min = MAX_INT_TYPE;
96c3932002-08-27Henrik Grubbström (Grubba)  } pop_stack(); }
011ad31999-10-22Fredrik Hübinette (Hubbe)  }
3611422001-02-20Henrik Grubbström (Grubba)  push_int_type(min, max);
1bcfb72020-01-09Henrik Grubbström (Grubba)  free_node($1); free_node($3);
8c77b61998-04-13Henrik Grubbström (Grubba)  }
1bcfb72020-01-09Henrik Grubbström (Grubba)  | number
b878692019-12-21Henrik Grubbström (Grubba)  { INT_TYPE val = MAX_INT_TYPE;
1bcfb72020-01-09Henrik Grubbström (Grubba)  if($1->token == F_CONSTANT) { if (TYPEOF($1->u.sval) == T_INT) { val = $1->u.sval.u.integer; } else if (is_bignum_object_in_svalue(&$1->u.sval)) {
b878692019-12-21Henrik Grubbström (Grubba)  push_int(0);
1bcfb72020-01-09Henrik Grubbström (Grubba)  if (is_lt(&$1->u.sval, Pike_sp-1)) {
b878692019-12-21Henrik Grubbström (Grubba)  val = MIN_INT_TYPE; } pop_stack(); } } push_int_type(val, val);
1bcfb72020-01-09Henrik Grubbström (Grubba)  free_node($1);
b878692019-12-21Henrik Grubbström (Grubba)  }
1bcfb72020-01-09Henrik Grubbström (Grubba)  | error
157fc62007-03-03Henrik Grubbström (Grubba)  {
4e6c082007-05-02Henrik Grubbström (Grubba)  push_int_type(MIN_INT32, MAX_INT32); yyerror("Expected integer range.");
157fc62007-03-03Henrik Grubbström (Grubba)  }
4e6c082007-05-02Henrik Grubbström (Grubba)  ;
157fc62007-03-03Henrik Grubbström (Grubba) 
1bcfb72020-01-09Henrik Grubbström (Grubba) opt_int_range: /* Empty */ { push_int_type(MIN_INT_TYPE, MAX_INT_TYPE); } | '(' safe_int_range_type ')' ;
4e6c082007-05-02Henrik Grubbström (Grubba) opt_string_width: opt_int_range
1bcfb72020-01-09Henrik Grubbström (Grubba)  { push_unlimited_array_type(T_STRING); } | '(' safe_int_range_type ':' safe_int_range_type ')' { push_reverse_type(T_STRING); } | '(' safe_int_range_type ':' ')' { push_finished_type(int_type_string); push_reverse_type(T_STRING); } | '(' ':' safe_int_range_type ')'
157fc62007-03-03Henrik Grubbström (Grubba)  {
04017d2020-01-02Henrik Grubbström (Grubba)  push_unlimited_array_type(T_STRING);
157fc62007-03-03Henrik Grubbström (Grubba)  } ;
6513262014-02-16Henrik Grubbström (Grubba) opt_program_type: /* Empty */ { push_object_type(0, 0); }
dd46aa2014-08-11Per Hedbor  | '(' full_type ')'
8e38712017-11-27Henrik Grubbström (Grubba)  | '(' string_constant ')' { resolv_type($2);
b6f16a2017-11-27Stephen R. van den Berg  push_type_name($2->u.sval.u.string);
8e38712017-11-27Henrik Grubbström (Grubba)  free_node($2); }
6513262014-02-16Henrik Grubbström (Grubba)  | '(' error ')' { push_object_type(0, 0); yyerror("Invalid program subtype."); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) opt_function_type: '('
7e50571996-11-02Fredrik Hübinette (Hubbe)  { type_stack_mark(); } function_type_list optional_dot_dot_dot ':' {
0aa4ba2001-02-25Henrik Grubbström (Grubba)  /* Add the many type if there is none. */
7e50571996-11-02Fredrik Hübinette (Hubbe)  if ($4) {
0aa4ba2001-02-25Henrik Grubbström (Grubba)  if (!$3) {
7e71da2000-03-30Henrik Grubbström (Grubba)  /* function_type_list ends with a comma, or is empty. * FIXME: Should this be a syntax error or not? */
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) {
6deabd2000-03-30Henrik Grubbström (Grubba)  yyerror("Missing type before ... .");
85fb3d2000-03-30Henrik Grubbström (Grubba)  }
7e71da2000-03-30Henrik Grubbström (Grubba)  push_type(T_MIXED);
cbae7e2000-03-30Henrik Grubbström (Grubba)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  }else{ push_type(T_VOID); } }
dd46aa2014-08-11Per Hedbor  full_type ')'
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
92aeb12001-02-26Henrik Grubbström (Grubba)  push_reverse_type(T_MANY); Pike_compiler->pike_type_mark_stackp--;
dfed932001-03-03Henrik Grubbström (Grubba)  while (*Pike_compiler->pike_type_mark_stackp+1 <
92aeb12001-02-26Henrik Grubbström (Grubba)  Pike_compiler->type_stackp) { push_reverse_type(T_FUNCTION); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  } | /* empty */ { push_type(T_MIXED);
327c051999-11-24Fredrik Hübinette (Hubbe)  push_type(T_VOID); push_type(T_OR);
2401c72000-01-03Martin Stjernholm  push_type(T_ZERO);
327c051999-11-24Fredrik Hübinette (Hubbe)  push_type(T_VOID); push_type(T_OR);
7e50571996-11-02Fredrik Hübinette (Hubbe)  push_type(T_MANY); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
cbae7e2000-03-30Henrik Grubbström (Grubba) function_type_list: /* Empty */ optional_comma { $$=0; } | function_type_list2 optional_comma { $$=!$2; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
dd46aa2014-08-11Per Hedbor function_type_list2: full_type { $$=1; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | function_type_list2 ',' { }
dd46aa2014-08-11Per Hedbor  full_type
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
1bcfb72020-01-09Henrik Grubbström (Grubba) opt_multiset_type: '(' full_type ')'
7e50571996-11-02Fredrik Hübinette (Hubbe)  | { push_type(T_MIXED); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
1bcfb72020-01-09Henrik Grubbström (Grubba) opt_array_type: '(' full_type ')' { push_unlimited_array_type(T_ARRAY); } | /* Empty */ { push_type(T_MIXED); push_unlimited_array_type(T_ARRAY); } | '(' safe_int_range_type ':' full_type ')' { push_reverse_type(T_ARRAY); } | '(' ':' full_type ')' { push_unlimited_array_type(T_ARRAY); } | '(' safe_int_range_type ':' ')' { push_type(T_MIXED); push_reverse_type(T_ARRAY); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) opt_mapping_type: '('
0ad6502012-10-02Per Hedbor  {
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
dd46aa2014-08-11Per Hedbor  full_type ':'
0ad6502012-10-02Per Hedbor  {
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
dd46aa2014-08-11Per Hedbor  full_type
0ad6502012-10-02Per Hedbor  {
92aeb12001-02-26Henrik Grubbström (Grubba)  push_reverse_type(T_MAPPING);
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ')'
0ad6502012-10-02Per Hedbor  | /* empty */
7e50571996-11-02Fredrik Hübinette (Hubbe)  { push_type(T_MIXED); push_type(T_MIXED);
92aeb12001-02-26Henrik Grubbström (Grubba)  push_type(T_MAPPING);
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  name_list: new_name
7e50571996-11-02Fredrik Hübinette (Hubbe)  | name_list ',' new_name ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
eb6ba72016-01-11Henrik Grubbström (Grubba) new_name: TOK_IDENTIFIER
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *type;
a2af982014-03-01Henrik Grubbström (Grubba)  node *n;
d391572021-02-22Henrik Grubbström (Grubba) 
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->current_type);
d391572021-02-22Henrik Grubbström (Grubba)  if (!TEST_COMPAT(8,0) && (THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES) && (Pike_compiler->compiler_frame->current_type->type != PIKE_T_AUTO)) { if (!pike_types_le(zero_type_string,
ff85722021-03-22Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->current_type, 0, 0)) {
d391572021-02-22Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) { ref_push_string($1->u.sval.u.string); yytype_report(REPORT_WARNING, NULL, 0, zero_type_string, NULL, 0, Pike_compiler->compiler_frame->current_type, 1, "Type does not contain zero for variable without " "initializer %s. Type adjusted."); } push_type(PIKE_T_ZERO); push_type(T_OR); } }
a2af982014-03-01Henrik Grubbström (Grubba)  n = Pike_compiler->current_attributes; while(n) { push_type_attribute(CDR(n)->u.sval.u.string); n = CAR(n); }
4142a61998-05-19Fredrik Hübinette (Hubbe)  type=compiler_pop_type();
eb6ba72016-01-11Henrik Grubbström (Grubba)  define_variable($1->u.sval.u.string, type,
019b3d2000-07-09Henrik Grubbström (Grubba)  Pike_compiler->current_modifiers);
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(type);
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  | bad_identifier {} | TOK_IDENTIFIER '='
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *type;
a2af982014-03-01Henrik Grubbström (Grubba)  node *n;
d391572021-02-22Henrik Grubbström (Grubba) 
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->current_type);
a2af982014-03-01Henrik Grubbström (Grubba)  n = Pike_compiler->current_attributes; while(n) { push_type_attribute(CDR(n)->u.sval.u.string); n = CAR(n); }
4142a61998-05-19Fredrik Hübinette (Hubbe)  type=compiler_pop_type();
019b3d2000-07-09Henrik Grubbström (Grubba)  if ((Pike_compiler->current_modifiers & ID_EXTERN) &&
bdfe4e2017-12-11Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
8fd9311999-12-30Henrik Grubbström (Grubba)  yywarning("Extern declared variable has initializer."); }
eb6ba72016-01-11Henrik Grubbström (Grubba)  $<number>$=define_variable($1->u.sval.u.string, type,
019b3d2000-07-09Henrik Grubbström (Grubba)  Pike_compiler->current_modifiers & (~ID_EXTERN));
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(type);
7e50571996-11-02Fredrik Hübinette (Hubbe)  } expr0 {
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if ((Pike_compiler->compiler_pass == COMPILER_PASS_LAST) &&
eb6ba72016-01-11Henrik Grubbström (Grubba)  !TEST_COMPAT(7, 8) && ($4) && ($4->token == F_CONSTANT) &&
85c69f2013-07-13Henrik Grubbström (Grubba)  !Pike_compiler->num_parse_error) {
9dce2a2013-07-16Henrik Grubbström (Grubba)  /* Check if it is zero, in which case we can throw it away.
548c512013-07-01Henrik Grubbström (Grubba)  * * NB: The compat test is due to that this changes the semantics * of calling __INIT() by hand. */
eb6ba72016-01-11Henrik Grubbström (Grubba)  if ((TYPEOF($4->u.sval) == PIKE_T_INT) && !SUBTYPEOF($4->u.sval) && !$4->u.sval.u.integer &&
9dce2a2013-07-16Henrik Grubbström (Grubba)  !IDENTIFIER_IS_ALIAS(ID_FROM_INT(Pike_compiler->new_program,
eb6ba72016-01-11Henrik Grubbström (Grubba)  $<number>3)->identifier_flags)) {
9dce2a2013-07-16Henrik Grubbström (Grubba)  /* NB: Inherited variables get converted into aliases by * define_variable, and we need to support clearing * of inherited variables. */
85aa842015-02-06Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG if (l_flag > 5) { fprintf(stderr, "Ignoring initialization to zero for variable %s.\n",
eb6ba72016-01-11Henrik Grubbström (Grubba)  $1->u.sval.u.string->str);
85aa842015-02-06Henrik Grubbström (Grubba)  } #endif /* PIKE_DEBUG */
bb88422015-12-29Per Hedbor  if(Pike_compiler->compiler_frame->current_type->type == PIKE_T_AUTO)
6e0fce2013-05-28Per Hedbor  { // auto variable type needs to be updated.
eb6ba72016-01-11Henrik Grubbström (Grubba)  fix_type_field( $4 ); fix_auto_variable_type( $<number>3, $4->type );
6e0fce2013-05-28Per Hedbor  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($4); $4 = NULL;
548c512013-07-01Henrik Grubbström (Grubba)  } }
eb6ba72016-01-11Henrik Grubbström (Grubba)  if ($4) {
3ea0242019-07-09Henrik Grubbström (Grubba)  node *n;
bb88422015-12-29Per Hedbor  // this is done in both passes to get somewhat better handling // of auto types. // // an example is: auto a = typeof(b); auto b = (["foo":"bar"]); // if this is only done in the second pass the type of a will be // type(auto), not type(mapping(..)) if( Pike_compiler->compiler_frame->current_type->type == PIKE_T_AUTO )
6e0fce2013-05-28Per Hedbor  {
eb6ba72016-01-11Henrik Grubbström (Grubba)  fix_type_field( $4 ); fix_auto_variable_type( $<number>3, $4->type );
6e0fce2013-05-28Per Hedbor  }
3ea0242019-07-09Henrik Grubbström (Grubba)  n = mkcastnode(void_type_string, mknode(F_ASSIGN, mkidentifiernode($<number>3), $4)); if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) { // This makes sure that #pragma {no_,}deprecation_warnings // works as expected. optimize_node(n); }
548c512013-07-01Henrik Grubbström (Grubba)  Pike_compiler->init_node=mknode(F_COMMA_EXPR,Pike_compiler->init_node,
3ea0242019-07-09Henrik Grubbström (Grubba)  n);
548c512013-07-01Henrik Grubbström (Grubba)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  | TOK_IDENTIFIER '=' error
2968361998-04-14Henrik Grubbström (Grubba)  {
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
2968361998-04-14Henrik Grubbström (Grubba)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  | TOK_IDENTIFIER '=' TOK_LEX_EOF
e67c861998-08-01Henrik Grubbström (Grubba)  { yyerror("Unexpected end of file in variable definition.");
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
e67c861998-08-01Henrik Grubbström (Grubba)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  | bad_identifier '=' expr0
8c77b61998-04-13Henrik Grubbström (Grubba)  {
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($3);
8c77b61998-04-13Henrik Grubbström (Grubba)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
35a4052016-01-24Henrik Grubbström (Grubba) /* Type at compiler_frame->current_type. */
eb6ba72016-01-11Henrik Grubbström (Grubba) new_local_name: TOK_IDENTIFIER
abdfb62002-09-28Martin Stjernholm  { int id;
3c7fe72015-12-28Per Hedbor  struct pike_type *type;
35a4052016-01-24Henrik Grubbström (Grubba)  copy_pike_type(type, Pike_compiler->compiler_frame->current_type);
eb6ba72016-01-11Henrik Grubbström (Grubba)  id = add_local_name($1->u.sval.u.string, type, 0);
3c7fe72015-12-28Per Hedbor  if( type->type == PIKE_T_AUTO ) { /* FIXME: Update type on assign instead! */ yyerror("auto only valid when the variable is assigned in definition."); }
c981662006-03-02Henrik Grubbström (Grubba)  if (id >= 0) { /* FIXME: Consider using mklocalnode(id, -1). */
a1af302017-03-18Henrik Grubbström (Grubba)  $$=mknode(F_ASSIGN, mklocalnode(id,0), mkintnode(0));
c981662006-03-02Henrik Grubbström (Grubba)  } else
abdfb62002-09-28Martin Stjernholm  $$ = 0;
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  | bad_identifier { $$=0; }
35a4052016-01-24Henrik Grubbström (Grubba)  | TOK_IDENTIFIER '=' { push_finished_type(Pike_compiler->compiler_frame->current_type); type_stack_mark(); } expr0
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
abdfb62002-09-28Martin Stjernholm  int id;
6e0fce2013-05-28Per Hedbor  struct pike_type *type;
35a4052016-01-24Henrik Grubbström (Grubba)  pop_stack_mark(); update_current_type(); copy_pike_type(type, Pike_compiler->compiler_frame->current_type);
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if( type->type == PIKE_T_AUTO && Pike_compiler->compiler_pass == COMPILER_PASS_LAST)
6e0fce2013-05-28Per Hedbor  { free_type( type );
35a4052016-01-24Henrik Grubbström (Grubba)  fix_type_field( $4 ); copy_pike_type( type, $4->type );
6e0fce2013-05-28Per Hedbor  }
eb6ba72016-01-11Henrik Grubbström (Grubba)  id = add_local_name($1->u.sval.u.string, type, 0);
b1d40c2008-01-04Henrik Grubbström (Grubba)  if (id >= 0) {
e021fe2008-04-14Henrik Grubbström (Grubba)  if (!(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
b1d40c2008-01-04Henrik Grubbström (Grubba)  /* Only warn about unused initialized variables in strict types mode. */ Pike_compiler->compiler_frame->variable[id].flags |= LOCAL_VAR_IS_USED; }
ed61452021-02-27Henrik Grubbström (Grubba)  $$ = mknode(F_INITIALIZE, mklocalnode(id, 0), $4);
b1d40c2008-01-04Henrik Grubbström (Grubba)  } else
abdfb62002-09-28Martin Stjernholm  $$ = 0;
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
35a4052016-01-24Henrik Grubbström (Grubba)  | bad_identifier '='
8c77b61998-04-13Henrik Grubbström (Grubba)  {
35a4052016-01-24Henrik Grubbström (Grubba)  push_finished_type(Pike_compiler->compiler_frame->current_type); type_stack_mark(); } expr0 { pop_stack_mark(); update_current_type(); free_node($4);
5b6acd1998-04-30Fredrik Hübinette (Hubbe)  $$=0;
8c77b61998-04-13Henrik Grubbström (Grubba)  }
35a4052016-01-24Henrik Grubbström (Grubba)  | TOK_IDENTIFIER '=' { push_finished_type(Pike_compiler->compiler_frame->current_type); type_stack_mark(); } error
8c77b61998-04-13Henrik Grubbström (Grubba)  {
35a4052016-01-24Henrik Grubbström (Grubba)  pop_stack_mark(); update_current_type();
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
8c77b61998-04-13Henrik Grubbström (Grubba)  /* No yyerok here since we aren't done yet. */
5b6acd1998-04-30Fredrik Hübinette (Hubbe)  $$=0;
8c77b61998-04-13Henrik Grubbström (Grubba)  }
35a4052016-01-24Henrik Grubbström (Grubba)  | TOK_IDENTIFIER '='
e67c861998-08-01Henrik Grubbström (Grubba)  {
35a4052016-01-24Henrik Grubbström (Grubba)  push_finished_type(Pike_compiler->compiler_frame->current_type); type_stack_mark(); } TOK_LEX_EOF { pop_stack_mark(); update_current_type();
e67c861998-08-01Henrik Grubbström (Grubba)  yyerror("Unexpected end of file in local variable definition.");
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($1);
e67c861998-08-01Henrik Grubbström (Grubba)  /* No yyerok here since we aren't done yet. */ $$=0; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
9b39022003-03-27Martin Stjernholm line_number_info: /* empty */ { /* Used to hold line-number info */ $$ = mkintnode(0); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) block:'{'
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
bad5162000-06-23Fredrik Hübinette (Hubbe)  $<number>1=Pike_compiler->num_used_modules; $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
0ad6502012-10-02Per Hedbor  }
9b39022003-03-27Martin Stjernholm  line_number_info
02a79a2000-09-04Fredrik Hübinette (Hubbe)  { /* Trick to store more than one number on compiler stack - Hubbe */ $<number>$=Pike_compiler->compiler_frame->last_block_level;
120d842000-11-08Fredrik Hübinette (Hubbe)  if($<number>$ == -1) /* if 'first block' */ Pike_compiler->compiler_frame->last_block_level=0; /* all variables */ else Pike_compiler->compiler_frame->last_block_level=$<number>2;
02a79a2000-09-04Fredrik Hübinette (Hubbe)  }
46cce12017-08-13Henrik Grubbström (Grubba)  { $<ptr>$ = Pike_compiler; }
73a2a11998-04-27Henrik Grubbström (Grubba)  statements end_block
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
46cce12017-08-13Henrik Grubbström (Grubba)  /* Recover compilation context on syntax errors. */ while (Pike_compiler != $<ptr>5) { struct program *p; /* fprintf(stderr, "Compiler context out of sync. Attempting to recover...\n"); */
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass != COMPILER_PASS_LAST)
46cce12017-08-13Henrik Grubbström (Grubba)  p = end_first_pass(0); else p=end_first_pass(1); if (p) free_program(p); }
bad5162000-06-23Fredrik Hübinette (Hubbe)  unuse_modules(Pike_compiler->num_used_modules - $<number>1);
46cce12017-08-13Henrik Grubbström (Grubba)  $6 = pop_local_variables($<number>2, $6);
702ea52002-10-11Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->last_block_level=$<number>4;
46cce12017-08-13Henrik Grubbström (Grubba)  if ($6) COPY_LINE_NUMBER_INFO($6, $3);
9b39022003-03-27Martin Stjernholm  free_node ($3);
46cce12017-08-13Henrik Grubbström (Grubba)  $$=$6;
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
eb9ef92010-11-19Henrik Grubbström (Grubba) /* Node with line number info at $0. */
73a2a11998-04-27Henrik Grubbström (Grubba) end_block: '}'
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF
73a2a11998-04-27Henrik Grubbström (Grubba)  { yyerror("Missing '}'.");
eb9ef92010-11-19Henrik Grubbström (Grubba)  if ($<n>0) { low_yyreport(REPORT_ERROR, $<n>0->current_file, $<n>0->line_number, parser_system_string, 0, "Opening '{' was here."); }
73a2a11998-04-27Henrik Grubbström (Grubba)  yyerror("Unexpected end of file."); } ;
01d3e21997-04-23Fredrik Hübinette (Hubbe) failsafe_block: block
73a2a11998-04-27Henrik Grubbström (Grubba)  | error { $$=0; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=0; }
01d3e21997-04-23Fredrik Hübinette (Hubbe)  ;
a30f092000-07-12Fredrik Hübinette (Hubbe) 
35a4052016-01-24Henrik Grubbström (Grubba) /* Type at compiler_frame->current_type. */
215bed1996-09-28Fredrik Hübinette (Hubbe) local_name_list: new_local_name
35a4052016-01-24Henrik Grubbström (Grubba)  | local_name_list ',' new_local_name { $$ = mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $1), $3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f5df592000-10-25Fredrik Hübinette (Hubbe) 
8020bf2018-11-05Henrik Grubbström (Grubba) constant_expr: safe_expr0 { /* Ugly hack to make sure that $1 is optimized */ { int tmp = Pike_compiler->compiler_pass; $$ = mknode(F_COMMA_EXPR, $1, 0); optimize_node($$); Pike_compiler->compiler_pass = tmp; } if(!is_const($$)) { if(Pike_compiler->compiler_pass == COMPILER_PASS_LAST) yyerror("Expected constant expression."); push_int(0); } else { ptrdiff_t tmp = eval_low($$, 1); if(tmp < 1) { if(Pike_compiler->compiler_pass == COMPILER_PASS_LAST) yyerror("Error evaluating constant expression."); push_int(0); } else { pop_n_elems((INT32)(tmp - 1)); } } free_node($$);
843d2f2018-11-06Henrik Grubbström (Grubba)  $$ = mkconstantsvaluenode(Pike_sp - 1);
8020bf2018-11-05Henrik Grubbström (Grubba)  pop_stack(); } ;
f5df592000-10-25Fredrik Hübinette (Hubbe) local_constant_name: TOK_IDENTIFIER '=' safe_expr0 {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *type;
f5df592000-10-25Fredrik Hübinette (Hubbe)  /* Ugly hack to make sure that $3 is optimized */ { int tmp=Pike_compiler->compiler_pass; $3=mknode(F_COMMA_EXPR,$3,0);
71bde82001-03-16Fredrik Hübinette (Hubbe)  optimize_node($3);
f5df592000-10-25Fredrik Hübinette (Hubbe)  Pike_compiler->compiler_pass=tmp; type=$3->u.node.a->type; }
1adcc92018-02-14Henrik Grubbström (Grubba)  if(!is_const($3))
f5df592000-10-25Fredrik Hübinette (Hubbe)  {
d38e6a2017-12-14Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass == COMPILER_PASS_LAST)
1adcc92018-02-14Henrik Grubbström (Grubba)  yyerror("Constant definition is not constant.");
f5df592000-10-25Fredrik Hübinette (Hubbe)  }else{
1adcc92018-02-14Henrik Grubbström (Grubba)  ptrdiff_t tmp=eval_low($3,1);
f5df592000-10-25Fredrik Hübinette (Hubbe)  if(tmp < 1) { yyerror("Error in constant definition."); }else{
bd67392015-10-14Martin Nilsson  pop_n_elems((INT32)(tmp - 1));
f5df592000-10-25Fredrik Hübinette (Hubbe)  if($3) free_node($3); $3=mksvaluenode(Pike_sp-1); type=$3->type; pop_stack(); } }
babd872001-02-23Henrik Grubbström (Grubba)  if(!type) type = mixed_type_string;
f5df592000-10-25Fredrik Hübinette (Hubbe)  add_ref(type);
f2e5442019-08-16Henrik Grubbström (Grubba)  add_local_name($1->u.sval.u.string, type, $3);
147cb72008-01-05Henrik Grubbström (Grubba)  /* Note: Intentionally not marked as used. */
f5df592000-10-25Fredrik Hübinette (Hubbe)  free_node($1); } | bad_identifier '=' safe_expr0 { if ($3) free_node($3); } | error '=' safe_expr0 { if ($3) free_node($3); } ; local_constant_list: local_constant_name
1070292000-11-04Henrik Grubbström (Grubba)  | local_constant_list ',' local_constant_name
f5df592000-10-25Fredrik Hübinette (Hubbe)  ;
1070292000-11-04Henrik Grubbström (Grubba) local_constant: TOK_CONSTANT local_constant_list ';' | TOK_CONSTANT error ';' { yyerrok; } | TOK_CONSTANT error TOK_LEX_EOF
f5df592000-10-25Fredrik Hübinette (Hubbe)  { yyerror("Missing ';'."); yyerror("Unexpected end of file."); }
1070292000-11-04Henrik Grubbström (Grubba)  | TOK_CONSTANT error '}' { yyerror("Missing ';'."); }
f5df592000-10-25Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) statements: { $$=0; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | statements statement {
babd872001-02-23Henrik Grubbström (Grubba)  $$ = mknode(F_COMMA_EXPR, $1, mkcastnode(void_type_string, $2));
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
c595602018-09-09Henrik Grubbström (Grubba) statement_with_semicolon: unused2 expected_semicolon ;
f5df592000-10-25Fredrik Hübinette (Hubbe) 
71bde82001-03-16Fredrik Hübinette (Hubbe) normal_label_statement: statement_with_semicolon
97358e1998-04-23Fredrik Hübinette (Hubbe)  | import { $$=0; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | cond
71bde82001-03-16Fredrik Hübinette (Hubbe)  | return
f5df592000-10-25Fredrik Hübinette (Hubbe)  | local_constant { $$=0; }
97358e1998-04-23Fredrik Hübinette (Hubbe)  | block
586b8a1998-04-28Henrik Grubbström (Grubba)  | break expected_semicolon | continue expected_semicolon
e2acf71997-04-23Henrik Grubbström (Grubba)  | error ';' { reset_type_stack(); $$=0; yyerrok; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  { reset_type_stack(); yyerror("Missing ';'."); yyerror("Unexpected end of file."); $$=0; }
4d21331998-04-14Henrik Grubbström (Grubba)  | error '}' { reset_type_stack();
998e1f1998-04-15Henrik Grubbström (Grubba)  yyerror("Missing ';'.");
eb5c901998-04-19Fredrik Hübinette (Hubbe) /* yychar = '}'; */ /* Put the '}' back on the input stream. */ $$=0;
4d21331998-04-14Henrik Grubbström (Grubba)  }
0ad6502012-10-02Per Hedbor  | ';' { $$=0; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
5a0fd52001-01-10Martin Stjernholm statement: normal_label_statement { Pike_compiler->compiler_frame->opt_flags &= ~OPT_CUSTOM_LABELS; } | while | do | for | foreach | switch | case | default | labeled_statement
9637492016-10-06Henrik Grubbström (Grubba)  | simple_type2 local_function { $$=mkcastnode(void_type_string, $2); }
3bc6c12019-09-17Henrik Grubbström (Grubba)  | TOK_CONTINUE simple_type2 local_generator { /* NB: The alternative of prefixing the local_function rule above with * an optional_continue causes lots of shift/reduce conflicts. * Thus the separate rule for local_generators. */ $$=mkcastnode(void_type_string, $3); }
6dddaa2016-11-09Henrik Grubbström (Grubba)  | implicit_modifiers named_class { $$=mkcastnode(void_type_string, $2); }
5a0fd52001-01-10Martin Stjernholm  ; labeled_statement: TOK_IDENTIFIER { Pike_compiler->compiler_frame->opt_flags &= ~OPT_CUSTOM_LABELS; } ':' statement { $$ = mknode(Pike_compiler->compiler_frame->opt_flags & OPT_CUSTOM_LABELS ? F_CUSTOM_STMT_LABEL : F_NORMAL_STMT_LABEL, $1, $4); /* FIXME: This won't be correct if the node happens to be shared. * That's an issue to be solved with shared nodes in general, * though. */
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $1);
5a0fd52001-01-10Martin Stjernholm  } ; optional_label: TOK_IDENTIFIER | /* empty */ {$$ = 0;} ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
5a0fd52001-01-10Martin Stjernholm break: TOK_BREAK optional_label { $$=mknode(F_BREAK,$2,0); } ;
f76b4c2000-05-11Henrik Grubbström (Grubba) default: TOK_DEFAULT ':' { $$=mknode(F_DEFAULT,0,0); } | TOK_DEFAULT
4d21331998-04-14Henrik Grubbström (Grubba)  { $$=mknode(F_DEFAULT,0,0); yyerror("Expected ':' after default."); } ;
5a0fd52001-01-10Martin Stjernholm continue: TOK_CONTINUE optional_label { $$=mknode(F_CONTINUE,$2,0); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
acabf12016-01-09Henrik Grubbström (Grubba) /* This variant is used to push the compiler context for * functions without a declared return type (ie lambdas). */
f2dbd22016-01-25Henrik Grubbström (Grubba) start_lambda: /* empty */
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
8322b62000-05-08Fredrik Hübinette (Hubbe)  push_compiler_frame(SCOPE_LOCAL);
bc62892009-06-22Henrik Grubbström (Grubba) 
ab6b782016-05-07Henrik Grubbström (Grubba)  debug_malloc_touch(Pike_compiler->compiler_frame->current_return_type); if(Pike_compiler->compiler_frame->current_return_type) free_type(Pike_compiler->compiler_frame->current_return_type); copy_pike_type(Pike_compiler->compiler_frame->current_return_type, any_type_string);
bc62892009-06-22Henrik Grubbström (Grubba)  $$ = Pike_compiler->compiler_frame;
b5aa651999-12-16Henrik Grubbström (Grubba)  } ;
ff02322008-05-07Henrik Grubbström (Grubba) implicit_identifier: /* empty */ {
2479872008-05-07Henrik Grubbström (Grubba)  struct pike_string *name;
28b7362008-07-08Henrik Grubbström (Grubba)  $$=mkstrnode(name = get_new_name(NULL));
2479872008-05-07Henrik Grubbström (Grubba)  free_string(name);
ff02322008-05-07Henrik Grubbström (Grubba)  } ;
f2dbd22016-01-25Henrik Grubbström (Grubba) lambda: TOK_LAMBDA line_number_info implicit_identifier start_lambda
9039702000-08-15Henrik Grubbström (Grubba)  func_args {
ff02322008-05-07Henrik Grubbström (Grubba)  struct pike_string *name = $3->u.sval.u.string; struct pike_type *type; int e;
9039702000-08-15Henrik Grubbström (Grubba)  $<number>$ = Pike_compiler->varargs; Pike_compiler->varargs = 0;
ff02322008-05-07Henrik Grubbström (Grubba) 
d38e6a2017-12-14Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) {
9072562008-05-07Henrik Grubbström (Grubba)  /* Define a tentative prototype for the lambda. */ push_finished_type(mixed_type_string);
ab6b782016-05-07Henrik Grubbström (Grubba)  e=$5-1;
9072562008-05-07Henrik Grubbström (Grubba)  if($<number>$) { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); e--; pop_type_stack(T_ARRAY); }else{ push_type(T_VOID); } Pike_compiler->varargs=0; push_type(T_MANY); for(; e>=0; e--) { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); push_type(T_FUNCTION);
0ad6502012-10-02Per Hedbor  }
9072562008-05-07Henrik Grubbström (Grubba)  type=compiler_pop_type(); Pike_compiler->compiler_frame->current_function_number = define_function(name, type,
95489a2008-06-29Martin Nilsson  ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED,
9072562008-05-07Henrik Grubbström (Grubba)  IDENTIFIER_PIKE_FUNCTION, NULL, (unsigned INT16) (Pike_compiler->compiler_frame->opt_flags)); free_type(type); } else { /* In pass 2 we just reuse the type from pass 1. */ Pike_compiler->compiler_frame->current_function_number = isidentifier(name);
ff02322008-05-07Henrik Grubbström (Grubba)  }
9039702000-08-15Henrik Grubbström (Grubba)  } failsafe_block
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *type;
329cc01997-02-17Fredrik Hübinette (Hubbe)  int f,e;
7e50571996-11-02Fredrik Hübinette (Hubbe)  struct pike_string *name;
e021fe2008-04-14Henrik Grubbström (Grubba)  struct compilation *c = THIS_COMPILATION; struct pike_string *save_file = c->lex.current_file; int save_line = c->lex.current_line; c->lex.current_file = $2->current_file; c->lex.current_line = $2->line_number;
d4f23b2001-08-10Martin Stjernholm 
ab6b782016-05-07Henrik Grubbström (Grubba)  debug_malloc_touch($7); $7=mknode(F_COMMA_EXPR,$7,mknode(F_RETURN,mkintnode(0),0));
d38e6a2017-12-14Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
cbdf332003-03-27Martin Stjernholm  /* Doing this in pass 1 might induce too strict checks on types * in cases where we got placeholders. */
ab6b782016-05-07Henrik Grubbström (Grubba)  type=find_return_type($7);
e3866b2007-09-03Henrik Grubbström (Grubba)  if (type) { push_finished_type(type); free_type(type); } else { yywarning("Failed to determine return type for lambda."); push_type(T_ZERO); } } else { /* Tentative return type. */
61e9a01998-01-25Fredrik Hübinette (Hubbe)  push_type(T_MIXED);
e3866b2007-09-03Henrik Grubbström (Grubba)  }
ab6b782016-05-07Henrik Grubbström (Grubba)  e=$5-1; if($<number>6)
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
7e50571996-11-02Fredrik Hübinette (Hubbe)  e--;
5b368e2001-03-31Henrik Grubbström (Grubba)  pop_type_stack(T_ARRAY);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }else{ push_type(T_VOID); }
9039702000-08-15Henrik Grubbström (Grubba)  Pike_compiler->varargs=0;
7e50571996-11-02Fredrik Hübinette (Hubbe)  push_type(T_MANY);
dfed932001-03-03Henrik Grubbström (Grubba)  for(; e>=0; e--) {
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
dfed932001-03-03Henrik Grubbström (Grubba)  push_type(T_FUNCTION); }
0ad6502012-10-02Per Hedbor 
4142a61998-05-19Fredrik Hübinette (Hubbe)  type=compiler_pop_type();
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
ff02322008-05-07Henrik Grubbström (Grubba)  name = $3->u.sval.u.string;
c4d4681998-06-06Henrik Grubbström (Grubba)  #ifdef LAMBDA_DEBUG
e3866b2007-09-03Henrik Grubbström (Grubba)  fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n%d: type: ",
b2e7262007-09-15Henrik Grubbström (Grubba)  Pike_compiler->compiler_pass, name->str, (long)Pike_compiler->new_program->id, Pike_compiler->local_class_counter-1, Pike_compiler->compiler_pass);
e3866b2007-09-03Henrik Grubbström (Grubba)  simple_describe_type(type); fprintf(stderr, "\n");
c4d4681998-06-06Henrik Grubbström (Grubba) #endif /* LAMBDA_DEBUG */
3271182004-03-18Henrik Grubbström (Grubba) 
8267f41998-01-28Fredrik Hübinette (Hubbe)  f=dooptcode(name,
ab6b782016-05-07Henrik Grubbström (Grubba)  $7,
8267f41998-01-28Fredrik Hübinette (Hubbe)  type,
95489a2008-06-29Martin Nilsson  ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED);
22edc21998-01-29Fredrik Hübinette (Hubbe) 
9072562008-05-07Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG if (f != Pike_compiler->compiler_frame->current_function_number) { Pike_fatal("Lost track of lambda %s.\n", name->str); } #endif /* PIKE_DEBUG */
164d6b2001-11-29Henrik Grubbström (Grubba) #ifdef LAMBDA_DEBUG fprintf(stderr, "%d: lexical_scope: 0x%08x\n", Pike_compiler->compiler_pass, Pike_compiler->compiler_frame->lexical_scope); #endif /* LAMBDA_DEBUG */
bad5162000-06-23Fredrik Hübinette (Hubbe)  if(Pike_compiler->compiler_frame->lexical_scope & SCOPE_SCOPED) {
8c70ba2001-09-28Fredrik Hübinette (Hubbe)  $$ = mktrampolinenode(f, Pike_compiler->compiler_frame->previous);
498ec11999-11-12Henrik Grubbström (Grubba)  } else { $$ = mkidentifiernode(f); }
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(type);
e021fe2008-04-14Henrik Grubbström (Grubba)  c->lex.current_line = save_line; c->lex.current_file = save_file;
ff02322008-05-07Henrik Grubbström (Grubba)  free_node($3);
9b39022003-03-27Martin Stjernholm  free_node ($2);
bc62892009-06-22Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG if (Pike_compiler->compiler_frame != $4) { Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n", Pike_compiler->compiler_frame, $4, Pike_compiler->compiler_frame->previous); } #endif
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  pop_compiler_frame();
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
f2dbd22016-01-25Henrik Grubbström (Grubba)  | TOK_LAMBDA line_number_info implicit_identifier start_lambda error
b5aa651999-12-16Henrik Grubbström (Grubba)  {
bc62892009-06-22Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG if (Pike_compiler->compiler_frame != $4) { Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n", Pike_compiler->compiler_frame, $4, Pike_compiler->compiler_frame->previous); } #endif
b5aa651999-12-16Henrik Grubbström (Grubba)  pop_compiler_frame();
3857bd2000-11-04Henrik Grubbström (Grubba)  $$ = mkintnode(0);
3271182004-03-18Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $2);
ff02322008-05-07Henrik Grubbström (Grubba)  free_node($3);
3271182004-03-18Henrik Grubbström (Grubba)  free_node($2);
b5aa651999-12-16Henrik Grubbström (Grubba)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f2dbd22016-01-25Henrik Grubbström (Grubba) local_function: TOK_IDENTIFIER start_function func_args
a566ca1999-12-14Fredrik Hübinette (Hubbe)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_string *name; struct pike_type *type;
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  int id,e;
97f6282000-03-07Fredrik Hübinette (Hubbe)  node *n; struct identifier *i=0; /***/
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->current_return_type);
0ad6502012-10-02Per Hedbor 
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  e=$3-1;
c3cfe92000-07-10Henrik Grubbström (Grubba)  if(Pike_compiler->varargs)
a566ca1999-12-14Fredrik Hübinette (Hubbe)  {
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
a566ca1999-12-14Fredrik Hübinette (Hubbe)  e--;
5b368e2001-03-31Henrik Grubbström (Grubba)  pop_type_stack(T_ARRAY);
a566ca1999-12-14Fredrik Hübinette (Hubbe)  }else{ push_type(T_VOID); } push_type(T_MANY);
dfed932001-03-03Henrik Grubbström (Grubba)  for(; e>=0; e--) {
bad5162000-06-23Fredrik Hübinette (Hubbe)  push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
dfed932001-03-03Henrik Grubbström (Grubba)  push_type(T_FUNCTION); }
0ad6502012-10-02Per Hedbor 
a566ca1999-12-14Fredrik Hübinette (Hubbe)  type=compiler_pop_type();
97f6282000-03-07Fredrik Hübinette (Hubbe)  /***/
a566ca1999-12-14Fredrik Hübinette (Hubbe) 
28b7362008-07-08Henrik Grubbström (Grubba)  name = get_new_name($1->u.sval.u.string);
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  #ifdef LAMBDA_DEBUG fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n",
b2e7262007-09-15Henrik Grubbström (Grubba)  Pike_compiler->compiler_pass, name->str, (long)Pike_compiler->new_program->id, Pike_compiler->local_class_counter-1);
5fb9b02000-04-06Fredrik Hübinette (Hubbe) #endif /* LAMBDA_DEBUG */
d38e6a2017-12-14Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass > COMPILER_PASS_FIRST)
8c70ba2001-09-28Fredrik Hübinette (Hubbe)  { id=isidentifier(name); }else{ id=define_function(name, type,
e33ab92008-07-18Henrik Grubbström (Grubba)  ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED,
3116ce2002-11-22Henrik Grubbström (Grubba)  IDENTIFIER_PIKE_FUNCTION | (Pike_compiler->varargs?IDENTIFIER_VARARGS:0),
8c70ba2001-09-28Fredrik Hübinette (Hubbe)  0, OPT_SIDE_EFFECT|OPT_EXTERNAL_DEPEND); }
3116ce2002-11-22Henrik Grubbström (Grubba)  Pike_compiler->varargs=0;
b1aa472001-10-05Fredrik Hübinette (Hubbe)  Pike_compiler->compiler_frame->current_function_number=id;
3271182004-03-18Henrik Grubbström (Grubba) 
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  n=0;
d38e6a2017-12-14Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass > COMPILER_PASS_FIRST &&
bad5162000-06-23Fredrik Hübinette (Hubbe)  (i=ID_FROM_INT(Pike_compiler->new_program, id)))
8c70ba2001-09-28Fredrik Hübinette (Hubbe)  { if(i->identifier_flags & IDENTIFIER_SCOPED) n = mktrampolinenode(id, Pike_compiler->compiler_frame->previous); else
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  n = mkidentifiernode(id);
8c70ba2001-09-28Fredrik Hübinette (Hubbe)  }
5fb9b02000-04-06Fredrik Hübinette (Hubbe) 
bad5162000-06-23Fredrik Hübinette (Hubbe)  low_add_local_name(Pike_compiler->compiler_frame->previous,
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  $1->u.sval.u.string, type, n); $<number>$=id; free_string(name); } failsafe_block { int localid;
bad5162000-06-23Fredrik Hübinette (Hubbe)  struct identifier *i=ID_FROM_INT(Pike_compiler->new_program, $<number>4);
e021fe2008-04-14Henrik Grubbström (Grubba)  struct compilation *c = THIS_COMPILATION; struct pike_string *save_file = c->lex.current_file; int save_line = c->lex.current_line; c->lex.current_file = $1->current_file; c->lex.current_line = $1->line_number;
5fb9b02000-04-06Fredrik Hübinette (Hubbe) 
97f6282000-03-07Fredrik Hübinette (Hubbe)  $5=mknode(F_COMMA_EXPR,$5,mknode(F_RETURN,mkintnode(0),0));
a566ca1999-12-14Fredrik Hübinette (Hubbe) 
b5aa651999-12-16Henrik Grubbström (Grubba)  debug_malloc_touch($5);
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  dooptcode(i->name,
97f6282000-03-07Fredrik Hübinette (Hubbe)  $5,
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  i->type,
95489a2008-06-29Martin Nilsson  ID_PROTECTED | ID_PRIVATE | ID_INLINE);
a566ca1999-12-14Fredrik Hübinette (Hubbe) 
1ef5572000-08-30Henrik Grubbström (Grubba)  i->opt_flags = Pike_compiler->compiler_frame->opt_flags;
e021fe2008-04-14Henrik Grubbström (Grubba)  c->lex.current_line = save_line; c->lex.current_file = save_file;
bc62892009-06-22Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG if (Pike_compiler->compiler_frame != $2) { Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n", Pike_compiler->compiler_frame, $2, Pike_compiler->compiler_frame->previous); } #endif
a566ca1999-12-14Fredrik Hübinette (Hubbe)  pop_compiler_frame(); free_node($1);
97f6282000-03-07Fredrik Hübinette (Hubbe)  /* WARNING: If the local function adds more variables we are screwed */
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  /* WARNING2: if add_local_name stops adding local variables at the end, * this has to be fixed. */
bad5162000-06-23Fredrik Hübinette (Hubbe)  localid=Pike_compiler->compiler_frame->current_number_of_locals-1; if(Pike_compiler->compiler_frame->variable[localid].def)
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  {
bad5162000-06-23Fredrik Hübinette (Hubbe)  $$=copy_node(Pike_compiler->compiler_frame->variable[localid].def);
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  }else{
0ad6502012-10-02Per Hedbor  if(Pike_compiler->compiler_frame->lexical_scope &
b6cdf32000-06-28Fredrik Hübinette (Hubbe)  (SCOPE_SCOPE_USED | SCOPE_SCOPED))
d187072000-06-20Fredrik Hübinette (Hubbe)  {
3a77fb2003-02-26Henrik Grubbström (Grubba)  $$ = mktrampolinenode($<number>4,Pike_compiler->compiler_frame);
d187072000-06-20Fredrik Hübinette (Hubbe)  }else{
3a77fb2003-02-26Henrik Grubbström (Grubba)  $$ = mkidentifiernode($<number>4);
d187072000-06-20Fredrik Hübinette (Hubbe)  }
5fb9b02000-04-06Fredrik Hübinette (Hubbe)  }
a566ca1999-12-14Fredrik Hübinette (Hubbe)  }
f2dbd22016-01-25Henrik Grubbström (Grubba)  | TOK_IDENTIFIER start_function error
b5aa651999-12-16Henrik Grubbström (Grubba)  {
bc62892009-06-22Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG if (Pike_compiler->compiler_frame != $2) { Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n", Pike_compiler->compiler_frame, $2, Pike_compiler->compiler_frame->previous); } #endif
b5aa651999-12-16Henrik Grubbström (Grubba)  pop_compiler_frame();
97f6282000-03-07Fredrik Hübinette (Hubbe)  $$=mkintnode(0);
b5aa651999-12-16Henrik Grubbström (Grubba)  }
a566ca1999-12-14Fredrik Hübinette (Hubbe)  ;
3bc6c12019-09-17Henrik Grubbström (Grubba) local_generator: TOK_IDENTIFIER start_function func_args { struct pike_string *name; struct pike_type *type; int id,e; node *n; struct identifier *i=0; /***/ push_finished_type(Pike_compiler->compiler_frame->current_return_type); /* Adjust the type to be a function that returns * a function(mixed|void, function(mixed|void...:void)|void:X). */ push_type(T_VOID); push_type(T_MANY); push_type(T_VOID); push_type(T_VOID); push_type(T_VOID); push_type(T_MIXED); push_type(T_OR); push_type(T_MANY); push_type(T_OR); push_type(T_FUNCTION); push_type(T_VOID); push_type(T_MIXED); push_type(T_OR); push_type(T_FUNCTION); /* Entry point variable. */ add_ref(int_type_string); Pike_compiler->compiler_frame->generator_local = add_local_name(empty_pike_string, int_type_string, 0); /* Stack contents to restore. */ add_ref(array_type_string); add_local_name(empty_pike_string, array_type_string, 0); /* Resumption argument. */ add_ref(mixed_type_string); add_local_name(empty_pike_string, mixed_type_string, 0); /* Resumption callback. */ add_ref(function_type_string); add_local_name(empty_pike_string, function_type_string, 0); for (e = 0; e <= Pike_compiler->compiler_frame->generator_local; e++) { Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED | LOCAL_VAR_USED_IN_SCOPE; } Pike_compiler->compiler_frame->lexical_scope |= SCOPE_SCOPE_USED; e=$3-1; if(Pike_compiler->varargs) { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); e--; pop_type_stack(T_ARRAY); }else{ push_type(T_VOID); } push_type(T_MANY); for(; e>=0; e--) { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); push_type(T_FUNCTION); } type=compiler_pop_type(); /***/ name = get_new_name($1->u.sval.u.string); #ifdef LAMBDA_DEBUG fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n", Pike_compiler->compiler_pass, name->str, (long)Pike_compiler->new_program->id, Pike_compiler->local_class_counter-1); #endif /* LAMBDA_DEBUG */ if(Pike_compiler->compiler_pass > COMPILER_PASS_FIRST) { id=isidentifier(name); }else{ id=define_function(name, type, ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED, IDENTIFIER_PIKE_FUNCTION | (Pike_compiler->varargs?IDENTIFIER_VARARGS:0), 0, OPT_SIDE_EFFECT|OPT_EXTERNAL_DEPEND); } Pike_compiler->varargs=0; Pike_compiler->compiler_frame->current_function_number=id; n=0; if(Pike_compiler->compiler_pass > COMPILER_PASS_FIRST && (i=ID_FROM_INT(Pike_compiler->new_program, id))) { if(i->identifier_flags & IDENTIFIER_SCOPED) n = mktrampolinenode(id, Pike_compiler->compiler_frame->previous); else n = mkidentifiernode(id); } low_add_local_name(Pike_compiler->compiler_frame->previous, $1->u.sval.u.string, type, n); $<number>$=id; free_string(name); } failsafe_block { int localid; struct identifier *i=ID_FROM_INT(Pike_compiler->new_program, $<number>4); struct compilation *c = THIS_COMPILATION; struct pike_string *save_file = c->lex.current_file; int save_line = c->lex.current_line; struct pike_type *generator_type; struct pike_string *name; int generator_stack_local; int f; c->lex.current_file = $1->current_file; c->lex.current_line = $1->line_number; ref_push_string($1->u.sval.u.string); push_constant_text("\0generator"); f_add(2); name = get_new_name(Pike_sp[-1].u.string); pop_stack(); if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST && Pike_compiler->compiler_frame->current_return_type->type == PIKE_T_AUTO) { /* Change "auto" return type to actual return type. */ push_finished_type(Pike_compiler->compiler_frame->current_return_type->car); } else { push_finished_type(Pike_compiler->compiler_frame->current_return_type); } /* Adjust the type to be a function that returns * a function(mixed|void, function(mixed|void...:void)|void:X). */ push_type(T_VOID); push_type(T_MANY); push_type(T_VOID); push_type(T_VOID); push_type(T_VOID); push_type(T_MIXED); push_type(T_OR); push_type(T_MANY); push_type(T_OR); push_type(T_FUNCTION); push_type(T_VOID); push_type(T_MIXED); push_type(T_OR); push_type(T_FUNCTION); generator_type = compiler_pop_type(); f = dooptcode(name, $5, generator_type, ID_INLINE | ID_PROTECTED | ID_PRIVATE | ID_USED); free_string(name); generator_stack_local = Pike_compiler->compiler_frame->generator_local + 1; Pike_compiler->compiler_frame->generator_local = -1; free_type(Pike_compiler->compiler_frame->current_return_type); Pike_compiler->compiler_frame->current_return_type = generator_type; $5 = mknode(F_COMMA_EXPR, mknode(F_ASSIGN, mklocalnode(generator_stack_local, 0), mkefuncallnode("aggregate", NULL)), mknode(F_RETURN, mkgeneratornode(f), NULL)); debug_malloc_touch($5); f = dooptcode(i->name, $5, i->type, ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED); i->opt_flags = Pike_compiler->compiler_frame->opt_flags; c->lex.current_line = save_line; c->lex.current_file = save_file; #ifdef PIKE_DEBUG if (Pike_compiler->compiler_frame != $2) { Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n", Pike_compiler->compiler_frame, $2, Pike_compiler->compiler_frame->previous); } #endif pop_compiler_frame(); free_node($1); /* WARNING: If the local function adds more variables we are screwed */ /* WARNING2: if add_local_name stops adding local variables at the end, * this has to be fixed. */ localid=Pike_compiler->compiler_frame->current_number_of_locals-1; if(Pike_compiler->compiler_frame->variable[localid].def) { $$=copy_node(Pike_compiler->compiler_frame->variable[localid].def); }else{ if(Pike_compiler->compiler_frame->lexical_scope & (SCOPE_SCOPE_USED | SCOPE_SCOPED)) { $$ = mktrampolinenode(f, Pike_compiler->compiler_frame); }else{ $$ = mkidentifiernode(f); } } } | TOK_IDENTIFIER start_function error { #ifdef PIKE_DEBUG if (Pike_compiler->compiler_frame != $2) { Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n", Pike_compiler->compiler_frame, $2, Pike_compiler->compiler_frame->previous); } #endif pop_compiler_frame(); $$=mkintnode(0); } ;
e17b7b2016-01-16Henrik Grubbström (Grubba) create_arg: modifiers simple_type optional_dot_dot_dot TOK_IDENTIFIER
c20a522000-07-08Henrik Grubbström (Grubba)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *type;
1e9a882007-10-05Henrik Grubbström (Grubba)  int ref_no;
c20a522000-07-08Henrik Grubbström (Grubba) 
1e9a882007-10-05Henrik Grubbström (Grubba)  if (Pike_compiler->num_create_args < 0) {
e6c0892001-03-30Henrik Grubbström (Grubba)  yyerror("Can't define more variables after ..."); }
eb6ba72016-01-11Henrik Grubbström (Grubba)  if ($3) {
6489182016-01-22Henrik Grubbström (Grubba)  push_finished_type(Pike_compiler->compiler_frame->current_type);
21c5ed2020-01-07Henrik Grubbström (Grubba)  push_unlimited_array_type(T_ARRAY);
6489182016-01-22Henrik Grubbström (Grubba)  type = compiler_pop_type(); } else { copy_pike_type(type, Pike_compiler->compiler_frame->current_type);
e6c0892001-03-30Henrik Grubbström (Grubba)  }
c20a522000-07-08Henrik Grubbström (Grubba) 
bc3efc2007-10-06Henrik Grubbström (Grubba)  /* Add the identifier globally. * Note: Since these are the first identifiers (and references) * to be added to the program, they will be numbered in * sequence starting at 0 (zero). This means that the * counter num_create_args is sufficient extra information * to be able to keep track of them. */
eb6ba72016-01-11Henrik Grubbström (Grubba)  ref_no = define_variable($4->u.sval.u.string, type,
1e9a882007-10-05Henrik Grubbström (Grubba)  Pike_compiler->current_modifiers);
bc3efc2007-10-06Henrik Grubbström (Grubba)  free_type(type);
c20a522000-07-08Henrik Grubbström (Grubba) 
1e9a882007-10-05Henrik Grubbström (Grubba)  if (Pike_compiler->num_create_args != ref_no) { my_yyerror("Multiple definitions of create variable %S (%d != %d).",
eb6ba72016-01-11Henrik Grubbström (Grubba)  $4->u.sval.u.string,
1e9a882007-10-05Henrik Grubbström (Grubba)  Pike_compiler->num_create_args, ref_no); }
eb6ba72016-01-11Henrik Grubbström (Grubba)  if ($3) {
1e9a882007-10-05Henrik Grubbström (Grubba)  /* Encode varargs marker as negative number of args. */ Pike_compiler->num_create_args = -(ref_no + 1); } else { Pike_compiler->num_create_args = ref_no + 1; }
c20a522000-07-08Henrik Grubbström (Grubba) 
d68a072001-02-20Henrik Grubbström (Grubba)  /* free_type(type); */
eb6ba72016-01-11Henrik Grubbström (Grubba)  free_node($4);
c20a522000-07-08Henrik Grubbström (Grubba)  $$=0; }
e17b7b2016-01-16Henrik Grubbström (Grubba)  | modifiers simple_type bad_identifier { $$=0; }
c20a522000-07-08Henrik Grubbström (Grubba)  ; create_arguments2: create_arg { $$ = 1; } | create_arguments2 ',' create_arg { $$ = $1 + 1; } | create_arguments2 ':' create_arg { yyerror("Unexpected ':' in create argument list."); $$ = $1 + 1; } ; create_arguments: /* empty */ optional_comma { $$=0; } | create_arguments2 optional_comma ;
1104c62007-10-08Henrik Grubbström (Grubba) optional_create_arguments: /* empty */ { $$ = 0; }
1e9a882007-10-05Henrik Grubbström (Grubba)  | '(' create_arguments close_paren_or_missing
c20a522000-07-08Henrik Grubbström (Grubba)  {
1104c62007-10-08Henrik Grubbström (Grubba)  /* NOTE: One more than the number of arguments, so that we < * can detect the case of no parenthesis below. */ $$ = $2 + 1;
1e9a882007-10-05Henrik Grubbström (Grubba)  free_node($3);
c20a522000-07-08Henrik Grubbström (Grubba)  } ;
a566ca1999-12-14Fredrik Hübinette (Hubbe) 
eb9ef92010-11-19Henrik Grubbström (Grubba) failsafe_program: '{' program { $<n>$ = NULL; } end_block
e2acf71997-04-23Henrik Grubbström (Grubba)  | error { yyerrok; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF
e67c861998-08-01Henrik Grubbström (Grubba)  { yyerror("End of file where program definition expected."); }
febbc81997-04-22Fredrik Hübinette (Hubbe)  ;
2a343f2008-04-04Henrik Grubbström (Grubba) /* Modifiers at $0. */
6dddaa2016-11-09Henrik Grubbström (Grubba) anon_class: TOK_CLASS line_number_info { struct pike_string *s; char buffer[42]; sprintf(buffer,"__class_%ld_%ld_line_%d", (long)Pike_compiler->new_program->id, (long)Pike_compiler->local_class_counter++, (int) $2->line_number); s = make_shared_string(buffer); $<n>$ = mkstrnode(s); free_string(s); $<number>0 |= ID_PROTECTED | ID_PRIVATE | ID_INLINE; } {
d38e6a2017-12-14Henrik Grubbström (Grubba)  /* fprintf(stderr, "LANGUAGE.YACC: ANON CLASS start\n"); */ if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)
6dddaa2016-11-09Henrik Grubbström (Grubba)  { if ($<number>0 & ID_EXTERN) { yywarning("Extern declared class definition."); }
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_FIRST, $<n>3->u.sval.u.string,
6dddaa2016-11-09Henrik Grubbström (Grubba)  $<number>0, &$<number>$); /* fprintf(stderr, "Pass 1: Program %s has id %d\n",
d38e6a2017-12-14Henrik Grubbström (Grubba)  $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
6dddaa2016-11-09Henrik Grubbström (Grubba)  store_linenumber($2->line_number, $2->current_file); debug_malloc_name(Pike_compiler->new_program, $2->current_file->str, $2->line_number); }else{ int i; struct identifier *id; int tmp=Pike_compiler->compiler_pass; i=isidentifier($<n>3->u.sval.u.string); if(i<0) { /* Seriously broken... */ yyerror("Pass 2: program not defined!");
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_LAST, 0,
6dddaa2016-11-09Henrik Grubbström (Grubba)  $<number>0, &$<number>$); }else{ id=ID_FROM_INT(Pike_compiler->new_program, i); if(IDENTIFIER_IS_CONSTANT(id->identifier_flags)) { struct svalue *s; if ((id->func.const_info.offset >= 0) && (TYPEOF(*(s = &PROG_FROM_INT(Pike_compiler->new_program,i)-> constants[id->func.const_info.offset].sval)) == T_PROGRAM)) {
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(s->u.program, COMPILER_PASS_LAST,
6dddaa2016-11-09Henrik Grubbström (Grubba)  $<n>3->u.sval.u.string, $<number>0, &$<number>$); /* fprintf(stderr, "Pass 2: Program %s has id %d\n",
d38e6a2017-12-14Henrik Grubbström (Grubba)  $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
6dddaa2016-11-09Henrik Grubbström (Grubba)  }else{ yyerror("Pass 2: constant redefined!");
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_LAST, 0,
6dddaa2016-11-09Henrik Grubbström (Grubba)  $<number>0, &$<number>$); } }else{ yyerror("Pass 2: class constant no longer constant!");
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_LAST, 0,
6dddaa2016-11-09Henrik Grubbström (Grubba)  $<number>0, &$<number>$); } } Pike_compiler->compiler_pass=tmp; } } { /* Clear scoped modifiers. */ $<number>$ = THIS_COMPILATION->lex.pragmas; THIS_COMPILATION->lex.pragmas &= ~ID_MODIFIER_MASK; } optional_create_arguments failsafe_program { struct program *p; /* Check if we have create arguments but no locally defined create(). */ if ($6) { struct pike_string *create_string = NULL; struct reference *ref = NULL; struct identifier *id = NULL; int ref_id; MAKE_CONST_STRING(create_string, "create"); if (((ref_id = isidentifier(create_string)) < 0) || (ref = PTR_FROM_INT(Pike_compiler->new_program, ref_id))->inherit_offset || ((id = ID_FROM_PTR(Pike_compiler->new_program, ref))->func.offset == -1)) { int e; struct pike_type *type = NULL; int nargs = Pike_compiler->num_create_args; push_compiler_frame(SCOPE_LOCAL); /* Init: Prepend the create arguments. */ if (Pike_compiler->num_create_args < 0) { for (e = 0; e < -Pike_compiler->num_create_args; e++) { id = Pike_compiler->new_program->identifiers + e; add_ref(id->type); add_local_name(id->name, id->type, 0); /* Note: add_local_name() above will return e. */ Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED; } } else { for (e = 0; e < Pike_compiler->num_create_args; e++) { id = Pike_compiler->new_program->identifiers + e; add_ref(id->type); add_local_name(id->name, id->type, 0); /* Note: add_local_name() above will return e. */ Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED; } } /* First: Deduce the type for the create() function. */ push_type(T_VOID); /* Return type. */ if ((e = nargs) < 0) { /* Varargs */ e = nargs = -nargs; push_finished_type(Pike_compiler->compiler_frame->variable[--e].type); pop_type_stack(T_ARRAY); /* Pop one level of array. */ } else { /* Not varargs. */ push_type(T_VOID); } push_type(T_MANY); while(e--) { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); push_type(T_FUNCTION); } type = compiler_pop_type(); /* Second: Declare the function. */ Pike_compiler->compiler_frame->current_function_number= define_function(create_string, type, ID_INLINE | ID_PROTECTED, IDENTIFIER_PIKE_FUNCTION | (Pike_compiler->num_create_args < 0?IDENTIFIER_VARARGS:0), 0, OPT_SIDE_EFFECT);
d38e6a2017-12-14Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
6dddaa2016-11-09Henrik Grubbström (Grubba)  node *create_code = NULL; int f; /* Third: Generate the initialization code. * * global_arg = [type]local_arg; * [,..] */ for(e=0; e<nargs; e++) { if(!Pike_compiler->compiler_frame->variable[e].name || !Pike_compiler->compiler_frame->variable[e].name->len) { my_yyerror("Missing name for argument %d.",e); } else { node *local_node = mklocalnode(e, 0); /* FIXME: Should probably use some other flag. */ if ((runtime_options & RUNTIME_CHECK_TYPES) &&
d38e6a2017-12-14Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) &&
6dddaa2016-11-09Henrik Grubbström (Grubba)  (Pike_compiler->compiler_frame->variable[e].type != mixed_type_string)) { /* fprintf(stderr, "Creating soft cast node for local #%d\n", e);*/ local_node = mkcastnode(mixed_type_string, local_node); /* NOTE: The cast to mixed above is needed to avoid generating * compilation errors, as well as avoiding optimizations * in mksoftcastnode(). */ local_node = mksoftcastnode(Pike_compiler->compiler_frame-> variable[e].type, local_node); } create_code = mknode(F_COMMA_EXPR, create_code,
a1af302017-03-18Henrik Grubbström (Grubba)  mknode(F_ASSIGN, mkidentifiernode(e), local_node));
6dddaa2016-11-09Henrik Grubbström (Grubba)  } } /* Fourth: Add a return 0; at the end. */ create_code = mknode(F_COMMA_EXPR, mknode(F_POP_VALUE, create_code, NULL), mknode(F_RETURN, mkintnode(0), NULL)); /* Fifth: Define the function. */ f=dooptcode(create_string, create_code, type, ID_PROTECTED); #ifdef PIKE_DEBUG if(Pike_interpreter.recoveries && Pike_sp-Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer) Pike_fatal("Stack error (underflow)\n");
d38e6a2017-12-14Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST &&
6dddaa2016-11-09Henrik Grubbström (Grubba)  f!=Pike_compiler->compiler_frame->current_function_number) Pike_fatal("define_function screwed up! %d != %d\n", f, Pike_compiler->compiler_frame->current_function_number); #endif } /* Done. */ free_type(type); pop_compiler_frame(); } }
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass != COMPILER_PASS_LAST)
6dddaa2016-11-09Henrik Grubbström (Grubba)  p=end_first_pass(0); else p=end_first_pass(1);
d38e6a2017-12-14Henrik Grubbström (Grubba)  /* fprintf(stderr, "LANGUAGE.YACC: ANON CLASS end\n"); */
6dddaa2016-11-09Henrik Grubbström (Grubba)  if(p) { /* Update the type for the program constant, * since we might have a lfun::create(). */ struct identifier *i; struct svalue sv; SET_SVAL(sv, T_PROGRAM, 0, program, p); i = ID_FROM_INT(Pike_compiler->new_program, $<number>4); free_type(i->type); i->type = get_type_of_svalue(&sv); free_program(p); } else if (!Pike_compiler->num_parse_error) { /* Make sure code in this class is aware that something went wrong. */ Pike_compiler->num_parse_error = 1; } $$=mkidentifiernode($<number>4); free_node($2); free_node($<n>3); check_tree($$,0); THIS_COMPILATION->lex.pragmas = $<number>5; } ; /* Modifiers at $0. */ named_class: TOK_CLASS line_number_info simple_identifier
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
2a343f2008-04-04Henrik Grubbström (Grubba)  if(!$3)
51ffdb1998-01-19Fredrik Hübinette (Hubbe)  {
3c0c281998-01-26Fredrik Hübinette (Hubbe)  struct pike_string *s;
51ffdb1998-01-19Fredrik Hübinette (Hubbe)  char buffer[42];
d4f23b2001-08-10Martin Stjernholm  sprintf(buffer,"__class_%ld_%ld_line_%d", (long)Pike_compiler->new_program->id, (long)Pike_compiler->local_class_counter++,
2a343f2008-04-04Henrik Grubbström (Grubba)  (int) $2->line_number);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  s=make_shared_string(buffer);
2a343f2008-04-04Henrik Grubbström (Grubba)  $3=mkstrnode(s);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_string(s);
95489a2008-06-29Martin Nilsson  $<number>0|=ID_PROTECTED | ID_PRIVATE | ID_INLINE;
51ffdb1998-01-19Fredrik Hübinette (Hubbe)  }
d38e6a2017-12-14Henrik Grubbström (Grubba) 
8c77b61998-04-13Henrik Grubbström (Grubba)  /* fprintf(stderr, "LANGUAGE.YACC: CLASS start\n"); */
d38e6a2017-12-14Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  {
2a343f2008-04-04Henrik Grubbström (Grubba)  if ($<number>0 & ID_EXTERN) {
8fd9311999-12-30Henrik Grubbström (Grubba)  yywarning("Extern declared class definition."); }
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_FIRST, $3->u.sval.u.string,
2a343f2008-04-04Henrik Grubbström (Grubba)  $<number>0,
993ba72000-02-15Fredrik Hübinette (Hubbe)  &$<number>$);
ff88db2000-07-12Henrik Grubbström (Grubba)  /* fprintf(stderr, "Pass 1: Program %s has id %d\n",
d38e6a2017-12-14Henrik Grubbström (Grubba)  $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
ff88db2000-07-12Henrik Grubbström (Grubba) 
2a343f2008-04-04Henrik Grubbström (Grubba)  store_linenumber($2->line_number, $2->current_file);
9b39022003-03-27Martin Stjernholm  debug_malloc_name(Pike_compiler->new_program,
2a343f2008-04-04Henrik Grubbström (Grubba)  $2->current_file->str, $2->line_number);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }else{ int i; struct identifier *id;
bad5162000-06-23Fredrik Hübinette (Hubbe)  int tmp=Pike_compiler->compiler_pass;
2a343f2008-04-04Henrik Grubbström (Grubba)  i=isidentifier($3->u.sval.u.string);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  if(i<0) {
6c2aad2003-09-01Martin Nilsson  /* Seriously broken... */
25df642003-08-20Henrik Grubbström (Grubba)  yyerror("Pass 2: program not defined!");
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_LAST, 0,
2a343f2008-04-04Henrik Grubbström (Grubba)  $<number>0,
993ba72000-02-15Fredrik Hübinette (Hubbe)  &$<number>$);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }else{
bad5162000-06-23Fredrik Hübinette (Hubbe)  id=ID_FROM_INT(Pike_compiler->new_program, i);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  if(IDENTIFIER_IS_CONSTANT(id->identifier_flags)) { struct svalue *s;
89378b2010-11-23Henrik Grubbström (Grubba)  if ((id->func.const_info.offset >= 0) &&
017b572011-10-28Henrik Grubbström (Grubba)  (TYPEOF(*(s = &PROG_FROM_INT(Pike_compiler->new_program,i)-> constants[id->func.const_info.offset].sval)) == T_PROGRAM))
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  {
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(s->u.program, COMPILER_PASS_LAST,
2a343f2008-04-04Henrik Grubbström (Grubba)  $3->u.sval.u.string, $<number>0,
993ba72000-02-15Fredrik Hübinette (Hubbe)  &$<number>$);
ff88db2000-07-12Henrik Grubbström (Grubba)  /* fprintf(stderr, "Pass 2: Program %s has id %d\n",
d38e6a2017-12-14Henrik Grubbström (Grubba)  $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
ff88db2000-07-12Henrik Grubbström (Grubba) 
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }else{ yyerror("Pass 2: constant redefined!");
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_LAST, 0,
2a343f2008-04-04Henrik Grubbström (Grubba)  $<number>0,
993ba72000-02-15Fredrik Hübinette (Hubbe)  &$<number>$);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  } }else{ yyerror("Pass 2: class constant no longer constant!");
d38e6a2017-12-14Henrik Grubbström (Grubba)  low_start_new_program(0, COMPILER_PASS_LAST, 0,
2a343f2008-04-04Henrik Grubbström (Grubba)  $<number>0,
993ba72000-02-15Fredrik Hübinette (Hubbe)  &$<number>$);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  } }
bad5162000-06-23Fredrik Hübinette (Hubbe)  Pike_compiler->compiler_pass=tmp;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
afbd442004-10-22Andreas (Kaos) Stenius  { /* Clear scoped modifiers. */
e021fe2008-04-14Henrik Grubbström (Grubba)  $<number>$ = THIS_COMPILATION->lex.pragmas; THIS_COMPILATION->lex.pragmas &= ~ID_MODIFIER_MASK;
afbd442004-10-22Andreas (Kaos) Stenius  }
c20a522000-07-08Henrik Grubbström (Grubba)  optional_create_arguments failsafe_program
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  struct program *p;
1e9a882007-10-05Henrik Grubbström (Grubba)  /* Check if we have create arguments but no locally defined create(). */
2a343f2008-04-04Henrik Grubbström (Grubba)  if ($6) {
1e9a882007-10-05Henrik Grubbström (Grubba)  struct pike_string *create_string = NULL; struct reference *ref = NULL; struct identifier *id = NULL; int ref_id; MAKE_CONST_STRING(create_string, "create"); if (((ref_id = isidentifier(create_string)) < 0) || (ref = PTR_FROM_INT(Pike_compiler->new_program, ref_id))->inherit_offset ||
5a1b592009-11-17Henrik Grubbström (Grubba)  ((id = ID_FROM_PTR(Pike_compiler->new_program, ref))->func.offset == -1)) {
1e9a882007-10-05Henrik Grubbström (Grubba)  int e; struct pike_type *type = NULL; int nargs = Pike_compiler->num_create_args; push_compiler_frame(SCOPE_LOCAL);
0ad6502012-10-02Per Hedbor 
1e9a882007-10-05Henrik Grubbström (Grubba)  /* Init: Prepend the create arguments. */ if (Pike_compiler->num_create_args < 0) { for (e = 0; e < -Pike_compiler->num_create_args; e++) { id = Pike_compiler->new_program->identifiers + e; add_ref(id->type); add_local_name(id->name, id->type, 0);
b1d40c2008-01-04Henrik Grubbström (Grubba)  /* Note: add_local_name() above will return e. */
01e7e52008-01-03Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED;
1e9a882007-10-05Henrik Grubbström (Grubba)  } } else { for (e = 0; e < Pike_compiler->num_create_args; e++) { id = Pike_compiler->new_program->identifiers + e; add_ref(id->type); add_local_name(id->name, id->type, 0);
b1d40c2008-01-04Henrik Grubbström (Grubba)  /* Note: add_local_name() above will return e. */
01e7e52008-01-03Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED;
1e9a882007-10-05Henrik Grubbström (Grubba)  } } /* First: Deduce the type for the create() function. */ push_type(T_VOID); /* Return type. */ if ((e = nargs) < 0) { /* Varargs */ e = nargs = -nargs; push_finished_type(Pike_compiler->compiler_frame->variable[--e].type); pop_type_stack(T_ARRAY); /* Pop one level of array. */ } else { /* Not varargs. */ push_type(T_VOID); } push_type(T_MANY); while(e--) { push_finished_type(Pike_compiler->compiler_frame->variable[e].type); push_type(T_FUNCTION); } type = compiler_pop_type(); /* Second: Declare the function. */ Pike_compiler->compiler_frame->current_function_number= define_function(create_string, type,
95489a2008-06-29Martin Nilsson  ID_INLINE | ID_PROTECTED,
1e9a882007-10-05Henrik Grubbström (Grubba)  IDENTIFIER_PIKE_FUNCTION | (Pike_compiler->num_create_args < 0?IDENTIFIER_VARARGS:0), 0, OPT_SIDE_EFFECT);
0ad6502012-10-02Per Hedbor 
d38e6a2017-12-14Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
5a1b592009-11-17Henrik Grubbström (Grubba)  node *create_code = NULL; int f;
1e9a882007-10-05Henrik Grubbström (Grubba) 
5a1b592009-11-17Henrik Grubbström (Grubba)  /* Third: Generate the initialization code. * * global_arg = [type]local_arg; * [,..] */ for(e=0; e<nargs; e++)
1e9a882007-10-05Henrik Grubbström (Grubba)  {
5a1b592009-11-17Henrik Grubbström (Grubba)  if(!Pike_compiler->compiler_frame->variable[e].name || !Pike_compiler->compiler_frame->variable[e].name->len) { my_yyerror("Missing name for argument %d.",e); } else { node *local_node = mklocalnode(e, 0); /* FIXME: Should probably use some other flag. */ if ((runtime_options & RUNTIME_CHECK_TYPES) &&
d38e6a2017-12-14Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) &&
5a1b592009-11-17Henrik Grubbström (Grubba)  (Pike_compiler->compiler_frame->variable[e].type != mixed_type_string)) { /* fprintf(stderr, "Creating soft cast node for local #%d\n", e);*/
faa3232013-02-19Henrik Grubbström (Grubba)  local_node = mkcastnode(mixed_type_string, local_node);
0ad6502012-10-02Per Hedbor 
faa3232013-02-19Henrik Grubbström (Grubba)  /* NOTE: The cast to mixed above is needed to avoid generating * compilation errors, as well as avoiding optimizations * in mksoftcastnode(). */
5a1b592009-11-17Henrik Grubbström (Grubba)  local_node = mksoftcastnode(Pike_compiler->compiler_frame-> variable[e].type, local_node); } create_code = mknode(F_COMMA_EXPR, create_code,
a1af302017-03-18Henrik Grubbström (Grubba)  mknode(F_ASSIGN, mkidentifiernode(e), local_node));
1e9a882007-10-05Henrik Grubbström (Grubba)  } }
5a1b592009-11-17Henrik Grubbström (Grubba)  /* Fourth: Add a return 0; at the end. */
1e9a882007-10-05Henrik Grubbström (Grubba) 
5a1b592009-11-17Henrik Grubbström (Grubba)  create_code = mknode(F_COMMA_EXPR, mknode(F_POP_VALUE, create_code, NULL), mknode(F_RETURN, mkintnode(0), NULL));
1e9a882007-10-05Henrik Grubbström (Grubba) 
5a1b592009-11-17Henrik Grubbström (Grubba)  /* Fifth: Define the function. */
1e9a882007-10-05Henrik Grubbström (Grubba) 
5a1b592009-11-17Henrik Grubbström (Grubba)  f=dooptcode(create_string, create_code, type, ID_PROTECTED);
1e9a882007-10-05Henrik Grubbström (Grubba)  #ifdef PIKE_DEBUG
5a1b592009-11-17Henrik Grubbström (Grubba)  if(Pike_interpreter.recoveries && Pike_sp-Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer) Pike_fatal("Stack error (underflow)\n");
d38e6a2017-12-14Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST &&
5a1b592009-11-17Henrik Grubbström (Grubba)  f!=Pike_compiler->compiler_frame->current_function_number) Pike_fatal("define_function screwed up! %d != %d\n", f, Pike_compiler->compiler_frame->current_function_number);
1e9a882007-10-05Henrik Grubbström (Grubba) #endif
5a1b592009-11-17Henrik Grubbström (Grubba)  }
1e9a882007-10-05Henrik Grubbström (Grubba)  /* Done. */ free_type(type); pop_compiler_frame(); } }
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass != COMPILER_PASS_LAST)
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  p=end_first_pass(0); else
97358e1998-04-23Fredrik Hübinette (Hubbe)  p=end_first_pass(1);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
8c77b61998-04-13Henrik Grubbström (Grubba)  /* fprintf(stderr, "LANGUAGE.YACC: CLASS end\n"); */
903dd32004-03-13Henrik Grubbström (Grubba)  if(p) {
5a1b592009-11-17Henrik Grubbström (Grubba)  /* Update the type for the program constant, * since we might have a lfun::create(). */ struct identifier *i; struct svalue sv;
017b572011-10-28Henrik Grubbström (Grubba)  SET_SVAL(sv, T_PROGRAM, 0, program, p);
5a1b592009-11-17Henrik Grubbström (Grubba)  i = ID_FROM_INT(Pike_compiler->new_program, $<number>4); free_type(i->type); i->type = get_type_of_svalue(&sv);
e93b1f2019-01-22Henrik Grubbström (Grubba)  if (p->flags & PROGRAM_CONSTANT) { /* Update, in case of @constant. */ i->opt_flags = 0; }
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  free_program(p);
4eab662004-03-17Henrik Grubbström (Grubba)  } else if (!Pike_compiler->num_parse_error) {
72de5a2004-03-13Henrik Grubbström (Grubba)  /* Make sure code in this class is aware that something went wrong. */
4eab662004-03-17Henrik Grubbström (Grubba)  Pike_compiler->num_parse_error = 1;
2401c72000-01-03Martin Stjernholm  }
2a343f2008-04-04Henrik Grubbström (Grubba)  $$=mkidentifiernode($<number>4);
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) 
2a343f2008-04-04Henrik Grubbström (Grubba)  free_node($2);
afbd442004-10-22Andreas (Kaos) Stenius  free_node($3);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  check_tree($$,0);
e021fe2008-04-14Henrik Grubbström (Grubba)  THIS_COMPILATION->lex.pragmas = $<number>5;
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
5e3aa52001-04-01Henrik Grubbström (Grubba) simple_identifier: TOK_IDENTIFIER
a418ce2001-03-31Henrik Grubbström (Grubba)  | bad_identifier { $$ = 0; } ;
e33ab92008-07-18Henrik Grubbström (Grubba) enum_value: /* EMPTY */ { $$ = 0; } | '=' safe_expr0 { $$ = $2; } ; /* Previous enum value at $0. */ enum_def: /* EMPTY */ | simple_identifier enum_value
a418ce2001-03-31Henrik Grubbström (Grubba)  {
e33ab92008-07-18Henrik Grubbström (Grubba)  if ($1) { if ($2) { /* Explicit enum value. */
a418ce2001-03-31Henrik Grubbström (Grubba) 
e33ab92008-07-18Henrik Grubbström (Grubba)  /* This can be made more lenient in the future */
a418ce2001-03-31Henrik Grubbström (Grubba) 
e33ab92008-07-18Henrik Grubbström (Grubba)  /* Ugly hack to make sure that $2 is optimized */ { int tmp=Pike_compiler->compiler_pass; $2=mknode(F_COMMA_EXPR,$2,0); Pike_compiler->compiler_pass=tmp; }
a418ce2001-03-31Henrik Grubbström (Grubba) 
1adcc92018-02-14Henrik Grubbström (Grubba)  if(!is_const($2))
a418ce2001-03-31Henrik Grubbström (Grubba)  {
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_pass == COMPILER_PASS_LAST)
e33ab92008-07-18Henrik Grubbström (Grubba)  yyerror("Enum definition is not constant.");
a418ce2001-03-31Henrik Grubbström (Grubba)  push_int(0);
e33ab92008-07-18Henrik Grubbström (Grubba)  } else { if(!Pike_compiler->num_parse_error) {
1adcc92018-02-14Henrik Grubbström (Grubba)  ptrdiff_t tmp=eval_low($2,1);
e33ab92008-07-18Henrik Grubbström (Grubba)  if(tmp < 1) { yyerror("Error in enum definition."); push_int(0); }else{
bd67392015-10-14Martin Nilsson  pop_n_elems((INT32)(tmp - 1));
e33ab92008-07-18Henrik Grubbström (Grubba)  } } else { push_int(0); }
a418ce2001-03-31Henrik Grubbström (Grubba)  }
e33ab92008-07-18Henrik Grubbström (Grubba)  free_node($2); free_node($<n>0); $<n>0 = mkconstantsvaluenode(Pike_sp-1);
a418ce2001-03-31Henrik Grubbström (Grubba)  } else {
e33ab92008-07-18Henrik Grubbström (Grubba)  /* Implicit enum value. */ $<n>0 = safe_inc_enum($<n>0); push_svalue(&$<n>0->u.sval);
a418ce2001-03-31Henrik Grubbström (Grubba)  }
e33ab92008-07-18Henrik Grubbström (Grubba)  add_constant($1->u.sval.u.string, Pike_sp-1, (Pike_compiler->current_modifiers & ~ID_EXTERN) | ID_INLINE); /* Update the type. */ { struct pike_type *current = pop_unfinished_type(); struct pike_type *new = get_type_of_svalue(Pike_sp-1);
2a61e82011-03-24Henrik Grubbström (Grubba)  struct pike_type *res = or_pike_types(new, current, 3);
e33ab92008-07-18Henrik Grubbström (Grubba)  free_type(current); free_type(new); type_stack_mark(); push_finished_type(res); free_type(res); } pop_stack(); free_node($1);
43eaff2008-07-18Henrik Grubbström (Grubba)  } else if ($2) { free_node($2);
a418ce2001-03-31Henrik Grubbström (Grubba)  } } ;
e33ab92008-07-18Henrik Grubbström (Grubba) /* Previous enum value at $-2 */ propagated_enum_value:
a418ce2001-03-31Henrik Grubbström (Grubba)  {
e33ab92008-07-18Henrik Grubbström (Grubba)  $$ = $<n>-2;
a418ce2001-03-31Henrik Grubbström (Grubba)  } ;
e33ab92008-07-18Henrik Grubbström (Grubba) /* Previous enum value at $0. */
a418ce2001-03-31Henrik Grubbström (Grubba) enum_list: enum_def
e33ab92008-07-18Henrik Grubbström (Grubba)  | enum_list ',' propagated_enum_value enum_def { $<n>0 = $3; }
cd69002004-07-23Henrik Grubbström (Grubba)  | error
a418ce2001-03-31Henrik Grubbström (Grubba)  ;
2a343f2008-04-04Henrik Grubbström (Grubba) /* Modifiers at $0. */ enum: TOK_ENUM
a418ce2001-03-31Henrik Grubbström (Grubba)  { if ((Pike_compiler->current_modifiers & ID_EXTERN) &&
bdfe4e2017-12-11Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
a418ce2001-03-31Henrik Grubbström (Grubba)  yywarning("Extern declared enum."); } type_stack_mark(); push_type(T_ZERO); /* Joined type so far. */ }
0ad6502012-10-02Per Hedbor  optional_identifier '{'
a418ce2001-03-31Henrik Grubbström (Grubba)  {
e33ab92008-07-18Henrik Grubbström (Grubba)  push_int(-1); /* Previous value. */ $<n>$ = mkconstantsvaluenode(Pike_sp-1);
a418ce2001-03-31Henrik Grubbström (Grubba)  pop_stack();
e33ab92008-07-18Henrik Grubbström (Grubba)  }
eb9ef92010-11-19Henrik Grubbström (Grubba)  enum_list { $<n>$ = NULL; } end_block
e33ab92008-07-18Henrik Grubbström (Grubba)  { struct pike_type *t = pop_unfinished_type(); free_node($<n>5);
2a343f2008-04-04Henrik Grubbström (Grubba)  if ($3) {
a418ce2001-03-31Henrik Grubbström (Grubba)  ref_push_type_value(t);
2a343f2008-04-04Henrik Grubbström (Grubba)  add_constant($3->u.sval.u.string, Pike_sp-1,
3e13612001-04-03Henrik Grubbström (Grubba)  (Pike_compiler->current_modifiers & ~ID_EXTERN) | ID_INLINE);
a418ce2001-03-31Henrik Grubbström (Grubba)  pop_stack();
2a343f2008-04-04Henrik Grubbström (Grubba)  free_node($3);
a418ce2001-03-31Henrik Grubbström (Grubba)  } $$ = mktypenode(t); free_type(t); } ;
5e3aa52001-04-01Henrik Grubbström (Grubba) typedef: modifiers TOK_TYPEDEF full_type simple_identifier ';' { struct pike_type *t = compiler_pop_type(); if ((Pike_compiler->current_modifiers & ID_EXTERN) &&
bdfe4e2017-12-11Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
5e3aa52001-04-01Henrik Grubbström (Grubba)  yywarning("Extern declared typedef."); } if ($4) { ref_push_type_value(t); add_constant($4->u.sval.u.string, Pike_sp-1,
3e13612001-04-03Henrik Grubbström (Grubba)  (Pike_compiler->current_modifiers & ~ID_EXTERN) | ID_INLINE);
5e3aa52001-04-01Henrik Grubbström (Grubba)  pop_stack(); free_node($4); } free_type(t); } ;
8457542016-05-13Henrik Grubbström (Grubba) save_locals: /* empty */
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  {
8457542016-05-13Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->last_block_level = $$ = Pike_compiler->compiler_frame->current_number_of_locals;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  }
8457542016-05-13Henrik Grubbström (Grubba)  ; save_block_level: /* empty */
02a79a2000-09-04Fredrik Hübinette (Hubbe)  { /* Trick to store more than one number on compiler stack - Hubbe */
8457542016-05-13Henrik Grubbström (Grubba)  $$ = Pike_compiler->compiler_frame->last_block_level;
02a79a2000-09-04Fredrik Hübinette (Hubbe)  }
8457542016-05-13Henrik Grubbström (Grubba)  ; cond: TOK_IF save_block_level save_locals line_number_info
73a2a11998-04-27Henrik Grubbström (Grubba)  '(' safe_comma_expr end_cond statement optional_else_part
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
702ea52002-10-11Henrik Grubbström (Grubba)  $$ = mknode('?', $6,
0ef4e02002-05-09Henrik Grubbström (Grubba)  mknode(':',
702ea52002-10-11Henrik Grubbström (Grubba)  mkcastnode(void_type_string, $8), mkcastnode(void_type_string, $9)));
8457542016-05-13Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $4);
0ef4e02002-05-09Henrik Grubbström (Grubba)  $$ = mkcastnode(void_type_string, $$);
8457542016-05-13Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $4); free_node($4); $$ = pop_local_variables($3, $$); Pike_compiler->compiler_frame->last_block_level = $2;
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
73a2a11998-04-27Henrik Grubbström (Grubba) end_cond: ')' | '}' { yyerror("Missing ')'."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF
73a2a11998-04-27Henrik Grubbström (Grubba)  { yyerror("Missing ')'."); yyerror("Unexpected end of file."); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) optional_else_part: { $$=0; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_ELSE statement { $$=$2; }
0ad6502012-10-02Per Hedbor  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
998e1f1998-04-15Henrik Grubbström (Grubba) safe_lvalue: lvalue
a23d572008-01-07Henrik Grubbström (Grubba)  {
e021fe2008-04-14Henrik Grubbström (Grubba)  if (!(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES) && $1) {
a23d572008-01-07Henrik Grubbström (Grubba)  if ($1->token == F_ARRAY_LVALUE) { mark_lvalues_as_used(CAR($1)); } else if (($1->token == F_LOCAL) && !($1->u.integer.b)) { Pike_compiler->compiler_frame->variable[$1->u.integer.a].flags |= LOCAL_VAR_IS_USED; } } }
97358e1998-04-23Fredrik Hübinette (Hubbe)  | error { $$=0; }
998e1f1998-04-15Henrik Grubbström (Grubba)  ; safe_expr0: expr0
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=0; }
498ec11999-11-12Henrik Grubbström (Grubba)  | error { $$=0; }
998e1f1998-04-15Henrik Grubbström (Grubba)  ;
4cdb802001-02-23Fredrik Hübinette (Hubbe)  foreach_optional_lvalue: /* empty */ { $$=0; } | safe_lvalue ; foreach_lvalues: ',' safe_lvalue { $$=$2; } | ';' foreach_optional_lvalue ';' foreach_optional_lvalue { $$=mknode(':',$2,$4); } ;
8457542016-05-13Henrik Grubbström (Grubba) foreach: TOK_FOREACH save_block_level save_locals line_number_info
3c7fe72015-12-28Per Hedbor  '(' expr0 foreach_lvalues end_cond { } statement
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
702ea52002-10-11Henrik Grubbström (Grubba)  if ($7) {
4cdb802001-02-23Fredrik Hübinette (Hubbe)  $$=mknode(F_FOREACH,
5073752018-05-26Henrik Grubbström (Grubba)  mknode(F_FOREACH_VAL_LVAL,$6,$7),
3c7fe72015-12-28Per Hedbor  $10);
998e1f1998-04-15Henrik Grubbström (Grubba)  } else { /* Error in lvalue */
3c7fe72015-12-28Per Hedbor  $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $6), $10);
998e1f1998-04-15Henrik Grubbström (Grubba)  }
8457542016-05-13Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $4); free_node($4); $$ = pop_local_variables($3, $$); Pike_compiler->compiler_frame->last_block_level = $2;
5a0fd52001-01-10Martin Stjernholm  Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
9b39022003-03-27Martin Stjernholm do: TOK_DO line_number_info statement TOK_WHILE '(' safe_comma_expr end_cond expected_semicolon
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
0c28ae2021-02-26Henrik Grubbström (Grubba)  $$=mknode(F_DO,$6,$3);
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $2);
9b39022003-03-27Martin Stjernholm  free_node ($2);
5a0fd52001-01-10Martin Stjernholm  Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
9b39022003-03-27Martin Stjernholm  | TOK_DO line_number_info statement TOK_WHILE TOK_LEX_EOF
07f33e1998-11-05Henrik Grubbström (Grubba)  {
9b39022003-03-27Martin Stjernholm  free_node ($2);
07f33e1998-11-05Henrik Grubbström (Grubba)  $$=0; yyerror("Missing '(' in do-while loop."); yyerror("Unexpected end of file."); }
9b39022003-03-27Martin Stjernholm  | TOK_DO line_number_info statement TOK_LEX_EOF
07f33e1998-11-05Henrik Grubbström (Grubba)  {
9b39022003-03-27Martin Stjernholm  free_node ($2);
07f33e1998-11-05Henrik Grubbström (Grubba)  $$=0; yyerror("Missing 'while' in do-while loop."); yyerror("Unexpected end of file."); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
73a2a11998-04-27Henrik Grubbström (Grubba) expected_semicolon: ';'
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF
73a2a11998-04-27Henrik Grubbström (Grubba)  { yyerror("Missing ';'."); yyerror("Unexpected end of file."); } ;
8457542016-05-13Henrik Grubbström (Grubba) for: TOK_FOR save_block_level save_locals line_number_info
73a2a11998-04-27Henrik Grubbström (Grubba)  '(' unused expected_semicolon for_expr expected_semicolon unused end_cond statement
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  {
702ea52002-10-11Henrik Grubbström (Grubba)  $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $6), mknode(F_FOR,$8,mknode(':',$12,$10)));
8457542016-05-13Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $4); free_node($4); $$ = pop_local_variables($3, $$); Pike_compiler->compiler_frame->last_block_level = $2;
5a0fd52001-01-10Martin Stjernholm  Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
8457542016-05-13Henrik Grubbström (Grubba) while: TOK_WHILE save_block_level save_locals line_number_info
73a2a11998-04-27Henrik Grubbström (Grubba)  '(' safe_comma_expr end_cond statement
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
702ea52002-10-11Henrik Grubbström (Grubba)  $$=mknode(F_FOR,$6,mknode(':',$8,NULL));
8457542016-05-13Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $4); free_node($4); $$ = pop_local_variables($3, $$); Pike_compiler->compiler_frame->last_block_level = $2;
5a0fd52001-01-10Martin Stjernholm  Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  for_expr: /* EMPTY */ { $$=mkintnode(1); }
4d21331998-04-14Henrik Grubbström (Grubba)  | safe_comma_expr
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
8457542016-05-13Henrik Grubbström (Grubba) switch: TOK_SWITCH save_block_level save_locals line_number_info
73a2a11998-04-27Henrik Grubbström (Grubba)  '(' safe_comma_expr end_cond statement
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
702ea52002-10-11Henrik Grubbström (Grubba)  $$=mknode(F_SWITCH,$6,$8);
8457542016-05-13Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $4); free_node($4); $$ = pop_local_variables($3, $$); Pike_compiler->compiler_frame->last_block_level = $2;
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f76b4c2000-05-11Henrik Grubbström (Grubba) case: TOK_CASE safe_comma_expr expected_colon
7e50571996-11-02Fredrik Hübinette (Hubbe)  { $$=mknode(F_CASE,$2,0); }
a7c3a42000-07-10Henrik Grubbström (Grubba)  | TOK_CASE safe_comma_expr expected_dot_dot optional_comma_expr expected_colon
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
9abda42002-03-02Martin Stjernholm  $$=mknode(F_CASE_RANGE,$2,$4); } | TOK_CASE expected_dot_dot safe_comma_expr expected_colon { $$=mknode(F_CASE_RANGE,0,$3);
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
73a2a11998-04-27Henrik Grubbström (Grubba) expected_colon: ':'
76b4491999-12-09Henrik Grubbström (Grubba)  | ';' { yyerror("Missing ':'."); } | '}' { yyerror("Missing ':'."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_LEX_EOF
73a2a11998-04-27Henrik Grubbström (Grubba)  {
3d78821999-11-06Henrik Grubbström (Grubba)  yyerror("Missing ':'.");
73a2a11998-04-27Henrik Grubbström (Grubba)  yyerror("Unexpected end of file."); } ;
d0f7342019-08-22Henrik Grubbström (Grubba) optional_continue: { $$ = 0; } | TOK_CONTINUE { $$ = 1; } | TOK_BREAK { $$ = 0; } ; return: optional_continue TOK_RETURN expected_semicolon
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
c2c9322014-08-10Martin Nilsson  if(!match_types(Pike_compiler->compiler_frame->current_return_type,
7e50571996-11-02Fredrik Hübinette (Hubbe)  void_type_string)) {
f23f062004-03-12Henrik Grubbström (Grubba)  yytype_error("Must return a value for a non-void function.", Pike_compiler->compiler_frame->current_return_type, void_type_string, 0);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
8165782019-08-22Henrik Grubbström (Grubba)  $$ = mknode(F_RETURN, mkintnode(0), mkintnode($1));
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
d0f7342019-08-22Henrik Grubbström (Grubba)  | optional_continue TOK_RETURN safe_comma_expr expected_semicolon
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
8165782019-08-22Henrik Grubbström (Grubba)  $$ = mknode(F_RETURN, $3, mkintnode($1));
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
0ad6502012-10-02Per Hedbor 
215bed1996-09-28Fredrik Hübinette (Hubbe) unused: { $$=0; }
babd872001-02-23Henrik Grubbström (Grubba)  | safe_comma_expr { $$=mkcastnode(void_type_string, $1); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
babd872001-02-23Henrik Grubbström (Grubba) unused2: comma_expr { $$=mkcastnode(void_type_string, $1); } ;
7e50571996-11-02Fredrik Hübinette (Hubbe) 
ba62cf1997-09-18Fredrik Hübinette (Hubbe) optional_comma_expr: { $$=0; }
4d21331998-04-14Henrik Grubbström (Grubba)  | safe_comma_expr ; safe_comma_expr: comma_expr
498ec11999-11-12Henrik Grubbström (Grubba)  | error { $$=0; }
ba62cf1997-09-18Fredrik Hübinette (Hubbe)  ;
7e50571996-11-02Fredrik Hübinette (Hubbe) comma_expr: comma_expr2
35a4052016-01-24Henrik Grubbström (Grubba)  | simple_type2 local_name_list { $$=$2; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
0ad6502012-10-02Per Hedbor 
7e50571996-11-02Fredrik Hübinette (Hubbe)  comma_expr2: expr0 | comma_expr2 ',' expr0 {
0ad6502012-10-02Per Hedbor  $$ = mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $1), $3);
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
615cf52016-02-02Henrik Grubbström (Grubba) splice_expr: expr0
7e50571996-11-02Fredrik Hübinette (Hubbe)  | '@' expr0 { $$=mknode(F_PUSH_ARRAY,$2,0); };
215bed1996-09-28Fredrik Hübinette (Hubbe)  expr0: expr01
7e50571996-11-02Fredrik Hübinette (Hubbe)  | expr4 assign expr0 { $$=mknode($2,$1,$3); }
8c77b61998-04-13Henrik Grubbström (Grubba)  | expr4 assign error { $$=$1; reset_type_stack(); yyerrok; }
10fe602003-10-01Martin Stjernholm  | open_bracket_with_line_info low_lvalue_list ']' assign expr0 {
a1af302017-03-18Henrik Grubbström (Grubba)  if (!(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) { mark_lvalues_as_used($2); }
10fe602003-10-01Martin Stjernholm  $$=mknode($4,mknode(F_ARRAY_LVALUE,$2,0),$5);
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $1);
10fe602003-10-01Martin Stjernholm  free_node ($1); } | open_bracket_with_line_info low_lvalue_list ']' error
147cb72008-01-05Henrik Grubbström (Grubba)  { $$=$2; free_node ($1); reset_type_stack(); yyerrok; }
8c77b61998-04-13Henrik Grubbström (Grubba) /* | error { $$=0; reset_type_stack(); } */
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
97358e1998-04-23Fredrik Hübinette (Hubbe) expr01: expr1
7e50571996-11-02Fredrik Hübinette (Hubbe)  | expr1 '?' expr01 ':' expr01 { $$=mknode('?',$1,mknode(':',$3,$5)); } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
a1af302017-03-18Henrik Grubbström (Grubba) assign: '=' { $$=F_ASSIGN; } | TOK_AND_EQ { $$=F_AND_EQ; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_OR_EQ { $$=F_OR_EQ; } | TOK_XOR_EQ { $$=F_XOR_EQ; } | TOK_LSH_EQ { $$=F_LSH_EQ; } | TOK_RSH_EQ { $$=F_RSH_EQ; } | TOK_ADD_EQ { $$=F_ADD_EQ; } | TOK_SUB_EQ { $$=F_SUB_EQ; } | TOK_MULT_EQ{ $$=F_MULT_EQ; }
fbff332016-05-17Per Hedbor  | TOK_POW_EQ { $$=F_POW_EQ; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_MOD_EQ { $$=F_MOD_EQ; } | TOK_DIV_EQ { $$=F_DIV_EQ; }
d621b62020-11-12Henrik Grubbström (Grubba)  | TOK_ATOMIC_GET_SET { $$=F_ATOMIC_GET_SET; }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
cbae7e2000-03-30Henrik Grubbström (Grubba) optional_comma: { $$=0; } | ',' { $$=1; };
215bed1996-09-28Fredrik Hübinette (Hubbe)  expr_list: { $$=0; }
97358e1998-04-23Fredrik Hübinette (Hubbe)  | expr_list2 optional_comma
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
0ad6502012-10-02Per Hedbor 
215bed1996-09-28Fredrik Hübinette (Hubbe) 
615cf52016-02-02Henrik Grubbström (Grubba) expr_list2: splice_expr | expr_list2 ',' splice_expr { $$=mknode(F_ARG_LIST,$1,$3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  m_expr_list: { $$=0; }
97358e1998-04-23Fredrik Hübinette (Hubbe)  | m_expr_list2 optional_comma
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  m_expr_list2: assoc_pair
998e1f1998-04-15Henrik Grubbström (Grubba)  | m_expr_list2 ',' assoc_pair { if ($3) { $$=mknode(F_ARG_LIST,$1,$3); } else { /* Error in assoc_pair */ $$=$1; } } | m_expr_list2 ',' error
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
0ad6502012-10-02Per Hedbor assoc_pair: expr0 expected_colon expr0
3271182004-03-18Henrik Grubbström (Grubba)  { $$=mknode(F_ARG_LIST,$1,$3); }
73a2a11998-04-27Henrik Grubbström (Grubba)  | expr0 expected_colon error { free_node($1); $$=0; }
998e1f1998-04-15Henrik Grubbström (Grubba)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  expr1: expr2
f76b4c2000-05-11Henrik Grubbström (Grubba)  | expr1 TOK_LOR expr1 { $$=mknode(F_LOR,$1,$3); } | expr1 TOK_LAND expr1 { $$=mknode(F_LAND,$1,$3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | expr1 '|' expr1 { $$=mkopernode("`|",$1,$3); } | expr1 '^' expr1 { $$=mkopernode("`^",$1,$3); } | expr1 '&' expr1 { $$=mkopernode("`&",$1,$3); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | expr1 TOK_EQ expr1 { $$=mkopernode("`==",$1,$3); } | expr1 TOK_NE expr1 { $$=mkopernode("`!=",$1,$3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | expr1 '>' expr1 { $$=mkopernode("`>",$1,$3); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | expr1 TOK_GE expr1 { $$=mkopernode("`>=",$1,$3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | expr1 '<' expr1 { $$=mkopernode("`<",$1,$3); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | expr1 TOK_LE expr1 { $$=mkopernode("`<=",$1,$3); } | expr1 TOK_LSH expr1 { $$=mkopernode("`<<",$1,$3); } | expr1 TOK_RSH expr1 { $$=mkopernode("`>>",$1,$3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | expr1 '+' expr1 { $$=mkopernode("`+",$1,$3); } | expr1 '-' expr1 { $$=mkopernode("`-",$1,$3); } | expr1 '*' expr1 { $$=mkopernode("`*",$1,$3); }
fbff332016-05-17Per Hedbor  | expr1 TOK_POW expr1 { $$=mkopernode("`**",$1,$3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | expr1 '%' expr1 { $$=mkopernode("`%",$1,$3); } | expr1 '/' expr1 { $$=mkopernode("`/",$1,$3); }
0ad6502012-10-02Per Hedbor  | expr1 TOK_LOR error
f76b4c2000-05-11Henrik Grubbström (Grubba)  | expr1 TOK_LAND error
0ad6502012-10-02Per Hedbor  | expr1 '|' error | expr1 '^' error | expr1 '&' error | expr1 TOK_EQ error | expr1 TOK_NE error | expr1 '>' error | expr1 TOK_GE error | expr1 '<' error | expr1 TOK_LE error | expr1 TOK_LSH error | expr1 TOK_RSH error | expr1 '+' error | expr1 '-' error | expr1 '*' error | expr1 '%' error
97358e1998-04-23Fredrik Hübinette (Hubbe)  | expr1 '/' error
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  expr2: expr3
7e50571996-11-02Fredrik Hübinette (Hubbe)  | cast expr2 {
3699402001-02-20Henrik Grubbström (Grubba)  $$ = mkcastnode($1->u.sval.u.type, $2);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($1);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
1d73ef1999-11-23Henrik Grubbström (Grubba)  | soft_cast expr2 {
3699402001-02-20Henrik Grubbström (Grubba)  $$ = mksoftcastnode($1->u.sval.u.type, $2);
1d73ef1999-11-23Henrik Grubbström (Grubba)  free_node($1); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_INC expr4 { $$=mknode(F_INC,$2,0); } | TOK_DEC expr4 { $$=mknode(F_DEC,$2,0); } | TOK_NOT expr2 { $$=mkopernode("`!",$2,0); }
5192732015-05-15Henrik Grubbström (Grubba)  | '~' expr2 { if ($2 && ($2->token == F_CONSTANT) && (TYPEOF($2->u.sval) == T_INT)) { $$ = mkintnode(~($2->u.sval.u.integer)); free_node($2); } else { $$ = mkopernode("`~", $2, 0); } } | '-' expr2 { if ($2 && ($2->token == F_CONSTANT) && (TYPEOF($2->u.sval) == T_INT) && !INT_TYPE_NEG_OVERFLOW($2->u.sval.u.integer)) { $$ = mkintnode(-($2->u.sval.u.integer)); free_node($2); } else { $$=mkopernode("`-", $2, 0); } }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe)  expr3: expr4
f76b4c2000-05-11Henrik Grubbström (Grubba)  | expr4 TOK_INC { $$=mknode(F_POST_INC,$1,0); } | expr4 TOK_DEC { $$=mknode(F_POST_DEC,$1,0); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
a30f092000-07-12Fredrik Hübinette (Hubbe) /* FIXMEs * It would be nice if 'return' would exit from * the surrounding function rather than from the * implicit lambda. (I think) So beware that the * behaviour of 'return' might change some day. * -Hubbe * * It would also be nice if it was possible to send * arguments to the implicit function, but it would * require using ugly implicit variables or extending * the syntax, and if you extend the syntax you might * as well use lambda() instead. * -Hubbe * * We might want to allow having more than block after * a function ( ie. func(args) {} {} {} {} ) * -Hubbe */
55bd772005-02-18Henrik Grubbström (Grubba) optional_block: /* EMPTY */ { $$=0; }
ff02322008-05-07Henrik Grubbström (Grubba)  | '{' line_number_info /* FIXME: Use implicit_identifier to make __func__ point to the lambda? */
f2dbd22016-01-25Henrik Grubbström (Grubba)  start_lambda
a30f092000-07-12Fredrik Hübinette (Hubbe)  { /* block code */ $<number>1=Pike_compiler->num_used_modules;
c68a292001-06-10Henrik Grubbström (Grubba)  $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
cbe1302017-01-06Henrik Grubbström (Grubba) 
cbcf322017-01-07Henrik Grubbström (Grubba)  /* Declare the argument variable. * * NB: The code in the next block knows that this variable * will be variable #0. */
cbe1302017-01-06Henrik Grubbström (Grubba)  push_type(T_MIXED);
04017d2020-01-02Henrik Grubbström (Grubba)  push_unlimited_array_type(T_ARRAY);
cbe1302017-01-06Henrik Grubbström (Grubba)  add_local_name(args_string, compiler_pop_type(), 0);
a30f092000-07-12Fredrik Hübinette (Hubbe)  }
55bd772005-02-18Henrik Grubbström (Grubba)  statements end_block
a30f092000-07-12Fredrik Hübinette (Hubbe)  {
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *type;
c68a292001-06-10Henrik Grubbström (Grubba)  int f/*, e */;
a30f092000-07-12Fredrik Hübinette (Hubbe)  struct pike_string *name;
e021fe2008-04-14Henrik Grubbström (Grubba)  struct compilation *c = THIS_COMPILATION; struct pike_string *save_file = c->lex.current_file; int save_line = c->lex.current_line;
cbcf322017-01-07Henrik Grubbström (Grubba)  int args_used = Pike_compiler->compiler_frame->variable[0].flags & LOCAL_VAR_IS_USED; /* Don't warn about the argument if unused. */ Pike_compiler->compiler_frame->variable[0].flags |= LOCAL_VAR_IS_USED;
e021fe2008-04-14Henrik Grubbström (Grubba)  c->lex.current_file = $2->current_file; c->lex.current_line = $2->line_number;
a30f092000-07-12Fredrik Hübinette (Hubbe) 
cbcf322017-01-07Henrik Grubbström (Grubba)  /* block code */ unuse_modules(Pike_compiler->num_used_modules - $<number>1); $5 = pop_local_variables($<number>4, $5); debug_malloc_touch($5); $5=mknode(F_COMMA_EXPR,$5,mknode(F_RETURN,mkintnode(0),0));
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass != COMPILER_PASS_FIRST) {
cbdf332003-03-27Martin Stjernholm  /* Doing this in pass 1 might induce too strict checks on types * in cases where we got placeholders. */ type=find_return_type($5);
e3866b2007-09-03Henrik Grubbström (Grubba)  if (type) { push_finished_type(type); free_type(type); } else { yywarning("Failed to determine return type for implicit lambda."); push_type(T_ZERO); } } else { /* Tentative return type. */
a30f092000-07-12Fredrik Hübinette (Hubbe)  push_type(T_MIXED);
e3866b2007-09-03Henrik Grubbström (Grubba)  }
0ad6502012-10-02Per Hedbor 
cbcf322017-01-07Henrik Grubbström (Grubba)  if (args_used) {
cbe1302017-01-06Henrik Grubbström (Grubba)  /* __ARGS__ is used. */ push_type(T_MIXED); } else { push_type(T_VOID); }
a30f092000-07-12Fredrik Hübinette (Hubbe)  push_type(T_MANY);
0ad6502012-10-02Per Hedbor 
a30f092000-07-12Fredrik Hübinette (Hubbe)  type=compiler_pop_type();
28b7362008-07-08Henrik Grubbström (Grubba)  name = get_new_name(NULL);
a30f092000-07-12Fredrik Hübinette (Hubbe)  #ifdef LAMBDA_DEBUG fprintf(stderr, "%d: IMPLICIT LAMBDA: %s 0x%08lx 0x%08lx\n",
b2e7262007-09-15Henrik Grubbström (Grubba)  Pike_compiler->compiler_pass, name->str, (long)Pike_compiler->new_program->id, Pike_compiler->local_class_counter-1);
a30f092000-07-12Fredrik Hübinette (Hubbe) #endif /* LAMBDA_DEBUG */
0ad6502012-10-02Per Hedbor 
a30f092000-07-12Fredrik Hübinette (Hubbe)  f=dooptcode(name,
9b39022003-03-27Martin Stjernholm  $5,
a30f092000-07-12Fredrik Hübinette (Hubbe)  type,
95489a2008-06-29Martin Nilsson  ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED);
a30f092000-07-12Fredrik Hübinette (Hubbe)  if(Pike_compiler->compiler_frame->lexical_scope & SCOPE_SCOPED) {
8c70ba2001-09-28Fredrik Hübinette (Hubbe)  $$ = mktrampolinenode(f,Pike_compiler->compiler_frame->previous);
a30f092000-07-12Fredrik Hübinette (Hubbe)  } else { $$ = mkidentifiernode(f); }
d4f23b2001-08-10Martin Stjernholm 
e021fe2008-04-14Henrik Grubbström (Grubba)  c->lex.current_line = save_line; c->lex.current_file = save_file;
9b39022003-03-27Martin Stjernholm  free_node ($2);
a30f092000-07-12Fredrik Hübinette (Hubbe)  free_string(name);
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(type);
bc62892009-06-22Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG if (Pike_compiler->compiler_frame != $3) { Pike_fatal("Lost track of compiler_frame!\n" " Got: %p (Expected: %p) Previous: %p\n", Pike_compiler->compiler_frame, $3, Pike_compiler->compiler_frame->previous); } #endif
a30f092000-07-12Fredrik Hübinette (Hubbe)  pop_compiler_frame(); } ;
55bd772005-02-18Henrik Grubbström (Grubba) apply: expr4 open_paren_with_line_info expr_list ')' optional_block
db271d1998-04-27Henrik Grubbström (Grubba)  {
55bd772005-02-18Henrik Grubbström (Grubba)  $$ = mkapplynode($1, mknode(F_ARG_LIST, $3, $5)); COPY_LINE_NUMBER_INFO($$, $2); free_node ($2); }
aab83d2019-11-03Marcus Comstedt  | expr4 safe_apply_with_line_info expr_list ')' optional_block { /* A(?B...) to ((tmp=A) && tmp(B...)) */ int temporary; if( $1 && ($1->token == F_LOCAL) ) { $$=mknode(F_LAND, copy_node($1), mkapplynode($1, mknode(F_ARG_LIST, $3, $5))); } else { fix_type_field( $1 ); if( $1 && $1->type ) { add_ref($1->type); temporary = add_local_name(empty_pike_string, $1->type, 0); Pike_compiler->compiler_frame->variable[temporary].flags |= LOCAL_VAR_IS_USED; $$=mknode(F_LAND, mknode(F_ASSIGN, mklocalnode(temporary,0), $1), mkapplynode(mklocalnode(temporary,0), mknode(F_ARG_LIST, $3, $5))); $$ = pop_local_variables(temporary, $$); } else { $$ = mkapplynode($1, mknode(F_ARG_LIST, $3, $5)); yyerror("Indexing unexpected value."); } } COPY_LINE_NUMBER_INFO($$, $2); free_node ($2); } | expr4 open_paren_or_safe_apply_with_line_info error ')' optional_block
55bd772005-02-18Henrik Grubbström (Grubba)  { $$=mkapplynode($1, $5);
10fe602003-10-01Martin Stjernholm  free_node ($2); yyerrok; }
aab83d2019-11-03Marcus Comstedt  | expr4 open_paren_or_safe_apply_with_line_info error TOK_LEX_EOF
10fe602003-10-01Martin Stjernholm  { yyerror("Missing ')'.");
db271d1998-04-27Henrik Grubbström (Grubba)  yyerror("Unexpected end of file.");
10fe602003-10-01Martin Stjernholm  $$=mkapplynode($1, NULL); free_node ($2); }
aab83d2019-11-03Marcus Comstedt  | expr4 open_paren_or_safe_apply_with_line_info error ';'
10fe602003-10-01Martin Stjernholm  { yyerror("Missing ')'."); $$=mkapplynode($1, NULL); free_node ($2); }
aab83d2019-11-03Marcus Comstedt  | expr4 open_paren_or_safe_apply_with_line_info error '}'
10fe602003-10-01Martin Stjernholm  { yyerror("Missing ')'."); $$=mkapplynode($1, NULL); free_node ($2); }
55bd772005-02-18Henrik Grubbström (Grubba)  ;
2a343f2008-04-04Henrik Grubbström (Grubba) implicit_modifiers: {
843d2f2018-11-06Henrik Grubbström (Grubba)  free_node(Pike_compiler->current_annotations); Pike_compiler->current_annotations = NULL;
3a30d72014-10-05Martin Nilsson  $$ = Pike_compiler->current_modifiers = ID_PROTECTED|ID_INLINE|ID_PRIVATE | (THIS_COMPILATION->lex.pragmas & ID_MODIFIER_MASK);
2a343f2008-04-04Henrik Grubbström (Grubba)  } ;
7bf71d2017-12-10Henrik Grubbström (Grubba) expr4: idents | expr5
aea6a42016-05-09Henrik Grubbström (Grubba)  | expr5 '.' line_number_info TOK_IDENTIFIER { $$=index_node($1,".",$4->u.sval.u.string); COPY_LINE_NUMBER_INFO($$, $3); free_node ($1); free_node ($3); free_node ($4); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | bad_expr_ident { $$ = mknewintnode(0); }
aea6a42016-05-09Henrik Grubbström (Grubba)  ; expr5: literal_expr
55bd772005-02-18Henrik Grubbström (Grubba)  | catch | gauge | typeof | sscanf
975c1e2018-09-10Henrik Grubbström (Grubba)  | static_assertion { $$ = mknewintnode(0); }
55bd772005-02-18Henrik Grubbström (Grubba)  | lambda
6dddaa2016-11-09Henrik Grubbström (Grubba)  | implicit_modifiers anon_class { $$ = $2; }
2a343f2008-04-04Henrik Grubbström (Grubba)  | implicit_modifiers enum { $$ = $2; }
55bd772005-02-18Henrik Grubbström (Grubba)  | apply
10fe602003-10-01Martin Stjernholm  | expr4 open_bracket_with_line_info '*' ']' { $$=mknode(F_AUTO_MAP_MARKER, $1, 0);
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $2);
10fe602003-10-01Martin Stjernholm  free_node ($2); } | expr4 open_bracket_with_line_info expr0 ']' { $$=mknode(F_INDEX,$1,$3);
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $2);
10fe602003-10-01Martin Stjernholm  free_node ($2);
db271d1998-04-27Henrik Grubbström (Grubba)  }
10fe602003-10-01Martin Stjernholm  | expr4 open_bracket_with_line_info
408a1e2004-10-30Martin Stjernholm  range_bound expected_dot_dot range_bound ']'
d2c6081996-11-07Fredrik Hübinette (Hubbe)  {
408a1e2004-10-30Martin Stjernholm  $$=mknode(F_RANGE,$1,mknode(':',$3,$5));
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $2);
10fe602003-10-01Martin Stjernholm  free_node ($2);
d2c6081996-11-07Fredrik Hübinette (Hubbe)  }
0ad6502012-10-02Per Hedbor  | expr4 TOK_SAFE_START_INDEX line_number_info expr0 ']' {
2525892013-11-02Per Hedbor  /* A[?X] to ((tmp=A) && tmp[X]) */
aa50312014-12-09Henrik Grubbström (Grubba)  if( $1 && ($1->token == F_LOCAL) )
0ad6502012-10-02Per Hedbor  {
efd3b62013-10-28Arne Goedeke  $$=mknode(F_LAND, copy_node($1), mknode(F_INDEX, $1, $4));
0ad6502012-10-02Per Hedbor  } else { fix_type_field( $1 );
aa50312014-12-09Henrik Grubbström (Grubba)  if( $1 && $1->type )
0ad6502012-10-02Per Hedbor  { int temporary; $1->type->refs++; temporary = add_local_name(empty_pike_string, $1->type, 0); Pike_compiler->compiler_frame->variable[temporary].flags |= LOCAL_VAR_IS_USED; $$=mknode(F_LAND,
a1af302017-03-18Henrik Grubbström (Grubba)  mknode(F_ASSIGN, mklocalnode(temporary,0), $1),
0ad6502012-10-02Per Hedbor  mknode(F_INDEX, mklocalnode(temporary,0), $4));
b7dce32016-05-12Henrik Grubbström (Grubba)  $$ = pop_local_variables(temporary, $$);
0ad6502012-10-02Per Hedbor  } else { $$=mknode(F_INDEX, $1,$4); yyerror("Indexing unexpected value."); } } COPY_LINE_NUMBER_INFO($$, $3); free_node ($3); } | expr4 TOK_SAFE_START_INDEX line_number_info range_bound expected_dot_dot range_bound ']' {
2525892013-11-02Per Hedbor  /* A[?X..Y] to ((tmp=A) && tmp[X..Y]) */
0ad6502012-10-02Per Hedbor  node *range = mknode(':',$4,$6);
aa50312014-12-09Henrik Grubbström (Grubba)  if( $1 && ($1->token == F_LOCAL ) )
0ad6502012-10-02Per Hedbor  {
efd3b62013-10-28Arne Goedeke  $$ = mknode( F_LAND, copy_node($1), mknode(F_RANGE, $1, range) );
0ad6502012-10-02Per Hedbor  } else { fix_type_field( $1 );
aa50312014-12-09Henrik Grubbström (Grubba)  if( $1 && $1->type )
0ad6502012-10-02Per Hedbor  { int temporary; $1->type->refs++; temporary = add_local_name(empty_pike_string, $1->type, 0); Pike_compiler->compiler_frame->variable[temporary].flags |= LOCAL_VAR_IS_USED; $$=mknode(F_LAND,
a1af302017-03-18Henrik Grubbström (Grubba)  mknode(F_ASSIGN, mklocalnode(temporary,0), $1),
0ad6502012-10-02Per Hedbor  mknode(F_RANGE, mklocalnode(temporary,0), range) );
b7dce32016-05-12Henrik Grubbström (Grubba)  $$ = pop_local_variables(temporary, $$);
0ad6502012-10-02Per Hedbor  } else { $$ = mknode( F_LAND, $1, mknode(F_RANGE,$1,range) ); yyerror("Indexing unexpected value."); } } COPY_LINE_NUMBER_INFO($$, $3); free_node ($3); }
10fe602003-10-01Martin Stjernholm  | expr4 open_bracket_with_line_info error ']' { $$=$1; free_node ($2); yyerrok; } | expr4 open_bracket_with_line_info error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  { $$=$1; yyerror("Missing ']'."); yyerror("Unexpected end of file.");
10fe602003-10-01Martin Stjernholm  free_node ($2);
db271d1998-04-27Henrik Grubbström (Grubba)  }
10fe602003-10-01Martin Stjernholm  | expr4 open_bracket_with_line_info error ';' {$$=$1; yyerror("Missing ']'."); free_node ($2);} | expr4 open_bracket_with_line_info error '}' {$$=$1; yyerror("Missing ']'."); free_node ($2);} | expr4 open_bracket_with_line_info error ')' {$$=$1; yyerror("Missing ']'."); free_node ($2);} | open_paren_with_line_info comma_expr2 ')'
63e5842005-01-27Henrik Grubbström (Grubba)  { $$=$2; if ($$) { COPY_LINE_NUMBER_INFO($$, $1); } free_node ($1); }
10fe602003-10-01Martin Stjernholm  | open_paren_with_line_info error ')' { $$=$1; yyerrok; } | open_paren_with_line_info error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  {
10fe602003-10-01Martin Stjernholm  $$=$1; yyerror("Missing ')'.");
db271d1998-04-27Henrik Grubbström (Grubba)  yyerror("Unexpected end of file."); }
10fe602003-10-01Martin Stjernholm  | open_paren_with_line_info error ';' { $$=$1; yyerror("Missing ')'."); } | open_paren_with_line_info error '}' { $$=$1; yyerror("Missing ')'."); } | expr4 TOK_ARROW line_number_info magic_identifier
d2c6081996-11-07Fredrik Hübinette (Hubbe)  {
10fe602003-10-01Martin Stjernholm  $$=mknode(F_ARROW,$1,$4);
0195962004-08-25Henrik Grubbström (Grubba)  COPY_LINE_NUMBER_INFO($$, $3);
10fe602003-10-01Martin Stjernholm  free_node ($3);
d2c6081996-11-07Fredrik Hübinette (Hubbe)  }
0ad6502012-10-02Per Hedbor  | expr4 TOK_SAFE_INDEX line_number_info TOK_IDENTIFIER {
19582d2019-11-02Peter Bortas  /* A->?B to ((tmp=A) && tmp->B) */
0ad6502012-10-02Per Hedbor  int temporary;
aa50312014-12-09Henrik Grubbström (Grubba)  if( $1 && ($1->token == F_LOCAL) )
0ad6502012-10-02Per Hedbor  {
efd3b62013-10-28Arne Goedeke  $$=mknode(F_LAND, copy_node($1), mknode(F_ARROW, $1, $4));
0ad6502012-10-02Per Hedbor  } else { fix_type_field( $1 );
2a01c22015-07-21Arne Goedeke  if( $1 && $1->type )
0ad6502012-10-02Per Hedbor  {
b7dce32016-05-12Henrik Grubbström (Grubba)  add_ref($1->type);
0ad6502012-10-02Per Hedbor  temporary = add_local_name(empty_pike_string, $1->type, 0);
b7dce32016-05-12Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->variable[temporary].flags |= LOCAL_VAR_IS_USED;
0ad6502012-10-02Per Hedbor  $$=mknode(F_LAND,
a1af302017-03-18Henrik Grubbström (Grubba)  mknode(F_ASSIGN, mklocalnode(temporary,0), $1),
0ad6502012-10-02Per Hedbor  mknode(F_ARROW, mklocalnode(temporary,0), $4));
b7dce32016-05-12Henrik Grubbström (Grubba)  $$ = pop_local_variables(temporary, $$);
0ad6502012-10-02Per Hedbor  } else { $$=mknode(F_ARROW, $1,$4); yyerror("Indexing unexpected value."); } } COPY_LINE_NUMBER_INFO($$, $3); free_node ($3); }
10fe602003-10-01Martin Stjernholm  | expr4 TOK_ARROW line_number_info error {$$=$1; free_node ($3);}
d2c6081996-11-07Fredrik Hübinette (Hubbe)  ;
f99cdd2016-05-08Henrik Grubbström (Grubba) literal_expr: string | TOK_NUMBER | TOK_FLOAT { $$=mkfloatnode((FLOAT_TYPE)$1); } | open_paren_with_line_info '{' expr_list close_brace_or_missing ')' { /* FIXME: May eat lots of stack; cf Standards.FIPS10_4.divisions */ $$=mkefuncallnode("aggregate",$3); COPY_LINE_NUMBER_INFO($$, $1); free_node ($1); } | open_paren_with_line_info open_bracket_with_line_info /* Only to avoid shift/reduce conflicts. */ m_expr_list close_bracket_or_missing ')' { /* FIXME: May eat lots of stack; cf Standards.FIPS10_4.divisions */ $$=mkefuncallnode("aggregate_mapping",$3); COPY_LINE_NUMBER_INFO($$, $1); free_node ($1); free_node ($2); } | TOK_MULTISET_START line_number_info expr_list TOK_MULTISET_END { /* FIXME: May eat lots of stack; cf Standards.FIPS10_4.divisions */ $$=mkefuncallnode("aggregate_multiset",$3); COPY_LINE_NUMBER_INFO($$, $2); free_node ($2); } | TOK_MULTISET_START line_number_info expr_list ')' { yyerror("Missing '>'."); $$=mkefuncallnode("aggregate_multiset",$3); COPY_LINE_NUMBER_INFO($$, $2); free_node ($2); } | TOK_MULTISET_START line_number_info error TOK_MULTISET_END { $$=$2; yyerrok; } | TOK_MULTISET_START line_number_info error ')' { yyerror("Missing '>'."); $$=$2; yyerrok; } | TOK_MULTISET_START line_number_info error TOK_LEX_EOF { $$=$2; yyerror("Missing '>)'."); yyerror("Unexpected end of file."); } | TOK_MULTISET_START line_number_info error ';' { $$=$2; yyerror("Missing '>)'."); } | TOK_MULTISET_START line_number_info error '}' { $$=$2; yyerror("Missing '>)'."); } ;
7bf71d2017-12-10Henrik Grubbström (Grubba) unqualified_idents: low_idents | unqualified_idents '.' TOK_IDENTIFIER { $$=index_node($1, Pike_compiler->last_identifier?Pike_compiler->last_identifier->str:NULL, $3->u.sval.u.string); free_node($1); if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); copy_shared_string(Pike_compiler->last_identifier, $3->u.sval.u.string); free_node($3); } | unqualified_idents '.' bad_identifier {} ; qualified_idents: qualified_ident | qualified_idents '.' TOK_IDENTIFIER
591c0c1997-01-19Fredrik Hübinette (Hubbe)  {
de1d7d2000-07-10Henrik Grubbström (Grubba)  $$=index_node($1, Pike_compiler->last_identifier?Pike_compiler->last_identifier->str:NULL,
fae37d1998-08-30Henrik Grubbström (Grubba)  $3->u.sval.u.string);
591c0c1997-01-19Fredrik Hübinette (Hubbe)  free_node($1);
de1d7d2000-07-10Henrik Grubbström (Grubba)  if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); copy_shared_string(Pike_compiler->last_identifier, $3->u.sval.u.string);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($3);
591c0c1997-01-19Fredrik Hübinette (Hubbe)  }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | qualified_idents '.' bad_identifier {} ; idents: unqualified_idents | qualified_idents
591c0c1997-01-19Fredrik Hübinette (Hubbe)  ;
a83d122013-11-08Henrik Grubbström (Grubba) string_or_identifier: TOK_IDENTIFIER | string ;
062e842013-11-09Henrik Grubbström (Grubba) /* Note that the result of this rule is passed both with * the node value (inherit number) and with two global * variables (inherit_state and inherit_depth). * * Note also that inherit number -1 indicates any inherit. */
a83d122013-11-08Henrik Grubbström (Grubba) inherit_specifier: string_or_identifier TOK_COLON_COLON
82e1b72000-06-22Henrik Grubbström (Grubba)  {
8853882008-04-26Henrik Grubbström (Grubba)  struct compilation *c = THIS_COMPILATION;
062e842013-11-09Henrik Grubbström (Grubba)  struct program_state *state = Pike_compiler; int depth;
baa7712016-05-06Henrik Grubbström (Grubba)  int e = INHERIT_ALL;
82e1b72000-06-22Henrik Grubbström (Grubba) 
062e842013-11-09Henrik Grubbström (Grubba)  inherit_state = NULL; inherit_depth = 0; /* NB: The heuristics here are a bit strange * (all to make it as backward compatible as possible). * * The priority order is as follows: * * 1: Direct inherits in the current class. * * 2: The name of the current class. * * 3: 1 & 2 recursively for surrounding parent classes. * * 4: Indirect inherits in the current class. * * 5: 4 recursively for surrounding parent classes. *
cbcad32019-06-11Henrik Grubbström (Grubba)  * 6: this & this_program.
062e842013-11-09Henrik Grubbström (Grubba)  * * Note that a deep inherit in the current class trumphs * a not so deep inherit in a parent class (but not a * direct inherit in a parent class). To select the deep * inherit in the parent class in this case, prefix it * with the name of the parent class. */ for (depth = 0;; depth++, state = state->previous) { int inh = find_inherit(state->new_program, $1->u.sval.u.string); if (inh && (!inherit_state || (state->new_program->inherits[inh].inherit_level == 1))) { /* Found, and we've either not found anything earlier, * or this is a direct inherit (and the previous * wasn't since we didn't break out of the loop). */
91b0d92002-05-05Martin Stjernholm  e = inh;
062e842013-11-09Henrik Grubbström (Grubba)  inherit_state = state; inherit_depth = depth; if (state->new_program->inherits[inh].inherit_level == 1) { /* Name of direct inherit ==> Done. */ break; }
91b0d92002-05-05Martin Stjernholm  }
062e842013-11-09Henrik Grubbström (Grubba)  /* The top-level class does not have a name, so break here. */ if (depth == c->compilation_depth) break;
ec80082014-08-24Martin Nilsson  if (ID_FROM_INT (state->previous->new_program,
062e842013-11-09Henrik Grubbström (Grubba)  state->parent_identifier)->name ==
91b0d92002-05-05Martin Stjernholm  $1->u.sval.u.string) {
062e842013-11-09Henrik Grubbström (Grubba)  /* Name of surrounding class ==> Done. */
baa7712016-05-06Henrik Grubbström (Grubba)  e = INHERIT_SELF;
062e842013-11-09Henrik Grubbström (Grubba)  inherit_state = state; inherit_depth = depth;
91b0d92002-05-05Martin Stjernholm  break; }
8c64232000-06-26Henrik Grubbström (Grubba)  }
baa7712016-05-06Henrik Grubbström (Grubba)  if (e < 0) {
cbcad32019-06-11Henrik Grubbström (Grubba)  inherit_state = Pike_compiler; inherit_depth = 0; e = INHERIT_SELF; if (($1->u.sval.u.string != this_program_string) && ($1->u.sval.u.string != this_string)) {
ec80082014-08-24Martin Nilsson  my_yyerror("No inherit or surrounding class %S.", $1->u.sval.u.string);
cbcad32019-06-11Henrik Grubbström (Grubba)  }
82e1b72000-06-22Henrik Grubbström (Grubba)  } free_node($1);
8c64232000-06-26Henrik Grubbström (Grubba)  $$ = e;
82e1b72000-06-22Henrik Grubbström (Grubba)  }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_LOCAL_ID TOK_COLON_COLON { inherit_state = Pike_compiler; inherit_depth = 0; $$ = INHERIT_LOCAL; }
3604362002-05-05Martin Stjernholm  | TOK_GLOBAL TOK_COLON_COLON {
8853882008-04-26Henrik Grubbström (Grubba)  struct compilation *c = THIS_COMPILATION;
3604362002-05-05Martin Stjernholm  inherit_state = Pike_compiler;
8853882008-04-26Henrik Grubbström (Grubba)  for (inherit_depth = 0; inherit_depth < c->compilation_depth;
3604362002-05-05Martin Stjernholm  inherit_depth++, inherit_state = inherit_state->previous) {}
baa7712016-05-06Henrik Grubbström (Grubba)  $$ = INHERIT_GLOBAL;
3604362002-05-05Martin Stjernholm  }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | inherit_specifier TOK_LOCAL_ID TOK_COLON_COLON { if ($1 > 0) { yywarning("local:: references to inherited symbols is a noop."); $$ = $1; } else { $$ = INHERIT_LOCAL; } }
82e1b72000-06-22Henrik Grubbström (Grubba)  | inherit_specifier TOK_IDENTIFIER TOK_COLON_COLON {
a2f4232008-05-30Henrik Grubbström (Grubba)  int e = 0;
7e64282008-05-30Henrik Grubbström (Grubba)  if ($1 < 0) {
baa7712016-05-06Henrik Grubbström (Grubba)  $1 = INHERIT_SELF;
7e64282008-05-30Henrik Grubbström (Grubba)  }
0b3d0f2000-06-26Henrik Grubbström (Grubba) #if 0
a2f4232008-05-30Henrik Grubbström (Grubba)  /* FIXME: The inherit modifiers aren't kept. */ if (!(inherit_state->new_program->inherits[$1].flags & ID_PRIVATE)) {
0b3d0f2000-06-26Henrik Grubbström (Grubba) #endif /* 0 */
a2f4232008-05-30Henrik Grubbström (Grubba)  e = find_inherit(inherit_state->new_program->inherits[$1].prog, $2->u.sval.u.string);
0b3d0f2000-06-26Henrik Grubbström (Grubba) #if 0
a2f4232008-05-30Henrik Grubbström (Grubba)  }
0b3d0f2000-06-26Henrik Grubbström (Grubba) #endif /* 0 */
a2f4232008-05-30Henrik Grubbström (Grubba)  if (!e) { if (inherit_state->new_program->inherits[$1].name) { my_yyerror("No such inherit %S::%S.", inherit_state->new_program->inherits[$1].name, $2->u.sval.u.string);
82e1b72000-06-22Henrik Grubbström (Grubba)  } else {
a2f4232008-05-30Henrik Grubbström (Grubba)  my_yyerror("No such inherit %S.", $2->u.sval.u.string); }
baa7712016-05-06Henrik Grubbström (Grubba)  $$ = INHERIT_ALL;
a2f4232008-05-30Henrik Grubbström (Grubba)  } else { /* We know stuff about the inherit structure... */
7e64282008-05-30Henrik Grubbström (Grubba)  $$ = e + $1;
82e1b72000-06-22Henrik Grubbström (Grubba)  } free_node($2); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | inherit_specifier bad_inherit TOK_COLON_COLON { $$ = INHERIT_ALL; }
82e1b72000-06-22Henrik Grubbström (Grubba)  ;
f76b4c2000-05-11Henrik Grubbström (Grubba) low_idents: TOK_IDENTIFIER
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
de1d7d2000-07-10Henrik Grubbström (Grubba)  if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); copy_shared_string(Pike_compiler->last_identifier, $1->u.sval.u.string);
4218011999-01-31Fredrik Hübinette (Hubbe) 
de1d7d2000-07-10Henrik Grubbström (Grubba)  if(($$=lexical_islocal(Pike_compiler->last_identifier)))
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
4218011999-01-31Fredrik Hübinette (Hubbe)  /* done, nothing to do here */
0ee38f2002-05-11Martin Stjernholm  }else if(!($$=find_module_identifier(Pike_compiler->last_identifier,1)) &&
388e5d2008-05-30Henrik Grubbström (Grubba)  !($$ = program_magic_identifier (Pike_compiler, 0, -1,
0ee38f2002-05-11Martin Stjernholm  Pike_compiler->last_identifier, 0))) {
cd2be32004-03-13Henrik Grubbström (Grubba)  if((Pike_compiler->flags & COMPILATION_FORCE_RESOLVE) ||
bdfe4e2017-12-11Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_LAST)) {
ce060e2004-06-30Martin Nilsson  my_yyerror("Undefined identifier %S.", Pike_compiler->last_identifier);
4eab662004-03-17Henrik Grubbström (Grubba)  /* FIXME: Add this identifier as a constant in the current program to * avoid multiple reporting of the same identifier. * NOTE: This should then only be done in the second pass.
13670c2015-05-25Martin Nilsson  */
f23f062004-03-12Henrik Grubbström (Grubba)  $$=0;
97358e1998-04-23Fredrik Hübinette (Hubbe)  }else{
f23f062004-03-12Henrik Grubbström (Grubba)  $$=mknode(F_UNDEFINED,0,0);
dffa011997-01-15Fredrik Hübinette (Hubbe)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($1);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
bbd8922011-07-07Henrik Grubbström (Grubba)  | '.' TOK_IDENTIFIER {
4a001a2019-12-15Marcus Comstedt  push_constant_text("");
0880972019-03-26Henrik Grubbström (Grubba)  if (call_handle_import()) {
bbd8922011-07-07Henrik Grubbström (Grubba)  node *tmp=mkconstantsvaluenode(Pike_sp-1); pop_stack(); $$=index_node(tmp, ".", $2->u.sval.u.string); free_node(tmp); } else $$=mknewintnode(0); if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); copy_shared_string(Pike_compiler->last_identifier, $2->u.sval.u.string); free_node($2); } | TOK_GLOBAL '.' TOK_IDENTIFIER { $$ = resolve_identifier ($3->u.sval.u.string); if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); copy_shared_string(Pike_compiler->last_identifier, $3->u.sval.u.string); free_node ($3); }
32bc322008-06-18Henrik Grubbström (Grubba)  | TOK_RESERVED { ref_push_string($1->u.sval.u.string); low_yyreport(REPORT_ERROR, NULL, 0, parser_system_string, 1, "Unknown reserved symbol %s."); free_node($1); $$ = 0; }
7bf71d2017-12-10Henrik Grubbström (Grubba)  ; qualified_ident: TOK_PREDEF TOK_COLON_COLON TOK_IDENTIFIER
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
4d889f2008-04-25Henrik Grubbström (Grubba)  struct compilation *c = THIS_COMPILATION;
45e8a81997-01-26Fredrik Hübinette (Hubbe)  node *tmp2;
ac87152000-09-25Fredrik Hübinette (Hubbe) 
4d889f2008-04-25Henrik Grubbström (Grubba)  if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier);
de1d7d2000-07-10Henrik Grubbström (Grubba)  copy_shared_string(Pike_compiler->last_identifier, $3->u.sval.u.string);
ac87152000-09-25Fredrik Hübinette (Hubbe) 
4d889f2008-04-25Henrik Grubbström (Grubba)  tmp2 = mkconstantsvaluenode(&c->default_module); $$ = index_node(tmp2, "predef", $3->u.sval.u.string);
43fc171999-09-19Fredrik Hübinette (Hubbe)  if(!$$->name) add_ref( $$->name=$3->u.sval.u.string );
45e8a81997-01-26Fredrik Hübinette (Hubbe)  free_node(tmp2);
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($3);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PREDEF TOK_COLON_COLON bad_identifier
8c77b61998-04-13Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
8c77b61998-04-13Henrik Grubbström (Grubba)  }
a0af022006-01-21Henrik Grubbström (Grubba)  | TOK_VERSION TOK_COLON_COLON TOK_IDENTIFIER {
7f012e2014-11-09Henrik Grubbström (Grubba)  $$ = find_versioned_identifier($3->u.sval.u.string, $1->u.integer.a, $1->u.integer.b);
a0af022006-01-21Henrik Grubbström (Grubba)  free_node($1); free_node($3); } | TOK_VERSION TOK_COLON_COLON bad_identifier { free_node($1); $$=0; }
82e1b72000-06-22Henrik Grubbström (Grubba)  | inherit_specifier TOK_IDENTIFIER
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
388e5d2008-05-30Henrik Grubbström (Grubba)  int id;
fae37d1998-08-30Henrik Grubbström (Grubba) 
388e5d2008-05-30Henrik Grubbström (Grubba)  if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); copy_shared_string(Pike_compiler->last_identifier, $2->u.sval.u.string);
a005eb1999-03-04Fredrik Hübinette (Hubbe) 
c528462016-05-03Henrik Grubbström (Grubba)  $$ = find_inherited_identifier(inherit_state, inherit_depth, $1, Pike_compiler->last_identifier); if (!$$) {
388e5d2008-05-30Henrik Grubbström (Grubba)  if ((Pike_compiler->flags & COMPILATION_FORCE_RESOLVE) ||
bdfe4e2017-12-11Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_LAST)) {
4f6c972019-06-11Henrik Grubbström (Grubba)  if (($1 >= 0) && inherit_state->new_program && inherit_state->new_program->inherits[$1].name) {
388e5d2008-05-30Henrik Grubbström (Grubba)  my_yyerror("Undefined identifier %S::%S.", inherit_state->new_program->inherits[$1].name, Pike_compiler->last_identifier); } else { my_yyerror("Undefined identifier %S.", Pike_compiler->last_identifier);
8c64232000-06-26Henrik Grubbström (Grubba)  }
388e5d2008-05-30Henrik Grubbström (Grubba)  $$=0;
8c64232000-06-26Henrik Grubbström (Grubba)  }
388e5d2008-05-30Henrik Grubbström (Grubba)  else $$=mknode(F_UNDEFINED,0,0);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
82e1b72000-06-22Henrik Grubbström (Grubba)  free_node($2);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
8c64232000-06-26Henrik Grubbström (Grubba)  | inherit_specifier bad_identifier { $$=0; } | inherit_specifier error { $$=0; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_COLON_COLON TOK_IDENTIFIER
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
baa7712016-05-06Henrik Grubbström (Grubba)  if(Pike_compiler->last_identifier) { free_string(Pike_compiler->last_identifier); }
de1d7d2000-07-10Henrik Grubbström (Grubba)  copy_shared_string(Pike_compiler->last_identifier, $2->u.sval.u.string);
fae37d1998-08-30Henrik Grubbström (Grubba) 
baa7712016-05-06Henrik Grubbström (Grubba)  $$ = find_inherited_identifier(Pike_compiler, 0, INHERIT_ALL,
c528462016-05-03Henrik Grubbström (Grubba)  Pike_compiler->last_identifier);
7e50571996-11-02Fredrik Hübinette (Hubbe)  if(!$$) {
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
c528462016-05-03Henrik Grubbström (Grubba)  my_yyerror("Undefined identifier ::%S.", $2->u.sval.u.string);
2756c12002-11-27Henrik Grubbström (Grubba)  }
c528462016-05-03Henrik Grubbström (Grubba)  $$=mkintnode(0);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($2);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_COLON_COLON bad_identifier
8c77b61998-04-13Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
8c77b61998-04-13Henrik Grubbström (Grubba)  }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
408a1e2004-10-30Martin Stjernholm range_bound: /* empty */ {$$ = mknode (F_RANGE_OPEN, NULL, NULL);}
55356e1999-05-26Fredrik Hübinette (Hubbe)  | comma_expr
408a1e2004-10-30Martin Stjernholm  {$$ = mknode (F_RANGE_FROM_BEG, $1, NULL);} | '<' comma_expr {$$ = mknode (F_RANGE_FROM_END, $2, NULL);} | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$ = mknode (F_RANGE_OPEN, NULL, NULL); } | '<' TOK_LEX_EOF { yyerror("Unexpected end of file."); $$ = mknode (F_RANGE_OPEN, NULL, NULL); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f76b4c2000-05-11Henrik Grubbström (Grubba) gauge: TOK_GAUGE catch_arg
215bed1996-09-28Fredrik Hübinette (Hubbe)  {
47f9762003-02-08Martin Stjernholm  $$=mkopernode("`/", mkopernode("`-", mkopernode("`-", mkefuncallnode("gethrvtime", mkintnode(1)),
c0637b2001-06-25Henrik Grubbström (Grubba)  mknode(F_COMMA_EXPR, mknode(F_POP_VALUE, $2, NULL),
47f9762003-02-08Martin Stjernholm  mkefuncallnode("gethrvtime", mkintnode(1)))), NULL), mkfloatnode((FLOAT_TYPE)1e9));
4868db1997-05-07Per Hedbor  };
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f76b4c2000-05-11Henrik Grubbström (Grubba) typeof: TOK_TYPEOF '(' expr0 ')'
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
e9fbb72018-05-21Henrik Grubbström (Grubba)  $$ = mknode(F_TYPEOF, $3, 0);
13670c2015-05-25Martin Nilsson  }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_TYPEOF '(' error ')' { $$=0; yyerrok; } | TOK_TYPEOF '(' error '}' { $$=0; yyerror("Missing ')'."); } | TOK_TYPEOF '(' error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0; yyerror("Missing ')'.");
db271d1998-04-27Henrik Grubbström (Grubba)  yyerror("Unexpected end of file."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_TYPEOF '(' error ';' { $$=0; yyerror("Missing ')'."); }
4d21331998-04-14Henrik Grubbström (Grubba)  ;
13670c2015-05-25Martin Nilsson 
215bed1996-09-28Fredrik Hübinette (Hubbe) catch_arg: '(' comma_expr ')' { $$=$2; }
498ec11999-11-12Henrik Grubbström (Grubba)  | '(' error ')' { $$=0; yyerrok; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | '(' error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0; yyerror("Missing ')'.");
db271d1998-04-27Henrik Grubbström (Grubba)  yyerror("Unexpected end of file."); }
498ec11999-11-12Henrik Grubbström (Grubba)  | '(' error '}' { $$=0; yyerror("Missing ')'."); } | '(' error ';' { $$=0; yyerror("Missing ')'."); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  | block
4cb7d91999-12-10Henrik Grubbström (Grubba)  | error { $$=0; yyerror("Bad expression for catch."); }
13670c2015-05-25Martin Nilsson  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f76b4c2000-05-11Henrik Grubbström (Grubba) catch: TOK_CATCH
9649491998-02-27Fredrik Hübinette (Hubbe)  {
bad5162000-06-23Fredrik Hübinette (Hubbe)  Pike_compiler->catch_level++;
9649491998-02-27Fredrik Hübinette (Hubbe)  } catch_arg { $$=mknode(F_CATCH,$3,NULL);
bad5162000-06-23Fredrik Hübinette (Hubbe)  Pike_compiler->catch_level--;
4d21331998-04-14Henrik Grubbström (Grubba)  } ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
f76b4c2000-05-11Henrik Grubbström (Grubba) sscanf: TOK_SSCANF '(' expr0 ',' expr0 lvalue_list ')'
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
e021fe2008-04-14Henrik Grubbström (Grubba)  if ($6 && !(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
a23d572008-01-07Henrik Grubbström (Grubba)  mark_lvalues_as_used($6); }
fffdad2014-10-13Martin Nilsson  $$=mknode(F_SSCANF,mknode(F_ARG_LIST,$3,$5),$6);
7e50571996-11-02Fredrik Hübinette (Hubbe)  }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 ',' expr0 error ')'
4d21331998-04-14Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
4d21331998-04-14Henrik Grubbström (Grubba)  free_node($3); free_node($5); yyerrok; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 ',' expr0 error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
db271d1998-04-27Henrik Grubbström (Grubba)  free_node($3); free_node($5); yyerror("Missing ')'."); yyerror("Unexpected end of file."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 ',' expr0 error '}'
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
db271d1998-04-27Henrik Grubbström (Grubba)  free_node($3); free_node($5); yyerror("Missing ')'."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 ',' expr0 error ';'
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
db271d1998-04-27Henrik Grubbström (Grubba)  free_node($3); free_node($5); yyerror("Missing ')'."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 error ')'
4d21331998-04-14Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
4d21331998-04-14Henrik Grubbström (Grubba)  free_node($3); yyerrok; }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
db271d1998-04-27Henrik Grubbström (Grubba)  free_node($3); yyerror("Missing ')'."); yyerror("Unexpected end of file."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 error '}'
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
db271d1998-04-27Henrik Grubbström (Grubba)  free_node($3); yyerror("Missing ')'."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' expr0 error ';'
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0;
db271d1998-04-27Henrik Grubbström (Grubba)  free_node($3); yyerror("Missing ')'."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' error ')' { $$=0; yyerrok; } | TOK_SSCANF '(' error TOK_LEX_EOF
db271d1998-04-27Henrik Grubbström (Grubba)  {
498ec11999-11-12Henrik Grubbström (Grubba)  $$=0; yyerror("Missing ')'.");
db271d1998-04-27Henrik Grubbström (Grubba)  yyerror("Unexpected end of file."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_SSCANF '(' error '}' { $$=0; yyerror("Missing ')'."); } | TOK_SSCANF '(' error ';' { $$=0; yyerror("Missing ')'."); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
3ddb531996-11-02Fredrik Hübinette (Hubbe) lvalue: expr4
10fe602003-10-01Martin Stjernholm  | open_bracket_with_line_info low_lvalue_list ']'
0195962004-08-25Henrik Grubbström (Grubba)  { $$=mknode(F_ARRAY_LVALUE, $2,0); COPY_LINE_NUMBER_INFO($$, $1); free_node($1); }
dd46aa2014-08-11Per Hedbor  | type2 TOK_IDENTIFIER
3ddb531996-11-02Fredrik Hübinette (Hubbe)  {
abdfb62002-09-28Martin Stjernholm  int id = add_local_name($2->u.sval.u.string,compiler_pop_type(),0);
147cb72008-01-05Henrik Grubbström (Grubba)  /* Note: Variable intentionally not marked as used. */
abdfb62002-09-28Martin Stjernholm  if (id >= 0)
c981662006-03-02Henrik Grubbström (Grubba)  $$=mklocalnode(id,-1);
abdfb62002-09-28Martin Stjernholm  else $$ = 0;
3c0c281998-01-26Fredrik Hübinette (Hubbe)  free_node($2);
3ddb531996-11-02Fredrik Hübinette (Hubbe)  }
dd46aa2014-08-11Per Hedbor  /* FIXME: Add production for type2 ==> constant type svalue here? */
39245b1998-04-17Henrik Grubbström (Grubba)  ;
147cb72008-01-05Henrik Grubbström (Grubba)  low_lvalue_list: lvalue lvalue_list { $$=mknode(F_LVALUE_LIST,$1,$2); }
2a32691998-01-31Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) lvalue_list: /* empty */ { $$ = 0; }
147cb72008-01-05Henrik Grubbström (Grubba)  | ',' lvalue lvalue_list { $$ = mknode(F_LVALUE_LIST,$2,$3); }
7e50571996-11-02Fredrik Hübinette (Hubbe)  ;
215bed1996-09-28Fredrik Hübinette (Hubbe) 
9aee972008-05-06Henrik Grubbström (Grubba) string_segment: TOK_STRING | TOK_FUNCTION_NAME { struct compiler_frame *f = Pike_compiler->compiler_frame;
ff02322008-05-07Henrik Grubbström (Grubba)  if (!f || (f->current_function_number < 0)) { $$ = mkstrnode(lfun_strings[LFUN___INIT]);
9aee972008-05-06Henrik Grubbström (Grubba)  } else { struct identifier *id = ID_FROM_INT(Pike_compiler->new_program, f->current_function_number);
28b7362008-07-08Henrik Grubbström (Grubba)  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); }
9aee972008-05-06Henrik Grubbström (Grubba)  } } ; string: string_segment | string string_segment
7e50571996-11-02Fredrik Hübinette (Hubbe)  {
3c0c281998-01-26Fredrik Hübinette (Hubbe)  struct pike_string *a,*b; copy_shared_string(a,$1->u.sval.u.string); copy_shared_string(b,$2->u.sval.u.string); free_node($1); free_node($2); a=add_and_free_shared_strings(a,b); $$=mkstrnode(a); free_string(a);
7e50571996-11-02Fredrik Hübinette (Hubbe)  } ;
a83d122013-11-08Henrik Grubbström (Grubba) string_constant: string | string_constant '+' string { struct pike_string *a,*b; copy_shared_string(a,$1->u.sval.u.string); copy_shared_string(b,$3->u.sval.u.string); free_node($1); free_node($3); a=add_and_free_shared_strings(a,b); $$=mkstrnode(a); free_string(a); } ; /* Same as string_constant above, but without TOK_FUNCTION_NAME. */ real_string_constant: TOK_STRING | real_string_constant TOK_STRING { struct pike_string *a,*b; copy_shared_string(a,$1->u.sval.u.string); copy_shared_string(b,$2->u.sval.u.string); free_node($1); free_node($2); a=add_and_free_shared_strings(a,b); $$=mkstrnode(a); free_string(a); } | real_string_constant '+' TOK_STRING { struct pike_string *a,*b; copy_shared_string(a,$1->u.sval.u.string); copy_shared_string(b,$3->u.sval.u.string); free_node($1); free_node($3); a=add_and_free_shared_strings(a,b); $$=mkstrnode(a); free_string(a); } ;
8c77b61998-04-13Henrik Grubbström (Grubba) /* * Some error-handling */
de1d7d2000-07-10Henrik Grubbström (Grubba) /* FIXME: Should probably set Pike_compiler->last_identifier. */
7bf71d2017-12-10Henrik Grubbström (Grubba) bad_identifier: bad_inherit | TOK_LOCAL_ID { yyerror_reserved("local"); } ; bad_inherit: bad_expr_ident
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_ARRAY_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("array"); }
d315082008-03-27Henrik Grubbström (Grubba)  | TOK_ATTRIBUTE_ID { yyerror_reserved("__attribute__"); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_BREAK { yyerror_reserved("break"); } | TOK_CASE { yyerror_reserved("case"); } | TOK_CATCH { yyerror_reserved("catch"); }
5e3aa52001-04-01Henrik Grubbström (Grubba)  | TOK_CLASS
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("class"); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_CONTINUE { yyerror_reserved("continue"); } | TOK_DEFAULT { yyerror_reserved("default"); }
316e7d2008-04-04Henrik Grubbström (Grubba)  | TOK_DEPRECATED_ID { yyerror_reserved("__deprecated__"); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_DO { yyerror_reserved("do"); }
5e3aa52001-04-01Henrik Grubbström (Grubba)  | TOK_ENUM
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("enum"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_FLOAT_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("float");}
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_FOR { yyerror_reserved("for"); } | TOK_FOREACH { yyerror_reserved("foreach"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_FUNCTION_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("function");}
d315082008-03-27Henrik Grubbström (Grubba)  | TOK_FUNCTION_NAME { yyerror_reserved("__FUNCTION__");}
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_GAUGE { yyerror_reserved("gauge"); } | TOK_IF { yyerror_reserved("if"); }
0880972019-03-26Henrik Grubbström (Grubba)  | TOK_IMPORT { yyerror_reserved("import"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_INT_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("int"); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_LAMBDA { yyerror_reserved("lambda"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_MAPPING_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("mapping"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_MIXED_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("mixed"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_MULTISET_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("multiset"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_OBJECT_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("object"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PROGRAM_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("program"); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_RETURN { yyerror_reserved("return"); } | TOK_SSCANF { yyerror_reserved("sscanf"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_STRING_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("string"); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_SWITCH { yyerror_reserved("switch"); }
5e3aa52001-04-01Henrik Grubbström (Grubba)  | TOK_TYPEDEF
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("typedef"); }
7bf71d2017-12-10Henrik Grubbström (Grubba)  | TOK_TYPEOF { yyerror_reserved("typeof"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_VOID_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("void"); }
32bc322008-06-18Henrik Grubbström (Grubba)  | TOK_RESERVED { ref_push_string($1->u.sval.u.string); low_yyreport(REPORT_ERROR, NULL, 0, parser_system_string, 1, "Unknown reserved symbol %s."); free_node($1); }
a663191998-04-17Henrik Grubbström (Grubba)  ; bad_expr_ident:
f76b4c2000-05-11Henrik Grubbström (Grubba)  TOK_INLINE
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("inline"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PREDEF
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("predef"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PRIVATE
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("private"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PROTECTED
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("protected"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_PUBLIC
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("public"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_OPTIONAL
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("optional"); }
8f733e2000-07-12Henrik Grubbström (Grubba)  | TOK_VARIANT
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("variant"); }
fa47dd2016-09-27Henrik Grubbström (Grubba)  | TOK_WEAK { yyerror_reserved("__weak__"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_STATIC
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("static"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_EXTERN
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("extern"); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_FINAL_ID
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("final");}
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_ELSE
2a7c7c1999-07-18Fredrik Hübinette (Hubbe)  { yyerror("else without if."); }
f76b4c2000-05-11Henrik Grubbström (Grubba)  | TOK_INHERIT
1fb2de2004-10-23Martin Nilsson  { yyerror_reserved("inherit"); }
8c77b61998-04-13Henrik Grubbström (Grubba)  ;
702ea52002-10-11Henrik Grubbström (Grubba) /* * Kludge for bison 1.50. * * Bison 1.50 doesn't support having multiple action blocks * in a sequence where a block refers to the value of its * immediate predecessor. */
8c77b61998-04-13Henrik Grubbström (Grubba) 
10fe602003-10-01Martin Stjernholm /* empty: ; */ /* line_number_info is now used in these cases. */
8c77b61998-04-13Henrik Grubbström (Grubba) 
215bed1996-09-28Fredrik Hübinette (Hubbe) %%
2be52d2007-11-10Martin Nilsson static void yyerror_reserved(const char *keyword)
1fb2de2004-10-23Martin Nilsson {
94d66b2008-05-24Henrik Grubbström (Grubba)  my_yyerror("%s is a reserved word.", keyword);
1fb2de2004-10-23Martin Nilsson }
28b7362008-07-08Henrik Grubbström (Grubba) static struct pike_string *get_new_name(struct pike_string *prefix)
b2e7262007-09-15Henrik Grubbström (Grubba) { char buf[40]; /* Generate a name for a global symbol... */ sprintf(buf,"__lambda_%ld_%ld_line_%d", (long)Pike_compiler->new_program->id, (long)(Pike_compiler->local_class_counter++ & 0xffffffff), /* OSF/1 cc bug. */
e021fe2008-04-14Henrik Grubbström (Grubba)  (int) THIS_COMPILATION->lex.current_line);
28b7362008-07-08Henrik Grubbström (Grubba)  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); }
b2e7262007-09-15Henrik Grubbström (Grubba)  return make_shared_string(buf); }
120d842000-11-08Fredrik Hübinette (Hubbe) static int low_islocal(struct compiler_frame *f, struct pike_string *str) { int e; for(e=f->current_number_of_locals-1;e>=0;e--)
2c8a262008-01-03Henrik Grubbström (Grubba)  if(f->variable[e].name==str) { f->variable[e].flags |= LOCAL_VAR_IS_USED;
120d842000-11-08Fredrik Hübinette (Hubbe)  return e;
2c8a262008-01-03Henrik Grubbström (Grubba)  }
120d842000-11-08Fredrik Hübinette (Hubbe)  return -1; }
401f2a2006-04-02Henrik Grubbström (Grubba) /* Add a local variable to the current function in frame. * NOTE: Steals the references to type and def, but not to str. */
97f6282000-03-07Fredrik Hübinette (Hubbe) int low_add_local_name(struct compiler_frame *frame,
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_string *str, struct pike_type *type, node *def)
215bed1996-09-28Fredrik Hübinette (Hubbe) {
ac87152000-09-25Fredrik Hübinette (Hubbe) 
067ddd2014-08-11Martin Nilsson  if (str->len) {
120d842000-11-08Fredrik Hübinette (Hubbe)  int tmp=low_islocal(frame,str); if(tmp>=0 && tmp >= frame->last_block_level)
fe80612000-09-05Henrik Grubbström (Grubba)  {
ce060e2004-06-30Martin Nilsson  my_yyerror("Duplicate local variable %S, " "previous declaration on line %d\n", str, frame->variable[tmp].line);
fe80612000-09-05Henrik Grubbström (Grubba)  }
f8a4be2000-10-03Fredrik Hübinette (Hubbe)  if(type == void_type_string) {
ce060e2004-06-30Martin Nilsson  my_yyerror("Local variable %S is void.\n", str);
f8a4be2000-10-03Fredrik Hübinette (Hubbe)  }
02a79a2000-09-04Fredrik Hübinette (Hubbe)  }
a566ca1999-12-14Fredrik Hübinette (Hubbe)  debug_malloc_touch(def); debug_malloc_touch(type);
ef9a242006-07-06Henrik Grubbström (Grubba)  debug_malloc_touch(str);
05ae7d2006-03-01Henrik Grubbström (Grubba)  /* NOTE: The number of locals can be 0..255 (not 256), due to * the use of READ_INCR_BYTE() in apply_low.h. */ if (frame->current_number_of_locals == MAX_LOCAL-1)
215bed1996-09-28Fredrik Hübinette (Hubbe)  {
401f2a2006-04-02Henrik Grubbström (Grubba)  my_yyerror("Too many local variables: no space for local variable %S.", str); free_type(type); if (def) free_node(def);
abdfb62002-09-28Martin Stjernholm  return -1;
401f2a2006-04-02Henrik Grubbström (Grubba)  } else {
2c8a262008-01-03Henrik Grubbström (Grubba)  int var = frame->current_number_of_locals;
ff85722021-03-22Henrik Grubbström (Grubba)  if (pike_types_le(type, void_type_string, 0, 0)) {
bdfe4e2017-12-11Henrik Grubbström (Grubba)  if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
2c8a262008-01-03Henrik Grubbström (Grubba)  yywarning("Declaring local variable %S with type void " "(converted to type zero).", str);
1191241999-12-18Henrik Grubbström (Grubba)  }
d68a072001-02-20Henrik Grubbström (Grubba)  free_type(type);
be6fec2001-04-01Henrik Grubbström (Grubba)  copy_pike_type(type, zero_type_string);
5fdb4d1999-12-18Henrik Grubbström (Grubba)  }
1e5c8b2008-01-03Henrik Grubbström (Grubba)  frame->variable[var].type = type;
2c8a262008-01-03Henrik Grubbström (Grubba)  frame->variable[var].name = str; reference_shared_string(str); frame->variable[var].def = def;
e021fe2008-04-14Henrik Grubbström (Grubba)  frame->variable[var].line = THIS_COMPILATION->lex.current_line; copy_shared_string(frame->variable[var].file, THIS_COMPILATION->lex.current_file);
02a79a2000-09-04Fredrik Hübinette (Hubbe) 
b3c52f2019-08-25Henrik Grubbström (Grubba)  if (frame->generator_local != -1) { frame->variable[var].flags = LOCAL_VAR_IS_USED | LOCAL_VAR_USED_IN_SCOPE;
ff85722021-03-22Henrik Grubbström (Grubba)  } else if (pike_types_le(void_type_string, type, 0, 0)) {
4d889f2008-04-25Henrik Grubbström (Grubba)  /* Don't warn about unused voidable variables. */ frame->variable[var].flags = LOCAL_VAR_IS_USED; } else { frame->variable[var].flags = 0; }
02a79a2000-09-04Fredrik Hübinette (Hubbe) 
97f6282000-03-07Fredrik Hübinette (Hubbe)  frame->current_number_of_locals++;
2c8a262008-01-03Henrik Grubbström (Grubba)  if(frame->current_number_of_locals > frame->max_number_of_locals)
215bed1996-09-28Fredrik Hübinette (Hubbe)  {
2c8a262008-01-03Henrik Grubbström (Grubba)  frame->max_number_of_locals = frame->current_number_of_locals;
215bed1996-09-28Fredrik Hübinette (Hubbe)  }
97f6282000-03-07Fredrik Hübinette (Hubbe) 
2c8a262008-01-03Henrik Grubbström (Grubba)  return var;
215bed1996-09-28Fredrik Hübinette (Hubbe)  } }
97f6282000-03-07Fredrik Hübinette (Hubbe)  /* argument must be a shared string */ /* Note that this function eats a reference to 'type' */ /* If def is nonzero, it also eats a ref to def */ int add_local_name(struct pike_string *str,
3699402001-02-20Henrik Grubbström (Grubba)  struct pike_type *type,
97f6282000-03-07Fredrik Hübinette (Hubbe)  node *def) {
bad5162000-06-23Fredrik Hübinette (Hubbe)  return low_add_local_name(Pike_compiler->compiler_frame,
97f6282000-03-07Fredrik Hübinette (Hubbe)  str, type, def); }
a23d572008-01-07Henrik Grubbström (Grubba) /* Mark local variables declared in a multi-assign or sscanf expression * as used. */
6572be2008-01-05Henrik Grubbström (Grubba) static void mark_lvalues_as_used(node *n)
147cb72008-01-05Henrik Grubbström (Grubba) { while (n && n->token == F_LVALUE_LIST) {
3424a62008-06-12Henrik Grubbström (Grubba)  if (!CAR(n)) { /* Can happen if a variable hasn't been declared. */ } else if (CAR(n)->token == F_ARRAY_LVALUE) {
147cb72008-01-05Henrik Grubbström (Grubba)  mark_lvalues_as_used(CAAR(n)); } else if ((CAR(n)->token == F_LOCAL) && !(CAR(n)->u.integer.b)) {
c4e78f2008-01-05Henrik Grubbström (Grubba)  Pike_compiler->compiler_frame->variable[CAR(n)->u.integer.a].flags |=
147cb72008-01-05Henrik Grubbström (Grubba)  LOCAL_VAR_IS_USED; } n = CDR(n); } }
0080352007-09-16Henrik Grubbström (Grubba) #if 0 /* Note that this function eats a reference to each of * 'type' and 'initializer', but not to 'name'. * Note also that 'initializer' may be NULL. */
30c0612008-06-29Martin Stjernholm static node *add_protected_variable(struct pike_string *name, struct pike_type *type, int depth, node *initializer)
0080352007-09-16Henrik Grubbström (Grubba) { struct compiler_frame *f = Pike_compiler->compiler_frame; int i; int id; node *n = NULL; if (initializer) { /* FIXME: We need to pop levels off local and external variables here. */ } for(i = depth; f && i; i--) { f->lexical_scope |= SCOPE_SCOPED; f = f->previous; } if (!f) { int parent_depth = i; struct program_state *p = Pike_compiler; struct pike_string *tmp_name; while (i--) { if (!p->previous) {
30c0612008-06-29Martin Stjernholm  my_yyerror("Too many levels of protected (%d, max:%d).",
0080352007-09-16Henrik Grubbström (Grubba)  depth, depth - (i+1)); parent_depth -= i+1; break; } p->new_program->flags |= PROGRAM_USES_PARENT; p = p->previous; }
13670c2015-05-25Martin Nilsson 
28b7362008-07-08Henrik Grubbström (Grubba)  tmp_name = get_new_name(name);
0080352007-09-16Henrik Grubbström (Grubba)  id = define_parent_variable(p, tmp_name, type,
30c0612008-06-29Martin Stjernholm  ID_PROTECTED|ID_PRIVATE|ID_INLINE);
0080352007-09-16Henrik Grubbström (Grubba)  free_string(tmp_name); if (id >= 0) { if (def) { p->init_node = mknode(F_COMMA_EXPR, Pike_compiler->init_node, mkcastnode(void_type_string,
a1af302017-03-18Henrik Grubbström (Grubba)  mknode(F_ASSIGN, mkidentifiernode(id), initializer)));
0080352007-09-16Henrik Grubbström (Grubba)  initializer = NULL; } n = mkexternalnode(id, parent_depth); } } else if (depth) { f->lexical_scope|=SCOPE_SCOPE_USED;
28b7362008-07-08Henrik Grubbström (Grubba)  tmp_name = get_new_name(name);
0080352007-09-16Henrik Grubbström (Grubba)  id = low_add_local_name(f, tmp_name, type, NULL); free_string(tmp_name); if(f->min_number_of_locals < id+1) f->min_number_of_locals = id+1; if (initializer) { /* FIXME! */
30c0612008-06-29Martin Stjernholm  yyerror("Initializers not yet supported for protected variables with function scope.");
0080352007-09-16Henrik Grubbström (Grubba)  } n = mklocalnode(id, depth); } id = add_local_name(name, type, n); if (id >= 0) { if (initializer) {
a1af302017-03-18Henrik Grubbström (Grubba)  return mknode(F_ASSIGN, mklocalnode(id,0), initializer);
0080352007-09-16Henrik Grubbström (Grubba)  } return mklocalnode(id, 0); } if (initializer) { free_node(initializer); } return NULL; } #endif /* 0 */
215bed1996-09-28Fredrik Hübinette (Hubbe) int islocal(struct pike_string *str) {
120d842000-11-08Fredrik Hübinette (Hubbe)  return low_islocal(Pike_compiler->compiler_frame, str);
215bed1996-09-28Fredrik Hübinette (Hubbe) }
61e9a01998-01-25Fredrik Hübinette (Hubbe) 
4218011999-01-31Fredrik Hübinette (Hubbe) /* argument must be a shared string */ static node *lexical_islocal(struct pike_string *str) { int e,depth=0;
bad5162000-06-23Fredrik Hübinette (Hubbe)  struct compiler_frame *f=Pike_compiler->compiler_frame;
13670c2015-05-25Martin Nilsson 
4218011999-01-31Fredrik Hübinette (Hubbe)  while(1) { for(e=f->current_number_of_locals-1;e>=0;e--) { if(f->variable[e].name==str) {
bad5162000-06-23Fredrik Hübinette (Hubbe)  struct compiler_frame *q=Pike_compiler->compiler_frame;
164d6b2001-11-29Henrik Grubbström (Grubba) 
2d5f592008-01-03Henrik Grubbström (Grubba)  f->variable[e].flags |= LOCAL_VAR_IS_USED;
13670c2015-05-25Martin Nilsson  while(q!=f)
4218011999-01-31Fredrik Hübinette (Hubbe)  {
8322b62000-05-08Fredrik Hübinette (Hubbe)  q->lexical_scope|=SCOPE_SCOPED;
4218011999-01-31Fredrik Hübinette (Hubbe)  q=q->previous; }
8322b62000-05-08Fredrik Hübinette (Hubbe) 
1faa902006-02-25Henrik Grubbström (Grubba)  if(depth) {
8322b62000-05-08Fredrik Hübinette (Hubbe)  q->lexical_scope|=SCOPE_SCOPE_USED;
1faa902006-02-25Henrik Grubbström (Grubba)  if(q->min_number_of_locals < e+1) q->min_number_of_locals = e+1;
9d52082016-10-30Martin Karlgren  q->variable[e].flags |= LOCAL_VAR_USED_IN_SCOPE;
1faa902006-02-25Henrik Grubbström (Grubba)  }
9ed8de2001-12-06Henrik Grubbström (Grubba)  if(f->variable[e].def) { /*fprintf(stderr, "Found prior definition of \"%s\"\n", str->str); */ return copy_node(f->variable[e].def); }
4218011999-01-31Fredrik Hübinette (Hubbe)  return mklocalnode(e,depth); } }
8322b62000-05-08Fredrik Hübinette (Hubbe)  if(!(f->lexical_scope & SCOPE_LOCAL)) return 0;
4218011999-01-31Fredrik Hübinette (Hubbe)  depth++; f=f->previous; } }
e33ab92008-07-18Henrik Grubbström (Grubba) static node *safe_inc_enum(node *n)
a418ce2001-03-31Henrik Grubbström (Grubba) { JMP_BUF recovery;
eab66a2016-03-13Arne Goedeke  node *ret;
e33ab92008-07-18Henrik Grubbström (Grubba)  STACK_LEVEL_START(0);
a418ce2001-03-31Henrik Grubbström (Grubba) 
e33ab92008-07-18Henrik Grubbström (Grubba)  if (SETJMP(recovery)) {
37338b2003-11-14Martin Stjernholm  handle_compile_exception ("Bad implicit enum value (failed to add 1).");
3601d32002-11-23Martin Stjernholm  push_int(0);
a418ce2001-03-31Henrik Grubbström (Grubba)  } else {
e33ab92008-07-18Henrik Grubbström (Grubba)  if (n->token != F_CONSTANT) Pike_fatal("Bad node to safe_inc_enum().\n"); push_svalue(&n->u.sval);
a418ce2001-03-31Henrik Grubbström (Grubba)  push_int(1); f_add(2); } UNSETJMP(recovery);
3601d32002-11-23Martin Stjernholm  STACK_LEVEL_DONE(1);
e33ab92008-07-18Henrik Grubbström (Grubba)  free_node(n);
eab66a2016-03-13Arne Goedeke  ret = mkconstantsvaluenode(Pike_sp-1);
e33ab92008-07-18Henrik Grubbström (Grubba)  pop_stack();
eab66a2016-03-13Arne Goedeke  return ret;
a418ce2001-03-31Henrik Grubbström (Grubba) }
7f012e2014-11-09Henrik Grubbström (Grubba) static node *find_versioned_identifier(struct pike_string *identifier, int major, int minor) { struct compilation *c = THIS_COMPILATION; int old_major = Pike_compiler->compat_major; int old_minor = Pike_compiler->compat_minor; struct svalue *efun = NULL;
7b3c002018-07-11Henrik Grubbström (Grubba)  node *res;
7f012e2014-11-09Henrik Grubbström (Grubba)  change_compiler_compatibility(major, minor); if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier); copy_shared_string(Pike_compiler->last_identifier, identifier); /* Check predef:: first, and then the modules. */
7b3c002018-07-11Henrik Grubbström (Grubba)  res = NULL;
7f012e2014-11-09Henrik Grubbström (Grubba)  if (TYPEOF(c->default_module) == T_MAPPING) { if ((efun = low_mapping_string_lookup(c->default_module.u.mapping, identifier))) res = mkconstantsvaluenode(efun); } else if (TYPEOF(c->default_module) != T_INT) { JMP_BUF tmp; if (SETJMP (tmp)) { handle_compile_exception ("Couldn't index %d.%d " "default module with \"%S\".", major, minor, identifier); } else { push_svalue(&c->default_module); ref_push_string(identifier); f_index (2); if (!IS_UNDEFINED(Pike_sp - 1)) res = mkconstantsvaluenode(Pike_sp - 1); pop_stack(); } UNSETJMP(tmp); } if (!res && !(res = resolve_identifier(identifier))) { if((Pike_compiler->flags & COMPILATION_FORCE_RESOLVE) ||
bdfe4e2017-12-11Henrik Grubbström (Grubba)  (Pike_compiler->compiler_pass == COMPILER_PASS_LAST)) {
7f012e2014-11-09Henrik Grubbström (Grubba)  my_yyerror("Undefined identifier %d.%d::%S.", major, minor, identifier); }else{ res = mknode(F_UNDEFINED, 0, 0); } } change_compiler_compatibility(old_major, old_minor); return res; }
9036e82001-08-16Martin Stjernholm 
0880972019-03-26Henrik Grubbström (Grubba) static int call_handle_import(void)
9036e82001-08-16Martin Stjernholm {
dbbb402018-11-03Tobias S. Josefowitz  if (safe_apply_low2(Pike_fp->current_object, PC_HANDLE_IMPORT_FUN_NUM + Pike_fp->context->identifier_level, 1, NULL)) {
d3c9c92018-07-12Henrik Grubbström (Grubba)  if ((1 << TYPEOF(Pike_sp[-1])) & (BIT_MAPPING|BIT_OBJECT|BIT_PROGRAM|BIT_ZERO)) { if (SAFE_IS_ZERO(Pike_sp - 1)) { pop_stack(); push_int(0); } if (TYPEOF(Pike_sp[-1]) != T_INT) return 1;
9036e82001-08-16Martin Stjernholm  pop_stack();
0880972019-03-26Henrik Grubbström (Grubba)  my_yyerror("Couldn't find module to import.");
d3c9c92018-07-12Henrik Grubbström (Grubba)  return 0;
9036e82001-08-16Martin Stjernholm  }
d3c9c92018-07-12Henrik Grubbström (Grubba)  my_yyerror("Invalid return value from handle_import: %O", Pike_sp-1); pop_stack(); return 0; } handle_compile_exception ("Error finding module to import"); pop_stack();
9036e82001-08-16Martin Stjernholm  return 0; }
b754192016-01-19Henrik Grubbström (Grubba) /* Set compiler_frame->current_type from the type stack. */
0880972019-03-26Henrik Grubbström (Grubba) static void update_current_type(void)
b754192016-01-19Henrik Grubbström (Grubba) {
e25c3d2021-02-21Henrik Grubbström (Grubba)  if (TEST_COMPAT(8,0) || !(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) { struct pike_type *t = peek_type_stack(); if (!t || (t->type != PIKE_T_AUTO)) { /* Implicit zero */ push_type(PIKE_T_ZERO); push_type(T_OR); } }
b754192016-01-19Henrik Grubbström (Grubba)  if(Pike_compiler->compiler_frame->current_type) free_type(Pike_compiler->compiler_frame->current_type); Pike_compiler->compiler_frame->current_type = compiler_pop_type(); }