e576bb | 2002-10-11 | Martin 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.
*/
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
3c7fe7 | 2015-12-28 | Per Hedbor | | %pure-parser
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | |
|
70c3b1 | 2016-12-14 | Henrik Grubbström (Grubba) | | /* Expect a single shift/reduce conflict (dangling else). */
|
3c0f89 | 2017-12-10 | Henrik Grubbström (Grubba) | | %expect 2
|
70c3b1 | 2016-12-14 | Henrik Grubbström (Grubba) | |
|
fec03b | 2017-07-08 | Henrik Grubbström (Grubba) | | %token TOK_ARROW "->"
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
/*
* Basic value pushing
*/
|
fec03b | 2017-07-08 | Henrik Grubbström (Grubba) | | %token TOK_CONSTANT "constant"
%token TOK_FLOAT "float literal"
%token TOK_STRING "string literal"
%token TOK_NUMBER "integer literal"
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | /*
* These are the predefined functions that can be accessed from Pike.
*/
|
fec03b | 2017-07-08 | Henrik 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"
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | /* This is the end of file marker used by the lexer
* to enable nicer EOF in error handling.
*/
|
fec03b | 2017-07-08 | Henrik 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"
|
c59560 | 2018-09-09 | Henrik Grubbström (Grubba) | | %token TOK_STATIC_ASSERT "_Static_assert"
|
fec03b | 2017-07-08 | Henrik Grubbström (Grubba) | | %token TOK_STRING_ID "string"
%token TOK_SUB_EQ "-="
%token TOK_TYPEDEF "typedef"
%token TOK_TYPEOF "typeof"
|
bfd1d4 | 2019-11-27 | Henrik Grubbström (Grubba) | | %token TOK_UNUSED "__unused__"
|
fec03b | 2017-07-08 | Henrik 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"
|
19582d | 2019-11-02 | Peter Bortas | | %token TOK_SAFE_INDEX "->?"
|
fec03b | 2017-07-08 | Henrik Grubbström (Grubba) | | %token TOK_SAFE_START_INDEX "[?"
|
aab83d | 2019-11-03 | Marcus Comstedt | | %token TOK_SAFE_APPLY "(?"
|
fec03b | 2017-07-08 | Henrik Grubbström (Grubba) | | %token TOK_BITS "bits"
%token TOK_AUTO_ID "auto"
|
39a59c | 2020-11-11 | Henrik Grubbström (Grubba) | | %token TOK_ATOMIC_GET_SET "?="
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
%right '='
%right '?'
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | %left TOK_LOR
%left TOK_LAND
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %left '|'
%left '^'
%left '&'
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | %left TOK_EQ TOK_NE
%left '>' TOK_GE '<' TOK_LE /* nonassoc? */
%left TOK_LSH TOK_RSH
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %left '+' '-'
|
413c8e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | %left '*' '%' '/'
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | %right TOK_NOT '~'
|
a49549 | 2016-11-08 | Henrik Grubbström (Grubba) | | %right TOK_POW
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | %nonassoc TOK_INC TOK_DEC
|
215bed | 1996-09-28 | Fredrik 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"
|
c8feb5 | 2006-02-27 | Martin Stjernholm | | #include "mapping.h"
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | #include "stralloc.h"
#include "las.h"
#include "interpret.h"
#include "program.h"
#include "pike_types.h"
#include "constants.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
bb8a78 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | #include "docode.h"
|
1a26b2 | 2004-12-30 | Henrik Grubbström (Grubba) | | #include "pike_embed.h"
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | #include "opcodes.h"
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | #include "operators.h"
|
65e0e1 | 2019-03-28 | Henrik Grubbström (Grubba) | | #include "builtin_functions.h"
|
96c393 | 2002-08-27 | Henrik Grubbström (Grubba) | | #include "bignum.h"
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | #define YYMAXDEPTH 1000
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | #ifndef YYDEBUG
/* May also be defined by machine.h */
|
189fd0 | 1997-01-28 | Fredrik Hübinette (Hubbe) | | #define YYDEBUG 1
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | #endif /* YYDEBUG */
|
189fd0 | 1997-01-28 | Fredrik Hübinette (Hubbe) | | #endif
|
4492b1 | 2002-01-03 | Henrik Grubbström (Grubba) | | /* Get verbose parse error reporting. */
#define YYERROR_VERBOSE 1
|
c68a29 | 2001-06-10 | Henrik Grubbström (Grubba) | | /* #define LAMBDA_DEBUG 1 */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
94d66b | 2008-05-24 | Henrik Grubbström (Grubba) | | static void yyerror_reserved(const char *keyword);
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | static struct pike_string *get_new_name(struct pike_string *prefix);
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | int add_local_name(struct pike_string *, struct pike_type *, node *);
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | int low_add_local_name(struct compiler_frame *,
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_string *, struct pike_type *, node *);
|
6572be | 2008-01-05 | Henrik Grubbström (Grubba) | | static void mark_lvalues_as_used(node *n);
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | static node *lexical_islocal(struct pike_string *);
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | static node *safe_inc_enum(node *n);
|
7f012e | 2014-11-09 | Henrik Grubbström (Grubba) | | static node *find_versioned_identifier(struct pike_string *identifier,
int major, int minor);
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | static int call_handle_import(void);
static void update_current_type(void);
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
8c6423 | 2000-06-26 | Henrik Grubbström (Grubba) | | static int inherit_depth;
static struct program_state *inherit_state = NULL;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
cd89d7 | 1997-09-10 | Henrik Grubbström (Grubba) | | /*
* Kludge for Bison not using prototypes.
*/
#ifndef __GNUC__
#ifndef __cplusplus
|
d5fa6a | 2002-09-24 | Henrik Grubbström (Grubba) | | static void __yy_memcpy(char *to, YY_FROM_CONST char *from,
YY_COUNT_TYPE count);
|
cd89d7 | 1997-09-10 | Henrik Grubbström (Grubba) | | #endif /* !__cplusplus */
#endif /* !__GNUC__ */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %}
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %union
{
int number;
FLOAT_TYPE fnum;
struct node_s *n;
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | char *str;
|
a99357 | 2002-10-12 | Henrik Grubbström (Grubba) | | void *ptr;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | }
|
4b974c | 1999-02-20 | Henrik Grubbström (Grubba) | | %{
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | /* Need to be included after YYSTYPE is defined. */
|
00dc30 | 2004-03-23 | Martin Stjernholm | | #define INCLUDED_FROM_LANGUAGE_YACC
|
4b974c | 1999-02-20 | Henrik Grubbström (Grubba) | | #include "lex.h"
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | #include "pike_compiler.h"
|
4b974c | 1999-02-20 | Henrik Grubbström (Grubba) | | %}
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | %{
|
7ee380 | 1998-11-10 | Henrik Grubbström (Grubba) | | /* Include <stdio.h> our selves, so that we can do our magic
* without being disturbed... */
#include <stdio.h>
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | int yylex(YYSTYPE *yylval);
|
7ee380 | 1998-11-10 | Henrik Grubbström (Grubba) | | /* Bison is stupid, and tries to optimize for space... */
|
beb25e | 2005-10-14 | Henrik Grubbström (Grubba) | | #ifdef YYBISON
#define short int
#endif /* YYBISON */
|
a99357 | 2002-10-12 | Henrik Grubbström (Grubba) | |
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | %}
|
f76b4c | 2000-05-11 | Henrik 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
|
6e0fce | 2013-05-28 | Per Hedbor | | %type <number> TOK_AUTO_ID
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | %type <number> TOK_SWITCH
%type <number> TOK_VOID_ID
%type <number> TOK_WHILE
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <number> arguments
%type <number> arguments2
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | %type <number> func_args
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | | %type <number> create_arguments
%type <number> create_arguments2
%type <number> create_arg
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <number> assign
%type <number> modifier
%type <number> modifier_list
%type <number> modifiers
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | %type <number> implicit_modifiers
|
8c6423 | 2000-06-26 | Henrik Grubbström (Grubba) | | %type <number> inherit_specifier
|
cbae7e | 2000-03-30 | Henrik Grubbström (Grubba) | | %type <number> function_type_list
%type <number> function_type_list2
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <number> optional_dot_dot_dot
|
cbae7e | 2000-03-30 | Henrik Grubbström (Grubba) | | %type <number> optional_comma
|
6fe35d | 2007-09-14 | Henrik Grubbström (Grubba) | | %type <number> optional_constant
|
d0f734 | 2019-08-22 | Henrik Grubbström (Grubba) | | %type <number> optional_continue
|
1104c6 | 2007-10-08 | Henrik Grubbström (Grubba) | | %type <number> optional_create_arguments
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | %type <number> save_block_level
%type <number> save_locals
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | %type <str> magic_identifiers
%type <str> magic_identifiers1
%type <str> magic_identifiers2
%type <str> magic_identifiers3
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* The following symbols return type information */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | %type <n> number
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | %type <n> number_or_minint
%type <n> number_or_maxint
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | %type <n> cast
|
1d73ef | 1999-11-23 | Henrik Grubbström (Grubba) | | %type <n> soft_cast
|
a83d12 | 2013-11-08 | Henrik Grubbström (Grubba) | | %type <n> real_string_constant
%type <n> real_string_or_identifier
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | %type <n> string_constant
|
a83d12 | 2013-11-08 | Henrik Grubbström (Grubba) | | %type <n> string_or_identifier
|
9aee97 | 2008-05-06 | Henrik Grubbström (Grubba) | | %type <n> string_segment
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | %type <n> string
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | %type <n> TOK_STRING
%type <n> TOK_NUMBER
|
e04ce1 | 2013-12-11 | Per Hedbor | | %type <n> TOK_BITS
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | %type <n> optional_rename_inherit
%type <n> optional_identifier
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | %type <n> implicit_identifier
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | %type <n> TOK_IDENTIFIER
|
32bc32 | 2008-06-18 | Henrik Grubbström (Grubba) | | %type <n> TOK_RESERVED
|
a0af02 | 2006-01-21 | Henrik Grubbström (Grubba) | | %type <n> TOK_VERSION
|
8020bf | 2018-11-05 | Henrik Grubbström (Grubba) | | %type <n> annotation
|
843d2f | 2018-11-06 | Henrik Grubbström (Grubba) | | %type <n> annotation_list
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | %type <n> attribute
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> assoc_pair
|
9b3902 | 2003-03-27 | Martin Stjernholm | | %type <n> line_number_info
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> block
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | %type <n> optional_block
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | %type <n> failsafe_block
|
aab83d | 2019-11-03 | Marcus Comstedt | | %type <n> safe_apply_with_line_info
|
10fe60 | 2003-10-01 | Martin Stjernholm | | %type <n> open_paren_with_line_info
|
aab83d | 2019-11-03 | Marcus Comstedt | | %type <n> open_paren_or_safe_apply_with_line_info
|
bb213c | 1999-12-27 | Henrik Grubbström (Grubba) | | %type <n> close_paren_or_missing
|
10fe60 | 2003-10-01 | Martin Stjernholm | | %type <n> open_bracket_with_line_info
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> block_or_semi
%type <n> break
%type <n> case
%type <n> catch
%type <n> catch_arg
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | %type <n> anon_class
%type <n> named_class
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | %type <n> enum
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | %type <n> enum_value
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | %type <n> safe_comma_expr
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> comma_expr
%type <n> comma_expr2
|
408a1e | 2004-10-30 | Martin Stjernholm | | %type <n> range_bound
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> cond
%type <n> continue
%type <n> default
%type <n> do
|
8020bf | 2018-11-05 | Henrik Grubbström (Grubba) | | %type <n> constant_expr
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | %type <n> safe_expr0
|
615cf5 | 2016-02-02 | Henrik Grubbström (Grubba) | | %type <n> splice_expr
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> expr01
%type <n> expr1
%type <n> expr2
%type <n> expr3 expr0
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | %type <n> apply
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> expr4
|
aea6a4 | 2016-05-09 | Henrik Grubbström (Grubba) | | %type <n> expr5
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> expr_list
%type <n> expr_list2
%type <n> for
%type <n> for_expr
%type <n> foreach
%type <n> gauge
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | %type <n> unqualified_idents
%type <n> qualified_ident
%type <n> qualified_idents
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | %type <n> idents
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | %type <n> labeled_statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> lambda
|
f99cdd | 2016-05-08 | Henrik Grubbström (Grubba) | | %type <n> literal_expr
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> local_name_list
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | %type <n> low_idents
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | %type <n> safe_lvalue
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> lvalue
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> lvalue_list
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | %type <n> low_lvalue_list
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> m_expr_list
%type <n> m_expr_list2
%type <n> new_local_name
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | %type <n> normal_label_statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> optional_else_part
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | %type <n> optional_label
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | %type <n> propagated_enum_value
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> return
%type <n> sscanf
%type <n> statement
%type <n> statements
|
71bde8 | 2001-03-16 | Fredrik Hübinette (Hubbe) | | %type <n> statement_with_semicolon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> switch
%type <n> typeof
%type <n> unused
%type <n> unused2
%type <n> while
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | %type <n> optional_comma_expr
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | %type <n> low_program_ref
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | %type <n> inherit_ref
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | %type <n> local_function
|
3bc6c1 | 2019-09-17 | Henrik Grubbström (Grubba) | | %type <n> local_generator
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | %type <n> magic_identifier
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | %type <n> simple_identifier
|
4cdb80 | 2001-02-23 | Fredrik Hübinette (Hubbe) | | %type <n> foreach_lvalues
%type <n> foreach_optional_lvalue
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | |
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | %type <ptr> start_function
%type <ptr> start_lambda
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %%
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | all: program { YYACCEPT; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | program TOK_LEX_EOF { YYACCEPT; }
/* | error TOK_LEX_EOF { YYABORT; } */
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
9ce6b6 | 2000-09-20 | Henrik Grubbström (Grubba) | | program: program def
| program ';'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | /* empty */
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
a83d12 | 2013-11-08 | Henrik Grubbström (Grubba) | | real_string_or_identifier: TOK_IDENTIFIER
| real_string_constant
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
a83d12 | 2013-11-08 | Henrik Grubbström (Grubba) | | optional_rename_inherit: ':' real_string_or_identifier { $$=$2; }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | ':' bad_identifier { $$=0; }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | ':' error { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | { $$=0; }
;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | |
|
66c236 | 1998-08-29 | Henrik Grubbström (Grubba) | | /* NOTE: This rule pushes a string "name" on the stack in addition
* to resolving the program reference.
*/
|
65e0e1 | 2019-03-28 | Henrik Grubbström (Grubba) | | low_program_ref: safe_expr0
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
65e0e1 | 2019-03-28 | Henrik Grubbström (Grubba) | | node *n = $1;
|
a99357 | 2002-10-12 | Henrik Grubbström (Grubba) | | STACK_LEVEL_START(0);
|
65e0e1 | 2019-03-28 | Henrik 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;
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | }
|
65e0e1 | 2019-03-28 | Henrik 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);
|
cf2ad9 | 2008-06-24 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
|
65e0e1 | 2019-03-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(Pike_sp[-1]) != T_STRING) {
Pike_fatal("Compiler lost track of program name.\n");
}
|
cf2ad9 | 2008-06-24 | Henrik Grubbström (Grubba) | | #endif /* PIKE_DEBUG */
|
a99357 | 2002-10-12 | Henrik Grubbström (Grubba) | |
|
65e0e1 | 2019-03-28 | Henrik Grubbström (Grubba) | | add_ref( $$->name=Pike_sp[-1].u.string );
} else {
$$ = mksvaluenode(Pike_sp-1);
pop_stack();
|
a99357 | 2002-10-12 | Henrik Grubbström (Grubba) | |
|
65e0e1 | 2019-03-28 | Henrik 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();
}
|
8d7bda | 1997-02-10 | Fredrik Hübinette (Hubbe) | | }
|
a99357 | 2002-10-12 | Henrik Grubbström (Grubba) | |
STACK_LEVEL_DONE(1);
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | }
;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
2ebdad | 2004-03-16 | Henrik 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 ';'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (($1 & ID_EXTERN) &&
(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
|
8fd931 | 1999-12-30 | Henrik Grubbström (Grubba) | | yywarning("Extern declared inherit.");
}
|
d16515 | 2008-05-03 | Henrik Grubbström (Grubba) | | if($3)
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
f07758 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | struct pike_string *s=Pike_sp[-1].u.string;
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | if($4) s=$4->u.sval.u.string;
compiler_do_inherit($3,$1,s);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | if($4) free_node($4);
|
a99357 | 2002-10-12 | Henrik Grubbström (Grubba) | | pop_stack();
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | if ($3) free_node($3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | | modifiers TOK_INHERIT inherit_ref error ';'
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | if ($3) free_node($3);
|
48e410 | 2001-12-20 | Martin Stjernholm | | pop_stack();
yyerrok;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | | modifiers TOK_INHERIT inherit_ref error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | if ($3) free_node($3);
|
48e410 | 2001-12-20 | Martin Stjernholm | | pop_stack();
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | | modifiers TOK_INHERIT inherit_ref error '}'
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
2ebdad | 2004-03-16 | Henrik Grubbström (Grubba) | | if ($3) free_node($3);
|
48e410 | 2001-12-20 | Martin Stjernholm | | pop_stack();
yyerror("Missing ';'.");
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | import: TOK_IMPORT constant_expr ';'
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | {
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | resolv_constant($2);
free_node($2);
|
fd0ff8 | 2019-04-28 | Tobias S. Josefowitz | | if (TYPEOF(Pike_sp[-1]) != PIKE_T_STRING || call_handle_import()) {
use_module(Pike_sp-1);
pop_stack();
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | }
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | }
;
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | constant_name: TOK_IDENTIFIER '=' safe_expr0
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
/* This can be made more lenient in the future */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
/* Ugly hack to make sure that $3 is optimized */
|
b5c905 | 2000-08-19 | Henrik Grubbström (Grubba) | | {
int tmp=Pike_compiler->compiler_pass;
$3=mknode(F_COMMA_EXPR,$3,0);
Pike_compiler->compiler_pass=tmp;
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
3a30d7 | 2014-10-05 | Martin Nilsson | | if (Pike_compiler->current_modifiers & ID_EXTERN) {
|
bcf72b | 2008-07-13 | Henrik 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;
|
09afd2 | 2008-06-19 | Henrik Grubbström (Grubba) | | }
|
bcf72b | 2008-07-13 | Henrik 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);
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | } else if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) {
|
bcf72b | 2008-07-13 | Henrik Grubbström (Grubba) | | yyerror("Invalid extern declared constant.");
add_constant($1->u.sval.u.string, &svalue_undefined,
|
019b3d | 2000-07-09 | Henrik Grubbström (Grubba) | | Pike_compiler->current_modifiers & ~ID_EXTERN);
|
bcf72b | 2008-07-13 | Henrik Grubbström (Grubba) | | }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | } else {
|
1adcc9 | 2018-02-14 | Henrik Grubbström (Grubba) | | if(!is_const($3)) {
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
|
325f8b | 2018-02-12 | Henrik Grubbström (Grubba) | | yyerror("Constant definition is not constant.");
|
8b07b3 | 2008-07-13 | Henrik Grubbström (Grubba) | | }
add_constant($1->u.sval.u.string, 0,
|
bcf72b | 2008-07-13 | Henrik Grubbström (Grubba) | | Pike_compiler->current_modifiers & ~ID_EXTERN);
} else {
if(!Pike_compiler->num_parse_error)
|
57cddc | 1998-04-19 | Per Hedbor | | {
|
1adcc9 | 2018-02-14 | Henrik Grubbström (Grubba) | | ptrdiff_t tmp=eval_low($3,1);
|
bcf72b | 2008-07-13 | Henrik Grubbström (Grubba) | | if(tmp < 1)
{
yyerror("Error in constant definition.");
push_undefined();
}else{
|
bd6739 | 2015-10-14 | Martin Nilsson | | pop_n_elems((INT32)(tmp - 1));
|
bcf72b | 2008-07-13 | Henrik Grubbström (Grubba) | | }
} else {
|
f23f06 | 2004-03-12 | Henrik Grubbström (Grubba) | | push_undefined();
|
57cddc | 1998-04-19 | Per Hedbor | | }
|
bcf72b | 2008-07-13 | Henrik Grubbström (Grubba) | | add_constant($1->u.sval.u.string, Pike_sp-1,
Pike_compiler->current_modifiers & ~ID_EXTERN);
pop_stack();
|
c6ae0c | 1996-11-26 | Fredrik Hübinette (Hubbe) | | }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
bcf72b | 2008-07-13 | Henrik Grubbström (Grubba) | | const_def_ok:
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if($3) free_node($3);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | | bad_identifier '=' safe_expr0 { if ($3) free_node($3); }
| error '=' safe_expr0 { if ($3) free_node($3); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | ;
constant_list: constant_name
| constant_list ',' constant_name
;
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | constant: modifiers TOK_CONSTANT constant_list ';' {}
| modifiers TOK_CONSTANT error ';' { yyerrok; }
| modifiers TOK_CONSTANT error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | modifiers TOK_CONSTANT error '}' { yyerror("Missing ';'."); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | ;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | block_or_semi: block
{
|
0b8458 | 2007-10-06 | Henrik Grubbström (Grubba) | | $$ = mknode(F_COMMA_EXPR,$1,mknode(F_RETURN,mkintnode(0),0));
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | | ';' { $$ = NULL; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF { yyerror("Expected ';'."); $$ = NULL; }
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | | error { $$ = NULL; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
10fe60 | 2003-10-01 | Martin Stjernholm | | open_paren_with_line_info: '('
{
/* Used to hold line-number info */
$$ = mkintnode(0);
}
;
|
aab83d | 2019-11-03 | Marcus 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
;
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | close_paren_or_missing: ')'
|
bb213c | 1999-12-27 | Henrik Grubbström (Grubba) | | {
/* Used to hold line-number info */
$$ = mkintnode(0);
}
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | | /* empty */
{
yyerror("Missing ')'.");
|
bb213c | 1999-12-27 | Henrik Grubbström (Grubba) | | /* Used to hold line-number info */
$$ = mkintnode(0);
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | }
;
close_brace_or_missing: '}'
| /* empty */
{
yyerror("Missing '}'.");
}
;
|
d4c3e0 | 2002-05-02 | Henrik Grubbström (Grubba) | | close_brace_or_eof: '}'
| TOK_LEX_EOF
{
yyerror("Missing '}'.");
}
;
|
10fe60 | 2003-10-01 | Martin Stjernholm | | open_bracket_with_line_info: '['
{
/* Used to hold line-number info */
$$ = mkintnode(0);
}
;
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | close_bracket_or_missing: ']'
| /* empty */
{
yyerror("Missing ']'.");
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
ab6b78 | 2016-05-07 | Henrik 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
|
acabf1 | 2016-01-09 | Henrik Grubbström (Grubba) | | *
* compiler_frame->current_type
*
|
ab6b78 | 2016-05-07 | Henrik 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.
|
acabf1 | 2016-01-09 | Henrik Grubbström (Grubba) | | */
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | start_function: /* empty */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
8322b6 | 2000-05-08 | Fredrik Hübinette (Hubbe) | | push_compiler_frame(SCOPE_LOCAL);
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | |
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(!Pike_compiler->compiler_frame->previous ||
!Pike_compiler->compiler_frame->previous->current_type)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | yyerror("Internal compiler error (start_function).");
|
ab6b78 | 2016-05-07 | Henrik Grubbström (Grubba) | | copy_pike_type(Pike_compiler->compiler_frame->current_return_type,
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | mixed_type_string);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }else{
|
ab6b78 | 2016-05-07 | Henrik Grubbström (Grubba) | | copy_pike_type(Pike_compiler->compiler_frame->current_return_type,
Pike_compiler->compiler_frame->previous->current_type);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | |
$$ = Pike_compiler->compiler_frame;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
3ec3df | 1999-12-16 | Henrik Grubbström (Grubba) | | ;
|
6fe35d | 2007-09-14 | Henrik Grubbström (Grubba) | | optional_constant: /* empty */
{
$$ = OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT;
}
| TOK_CONSTANT
{
$$ = 0;
}
;
|
e17b7b | 2016-01-16 | Henrik Grubbström (Grubba) | | def: modifiers optional_attributes simple_type optional_constant
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | TOK_IDENTIFIER start_function
|
0ad650 | 2012-10-02 | Per Hedbor | | '('
|
1e9a88 | 2007-10-05 | Henrik 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");
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if ($5->u.sval.u.string == create_string) {
|
1e9a88 | 2007-10-05 | Henrik 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);
|
1104c6 | 2007-10-08 | Henrik Grubbström (Grubba) | | add_local_name(empty_pike_string, id->type, 0);
|
1686e2 | 2008-06-25 | Henrik Grubbström (Grubba) | | /* Note: add_local_name() above will return e. */
Pike_compiler->compiler_frame->variable[e].flags |=
LOCAL_VAR_IS_USED;
|
1e9a88 | 2007-10-05 | Henrik 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);
|
1104c6 | 2007-10-08 | Henrik Grubbström (Grubba) | | add_local_name(empty_pike_string, id->type, 0);
|
1686e2 | 2008-06-25 | Henrik Grubbström (Grubba) | | /* Note: add_local_name() above will return e. */
Pike_compiler->compiler_frame->variable[e].flags |=
LOCAL_VAR_IS_USED;
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | }
}
$<number>$ = e;
}
}
}
arguments close_paren_or_missing
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
int e;
|
6fe35d | 2007-09-14 | Henrik Grubbström (Grubba) | |
/* Adjust opt_flags in case we've got an optional_constant. */
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->opt_flags = $4;
|
6fe35d | 2007-09-14 | Henrik Grubbström (Grubba) | |
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | /* construct the function type */
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->current_return_type);
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
ba0003 | 2019-08-22 | Henrik Grubbström (Grubba) | | if ($1 & ID_GENERATOR) {
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | /* Adjust the type to be a function that returns
|
e01eb9 | 2019-09-10 | Henrik Grubbström (Grubba) | | * a function(mixed|void, function(mixed|void...:void)|void:X).
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | */
push_type(T_VOID);
push_type(T_MANY);
|
e01eb9 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_VOID);
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_VOID);
|
ba0003 | 2019-08-22 | Henrik Grubbström (Grubba) | | push_type(T_VOID);
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_MIXED);
push_type(T_OR);
|
ba0003 | 2019-08-22 | Henrik Grubbström (Grubba) | | push_type(T_MANY);
|
e01eb9 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_OR);
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_FUNCTION);
push_type(T_VOID);
push_type(T_MIXED);
push_type(T_OR);
push_type(T_FUNCTION);
|
ba0003 | 2019-08-22 | Henrik Grubbström (Grubba) | |
/* Entry point variable. */
add_ref(int_type_string);
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->generator_local =
add_local_name(empty_pike_string, int_type_string, 0);
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | |
|
779ebd | 2019-08-29 | Henrik Grubbström (Grubba) | | /* Stack contents to restore. */
add_ref(array_type_string);
add_local_name(empty_pike_string, array_type_string, 0);
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | |
|
9e5935 | 2019-09-10 | Henrik 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);
|
b3c52f | 2019-08-25 | Henrik 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;
|
ba0003 | 2019-08-22 | Henrik Grubbström (Grubba) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | e = $<number>8 + $9 - 1;
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | if(Pike_compiler->varargs &&
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | (!$<number>8 || (Pike_compiler->num_create_args >= 0)))
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | e--;
|
5b368e | 2001-03-31 | Henrik Grubbström (Grubba) | | pop_type_stack(T_ARRAY);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }else{
push_type(T_VOID);
}
push_type(T_MANY);
for(; e>=0; e--)
{
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
|
dfed93 | 2001-03-03 | Henrik Grubbström (Grubba) | | push_type(T_FUNCTION);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | |
|
a2af98 | 2014-03-01 | Henrik Grubbström (Grubba) | | if (Pike_compiler->current_attributes) {
node *n = Pike_compiler->current_attributes;
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | while (n) {
push_type_attribute(CDR(n)->u.sval.u.string);
n = CAR(n);
}
}
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *s=compiler_pop_type();
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | int i = isidentifier($5->u.sval.u.string);
|
be57ea | 2000-07-14 | Henrik Grubbström (Grubba) | |
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass != COMPILER_PASS_FIRST) {
|
28c83a | 2013-05-26 | Henrik Grubbström (Grubba) | | if (i < 0) {
|
2c448d | 2004-11-05 | Henrik Grubbström (Grubba) | | my_yyerror("Identifier %S lost after first pass.",
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $5->u.sval.u.string);
|
be57ea | 2000-07-14 | Henrik Grubbström (Grubba) | | }
}
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | $<n>$ = mktypenode(s);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(s);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | }
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
be57ea | 2000-07-14 | Henrik Grubbström (Grubba) | |
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | /* if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
6fd517 | 2000-04-25 | Fredrik Hübinette (Hubbe) | | /* FIXME:
* set current_function_number for local functions as well
*/
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->compiler_frame->current_function_number=
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | define_function($5->u.sval.u.string,
|
0b8458 | 2007-10-06 | Henrik Grubbström (Grubba) | | $<n>$->u.sval.u.type,
|
6fd517 | 2000-04-25 | Fredrik Hübinette (Hubbe) | | $1 & (~ID_EXTERN),
|
3116ce | 2002-11-22 | Henrik Grubbström (Grubba) | | IDENTIFIER_PIKE_FUNCTION |
(Pike_compiler->varargs?IDENTIFIER_VARARGS:0),
|
1ef557 | 2000-08-30 | Henrik Grubbström (Grubba) | | 0,
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | $4);
|
be57ea | 2000-07-14 | Henrik Grubbström (Grubba) | |
|
3116ce | 2002-11-22 | Henrik Grubbström (Grubba) | | Pike_compiler->varargs=0;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
block_or_semi
{
int e;
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if($12)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | | int f;
|
b9188f | 1999-12-13 | Henrik Grubbström (Grubba) | | node *check_args = NULL;
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | struct compilation *c = THIS_COMPILATION;
struct pike_string *save_file = c->lex.current_file;
int save_line = c->lex.current_line;
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | int num_required_args = 0;
|
1ef557 | 2000-08-30 | Henrik Grubbström (Grubba) | | struct identifier *i;
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | c->lex.current_file = $5->current_file;
c->lex.current_line = $5->line_number;
|
b9188f | 1999-12-13 | Henrik Grubbström (Grubba) | |
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (($1 & ID_EXTERN) &&
(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
|
8fd931 | 1999-12-30 | Henrik Grubbström (Grubba) | | yywarning("Extern declared function definition.");
}
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | | if ($1 & ID_GENERATOR) {
struct pike_type *generator_type;
|
779ebd | 2019-08-29 | Henrik Grubbström (Grubba) | | int generator_stack_local;
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | |
ref_push_string($5->u.sval.u.string);
push_constant_text("\0generator");
|
1f977e | 2019-08-26 | Henrik Grubbström (Grubba) | | f_add(2);
|
b3c52f | 2019-08-25 | Henrik 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);
}
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | |
/* Adjust the type to be a function that returns
|
e01eb9 | 2019-09-10 | Henrik Grubbström (Grubba) | | * a function(mixed|void, function(mixed|void...:void)|void:X).
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | */
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | | push_type(T_VOID);
push_type(T_MANY);
|
e01eb9 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_VOID);
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_VOID);
push_type(T_VOID);
push_type(T_MIXED);
push_type(T_OR);
push_type(T_MANY);
|
e01eb9 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_OR);
|
9e5935 | 2019-09-10 | Henrik Grubbström (Grubba) | | push_type(T_FUNCTION);
push_type(T_VOID);
push_type(T_MIXED);
push_type(T_OR);
push_type(T_FUNCTION);
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | | generator_type = compiler_pop_type();
f = dooptcode(Pike_sp[-1].u.string, $12, generator_type,
|
ece519 | 2019-09-10 | Henrik Grubbström (Grubba) | | ID_INLINE|ID_PROTECTED|ID_PRIVATE|ID_USED);
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | | pop_stack();
|
779ebd | 2019-08-29 | Henrik Grubbström (Grubba) | | generator_stack_local =
Pike_compiler->compiler_frame->generator_local + 1;
|
b3c52f | 2019-08-25 | Henrik 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;
|
779ebd | 2019-08-29 | Henrik 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));
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | for(e=0; e<$<number>8+$9; e++)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if((e >= $<number>8) &&
|
1104c6 | 2007-10-08 | Henrik Grubbström (Grubba) | | (!Pike_compiler->compiler_frame->variable[e].name ||
!Pike_compiler->compiler_frame->variable[e].name->len))
|
b9188f | 1999-12-13 | Henrik Grubbström (Grubba) | | {
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | my_yyerror("Missing name for argument %d.", e - $<number>8);
|
b9188f | 1999-12-13 | Henrik Grubbström (Grubba) | | } else {
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | /* FIXME: Should probably use some other flag. */
if ((runtime_options & RUNTIME_CHECK_TYPES) &&
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_frame->variable[e].type !=
mixed_type_string)) {
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | node *local_node;
/* fprintf(stderr, "Creating soft cast node for local #%d\n", e);*/
|
faa323 | 2013-02-19 | Henrik Grubbström (Grubba) | | local_node = mkcastnode(mixed_type_string, mklocalnode(e, 0));
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | |
|
faa323 | 2013-02-19 | Henrik Grubbström (Grubba) | | /* NOTE: The cast to mixed above is needed to avoid generating
* compilation errors, as well as avoiding optimizations
* in mksoftcastnode().
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | */
check_args =
mknode(F_COMMA_EXPR, check_args,
mksoftcastnode(Pike_compiler->compiler_frame->variable[e].type,
local_node));
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
b9188f | 1999-12-13 | Henrik Grubbström (Grubba) | | }
}
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if ($<number>8) {
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | /* Hook in the initializers for the create arguments. */
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | for (e = $<number>8; e--;) {
$12 = mknode(F_COMMA_EXPR,
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | mknode(F_POP_VALUE,
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | mknode(F_ASSIGN, mkidentifiernode(e),
mklocalnode(e, 0)), NULL),
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $12);
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | }
}
|
587c6a | 2001-06-30 | Martin Stjernholm | | {
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | int l = $12->line_number;
struct pike_string *f = $12->current_file;
|
587c6a | 2001-06-30 | Martin Stjernholm | | if (check_args) {
/* Prepend the arg checking code. */
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $12 = mknode(F_COMMA_EXPR, mknode(F_POP_VALUE, check_args, NULL), $12);
|
587c6a | 2001-06-30 | Martin Stjernholm | | }
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | c->lex.current_line = l;
c->lex.current_file = f;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
329cc0 | 1997-02-17 | Fredrik Hübinette (Hubbe) | |
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | f=dooptcode($5->u.sval.u.string, $12, $<n>11->u.sval.u.type, $1);
|
be57ea | 2000-07-14 | Henrik Grubbström (Grubba) | |
|
1ef557 | 2000-08-30 | Henrik Grubbström (Grubba) | | i = ID_FROM_INT(Pike_compiler->new_program, f);
i->opt_flags = Pike_compiler->compiler_frame->opt_flags;
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST &&
|
3c7fe7 | 2015-12-28 | Per Hedbor | | Pike_compiler->compiler_frame->current_return_type->type == PIKE_T_AUTO)
|
6e0fce | 2013-05-28 | Per Hedbor | | {
|
3c7fe7 | 2015-12-28 | Per Hedbor | | /* Change "auto" return type to actual return type. */
push_finished_type(Pike_compiler->compiler_frame->current_return_type->car);
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | e = $<number>8 + $9 - 1;
|
3c7fe7 | 2015-12-28 | Per Hedbor | | if(Pike_compiler->varargs &&
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | (!$<number>8 || (Pike_compiler->num_create_args >= 0)))
|
3c7fe7 | 2015-12-28 | Per 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);
|
6e0fce | 2013-05-28 | Per Hedbor | | }
|
3c7fe7 | 2015-12-28 | Per Hedbor | | }
free_type( i->type );
i->type = compiler_pop_type();
|
6e0fce | 2013-05-28 | Per Hedbor | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
be57ea | 2000-07-14 | Henrik Grubbström (Grubba) | | if(Pike_interpreter.recoveries &&
((Pike_sp - Pike_interpreter.evaluator_stack) <
Pike_interpreter.recoveries->stack_pointer))
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Stack error (underflow)\n");
|
ae9503 | 1999-04-07 | Fredrik Hübinette (Hubbe) | |
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if((Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) &&
|
d4c3e0 | 2002-05-02 | Henrik Grubbström (Grubba) | | (f != Pike_compiler->compiler_frame->current_function_number)) {
fprintf(stderr, "define_function()/do_opt_code() failed for symbol %s\n",
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $5->u.sval.u.string->str);
|
d4c3e0 | 2002-05-02 | Henrik Grubbström (Grubba) | | dump_program_desc(Pike_compiler->new_program);
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("define_function screwed up! %d != %d\n",
|
be57ea | 2000-07-14 | Henrik Grubbström (Grubba) | | f, Pike_compiler->compiler_frame->current_function_number);
|
d4c3e0 | 2002-05-02 | Henrik Grubbström (Grubba) | | }
|
294dc5 | 1997-08-03 | Fredrik Hübinette (Hubbe) | | #endif
|
c3453f | 2001-06-30 | Martin Stjernholm | |
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | c->lex.current_line = save_line;
c->lex.current_file = save_file;
|
b715a9 | 2008-01-04 | Henrik Grubbström (Grubba) | | } else {
/* Prototype; don't warn about unused arguments. */
|
0b7dff | 2008-01-04 | Henrik Grubbström (Grubba) | | for (e = Pike_compiler->compiler_frame->current_number_of_locals; e--;) {
|
b715a9 | 2008-01-04 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->variable[e].flags |= LOCAL_VAR_IS_USED;
}
|
6e0fce | 2013-05-28 | Per Hedbor | | if( Pike_compiler->compiler_frame->current_return_type->type == PIKE_T_AUTO )
yyerror("'auto' return type not allowed for prototypes\n");
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_frame != $6) {
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | | Pike_fatal("Lost track of compiler_frame!\n"
" Got: %p (Expected: %p) Previous: %p\n",
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame, $6,
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->previous);
}
#endif
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_compiler_frame();
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($5);
free_node($10);
free_node($<n>11);
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | }
|
e17b7b | 2016-01-16 | Henrik Grubbström (Grubba) | | | modifiers optional_attributes simple_type
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | optional_constant TOK_IDENTIFIER start_function
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | error
{
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_frame != $6) {
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | | Pike_fatal("Lost track of compiler_frame!\n"
" Got: %p (Expected: %p) Previous: %p\n",
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame, $6,
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->previous);
}
#endif
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | pop_compiler_frame();
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($5);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
e17b7b | 2016-01-16 | Henrik Grubbström (Grubba) | | | modifiers optional_attributes simple_type optional_constant bad_identifier
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
884b6f | 2008-06-17 | Martin Stjernholm | | compiler_discard_type();
|
33b82c | 1999-12-19 | Henrik Grubbström (Grubba) | | }
'(' arguments ')' block_or_semi
{
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if ($10) free_node($10);
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | }
|
e17b7b | 2016-01-16 | Henrik Grubbström (Grubba) | | | modifiers optional_attributes simple_type optional_constant name_list ';'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | inheritance {}
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | | import {}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | constant {}
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | | modifiers named_class { free_node($2); }
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | | modifiers enum { free_node($2); }
|
843d2f | 2018-11-06 | Henrik Grubbström (Grubba) | | | annotation ';'
{
|
02d8da | 2018-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) {
$1 = mknode(F_COMMA_EXPR, $1, NULL);
compiler_add_program_annotations(0, $1);
}
|
843d2f | 2018-11-06 | Henrik Grubbström (Grubba) | | free_node($1);
}
|
906fbd | 2018-11-07 | Henrik Grubbström (Grubba) | | | '@' TOK_CONSTANT ';'
{
Pike_compiler->new_program->flags |= PROGRAM_CONSTANT;
}
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | | typedef {}
|
975c1e | 2018-09-10 | Henrik Grubbström (Grubba) | | | static_assertion expected_semicolon {}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
reset_type_stack();
yyerror("Missing ';'.");
yyerror("Unexpected end of file");
}
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | | error ';'
{
reset_type_stack();
yyerrok;
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | /* if(Pike_compiler->num_parse_error>5) YYACCEPT; */
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | }
|
296836 | 1998-04-14 | Henrik Grubbström (Grubba) | | | error '}'
{
reset_type_stack();
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Missing ';'.");
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | /* yychar = '}'; */ /* Put the '}' back on the input stream */
|
296836 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
|
21b2c9 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | | modifiers
|
0ad650 | 2012-10-02 | Per Hedbor | | '{'
|
21b2c9 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | {
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | $<number>$=THIS_COMPILATION->lex.pragmas;
THIS_COMPILATION->lex.pragmas|=$1;
|
843d2f | 2018-11-06 | Henrik Grubbström (Grubba) | | if (Pike_compiler->current_annotations) {
yywarning("Annotation blocks are not supported.");
}
|
21b2c9 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | }
program
|
d4c3e0 | 2002-05-02 | Henrik Grubbström (Grubba) | | close_brace_or_eof
|
21b2c9 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | {
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | THIS_COMPILATION->lex.pragmas=$<number>3;
|
21b2c9 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
975c1e | 2018-09-10 | Henrik Grubbström (Grubba) | | static_assertion: TOK_STATIC_ASSERT '(' expr0 ',' expr0 ')'
|
c59560 | 2018-09-09 | Henrik Grubbström (Grubba) | | {
Pike_compiler->init_node =
mknode(F_COMMA_EXPR, Pike_compiler->init_node,
mkefuncallnode("_Static_assert",
mknode(F_ARG_LIST, $3, $5)));
}
;
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | optional_dot_dot_dot: TOK_DOT_DOT_DOT { $$=1; }
|
a7c3a4 | 2000-07-10 | Henrik Grubbström (Grubba) | | | TOK_DOT_DOT
{
yyerror("Range indicator ('..') where elipsis ('...') expected.");
$$=1;
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | /* empty */ { $$=0; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | optional_identifier: TOK_IDENTIFIER
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | bad_identifier { $$=0; }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | /* empty */ { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
dd46aa | 2014-08-11 | Per Hedbor | | new_arg_name: full_type optional_dot_dot_dot optional_identifier
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
01e7e5 | 2008-01-03 | Henrik Grubbström (Grubba) | | int i;
|
c3cfe9 | 2000-07-10 | Henrik Grubbström (Grubba) | | if(Pike_compiler->varargs) yyerror("Can't define more arguments after ...");
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | if($2)
{
|
04017d | 2020-01-02 | Henrik Grubbström (Grubba) | | push_unlimited_array_type(T_ARRAY);
|
c3cfe9 | 2000-07-10 | Henrik Grubbström (Grubba) | | Pike_compiler->varargs=1;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(!$3)
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | {
|
de56ec | 2003-02-08 | Martin Stjernholm | | $3=mkstrnode(empty_pike_string);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | }
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
96ab24 | 1998-02-28 | Fredrik Hübinette (Hubbe) | | if($3->u.sval.u.string->len &&
|
fe8061 | 2000-09-05 | Henrik Grubbström (Grubba) | | islocal($3->u.sval.u.string) >= 0)
|
2c448d | 2004-11-05 | Henrik Grubbström (Grubba) | | my_yyerror("Variable %S appears twice in argument list.",
$3->u.sval.u.string);
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
01e7e5 | 2008-01-03 | Henrik Grubbström (Grubba) | | i = add_local_name($3->u.sval.u.string, compiler_pop_type(),0);
|
ceb95a | 2008-06-26 | Henrik Grubbström (Grubba) | | if (i >= 0) {
/* Don't warn about unused arguments. */
|
01e7e5 | 2008-01-03 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->variable[i].flags |= LOCAL_VAR_IS_USED;
}
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
bb213c | 1999-12-27 | Henrik Grubbström (Grubba) | | func_args: '(' arguments close_paren_or_missing
{
free_node($3);
$$=$2;
}
;
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | arguments: /* empty */ optional_comma { $$=0; }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | arguments2 optional_comma
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
arguments2: new_arg_name { $$ = 1; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | arguments2 ',' new_arg_name { $$ = $1 + 1; }
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | | arguments2 ':' new_arg_name
{
yyerror("Unexpected ':' in argument list.");
$$ = $1 + 1;
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
a7c3a4 | 2000-07-10 | Henrik Grubbström (Grubba) | | modifier:
|
0085e4 | 2014-10-05 | Martin Nilsson | | TOK_FINAL_ID { $$ = ID_FINAL | ID_INLINE; }
|
218176 | 2014-08-15 | Martin Nilsson | | | TOK_STATIC {
$$ = ID_PROTECTED;
if( !(THIS_COMPILATION->lex.pragmas & ID_NO_DEPRECATION_WARNINGS) &&
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | !TEST_COMPAT(7, 8) &&
(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) )
|
edd196 | 2014-11-12 | Stephen R. van den Berg | | yywarning("Keyword static is deprecated in favour of 'protected'.");
|
218176 | 2014-08-15 | Martin Nilsson | | }
|
789eee | 2020-03-11 | Henrik Grubbström (Grubba) | | | TOK_EXTERN { $$ = ID_EXTERN | ID_OPTIONAL; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_OPTIONAL { $$ = ID_OPTIONAL; }
|
789eee | 2020-03-11 | Henrik Grubbström (Grubba) | | | TOK_PRIVATE { $$ = ID_PRIVATE | ID_PROTECTED | ID_INLINE; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LOCAL_ID { $$ = ID_INLINE; }
| TOK_PUBLIC { $$ = ID_PUBLIC; }
| TOK_PROTECTED { $$ = ID_PROTECTED; }
| TOK_INLINE { $$ = ID_INLINE; }
|
8f733e | 2000-07-12 | Henrik Grubbström (Grubba) | | | TOK_VARIANT { $$ = ID_VARIANT; }
|
91f411 | 2016-11-05 | Henrik Grubbström (Grubba) | | | TOK_WEAK { $$ = ID_WEAK; }
|
ba0003 | 2019-08-22 | Henrik Grubbström (Grubba) | | | TOK_CONTINUE { $$ = ID_GENERATOR; }
|
bfd1d4 | 2019-11-27 | Henrik Grubbström (Grubba) | | | TOK_UNUSED { $$ = ID_USED; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | magic_identifiers1:
|
0085e4 | 2014-10-05 | Martin Nilsson | | TOK_FINAL_ID { $$ = "final"; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_STATIC { $$ = "static"; }
|
a7c3a4 | 2000-07-10 | Henrik Grubbström (Grubba) | | | TOK_EXTERN { $$ = "extern"; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PRIVATE { $$ = "private"; }
| TOK_LOCAL_ID { $$ = "local"; }
| TOK_PUBLIC { $$ = "public"; }
| TOK_PROTECTED { $$ = "protected"; }
| TOK_INLINE { $$ = "inline"; }
| TOK_OPTIONAL { $$ = "optional"; }
|
8f733e | 2000-07-12 | Henrik Grubbström (Grubba) | | | TOK_VARIANT { $$ = "variant"; }
|
fa47dd | 2016-09-27 | Henrik Grubbström (Grubba) | | | TOK_WEAK { $$ = "__weak__"; }
|
bfd1d4 | 2019-11-27 | Henrik Grubbström (Grubba) | | | TOK_UNUSED { $$ = "__unused__"; }
|
c59560 | 2018-09-09 | Henrik Grubbström (Grubba) | | | TOK_STATIC_ASSERT { $$ = "_Static_assert"; }
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | ;
magic_identifiers2:
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | TOK_VOID_ID { $$ = "void"; }
| TOK_MIXED_ID { $$ = "mixed"; }
| TOK_ARRAY_ID { $$ = "array"; }
|
d31508 | 2008-03-27 | Henrik Grubbström (Grubba) | | | TOK_ATTRIBUTE_ID { $$ = "__attribute__"; }
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | | TOK_DEPRECATED_ID { $$ = "__deprecated__"; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_MAPPING_ID { $$ = "mapping"; }
| TOK_MULTISET_ID { $$ = "multiset"; }
| TOK_OBJECT_ID { $$ = "object"; }
| TOK_FUNCTION_ID { $$ = "function"; }
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | | TOK_FUNCTION_NAME { $$ = "__func__"; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PROGRAM_ID { $$ = "program"; }
| TOK_STRING_ID { $$ = "string"; }
| TOK_FLOAT_ID { $$ = "float"; }
| TOK_INT_ID { $$ = "int"; }
|
76e7f9 | 2001-03-18 | Henrik Grubbström (Grubba) | | | TOK_ENUM { $$ = "enum"; }
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | | TOK_TYPEDEF { $$ = "typedef"; }
|
6e0fce | 2013-05-28 | Per Hedbor | | /* | TOK_AUTO_ID { $$ = "auto"; } */
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | ;
magic_identifiers3:
|
f76b4c | 2000-05-11 | Henrik 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"; }
|
1977e2 | 2002-08-18 | Martin Stjernholm | | | TOK_GLOBAL { $$ = "global"; }
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | ;
|
21b2c9 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | magic_identifiers: magic_identifiers1 | magic_identifiers2 | magic_identifiers3 ;
|
32bc32 | 2008-06-18 | Henrik Grubbström (Grubba) | | magic_identifier: TOK_IDENTIFIER | TOK_RESERVED
|
21b2c9 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | | magic_identifiers
|
315aa8 | 1999-12-17 | Fredrik Hübinette (Hubbe) | | {
struct pike_string *tmp=make_shared_string($1);
$$=mkstrnode(tmp);
free_string(tmp);
}
;
|
8020bf | 2018-11-05 | Henrik Grubbström (Grubba) | | annotation: '@' constant_expr
{
$$ = $2;
}
;
|
843d2f | 2018-11-06 | Henrik 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);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
modifier_list: /* empty */ { $$ = 0; }
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | | modifier_list modifier { $$ = $1 | $2; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
316e7d | 2008-04-04 | Henrik 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);
}
;
|
a2af98 | 2014-03-01 | Henrik 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);
}
}
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | ;
|
10fe60 | 2003-10-01 | Martin Stjernholm | | cast: open_paren_with_line_info type ')'
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *s = compiler_pop_type();
$$ = mktypenode(s);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(s);
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $1);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($1);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | }
|
2e4e45 | 1997-02-13 | Fredrik Hübinette (Hubbe) | | ;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
|
10fe60 | 2003-10-01 | Martin Stjernholm | | soft_cast: open_bracket_with_line_info type ']'
|
1d73ef | 1999-11-23 | Henrik Grubbström (Grubba) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *s = compiler_pop_type();
$$ = mktypenode(s);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(s);
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $1);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($1);
|
1d73ef | 1999-11-23 | Henrik Grubbström (Grubba) | | }
;
|
b59ab2 | 2016-01-10 | Henrik Grubbström (Grubba) | | /* Either a basic_type-prefixed expression, or an identifier type.
* Value on type stack.
*/
|
dd46aa | 2014-08-11 | Per Hedbor | | type2: type | identifier_type ;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
|
e17b7b | 2016-01-16 | Henrik Grubbström (Grubba) | | /* Full type expression.
* Value moved to compiler_frame->current_type.
*/
|
dd46aa | 2014-08-11 | Per Hedbor | | simple_type: full_type
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | {
|
b75419 | 2016-01-19 | Henrik Grubbström (Grubba) | | update_current_type();
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | }
;
|
58949e | 2016-01-15 | Henrik Grubbström (Grubba) | | /* Basic_type-prefixed expression or an identifier type.
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | * Value moved to compiler_frame->current_type.
|
58949e | 2016-01-15 | Henrik Grubbström (Grubba) | | */
simple_type2: type2
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | {
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | update_current_type();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b59ab2 | 2016-01-10 | Henrik Grubbström (Grubba) | | /* Full type expression. Value on type stack.
* Typically used in contexts where there must be a type,
* and expressions are invalid.
*/
|
dd46aa | 2014-08-11 | Per Hedbor | | full_type: full_type '|' type3 { push_type(T_OR); }
| type3
|
122021 | 2001-05-08 | Henrik Grubbström (Grubba) | | ;
|
b59ab2 | 2016-01-10 | Henrik Grubbström (Grubba) | | /* Basic_type-prefixed expression. Value on type stack.
* Typically used in contexts where expressions are valid.
*/
|
dd46aa | 2014-08-11 | Per Hedbor | | type: type '|' type3 { push_type(T_OR); }
|
0ad650 | 2012-10-02 | Per Hedbor | | | basic_type
|
122021 | 2001-05-08 | Henrik Grubbström (Grubba) | | ;
|
b59ab2 | 2016-01-10 | Henrik Grubbström (Grubba) | | /* Either a basic_type or an identifier type. Value on type stack. */
|
dd46aa | 2014-08-11 | Per Hedbor | | type3: basic_type | identifier_type ;
|
122021 | 2001-05-08 | Henrik Grubbström (Grubba) | |
|
b59ab2 | 2016-01-10 | Henrik Grubbström (Grubba) | | /* Literal type. Value on type stack. */
|
122021 | 2001-05-08 | Henrik 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); }
|
ec9bc1 | 2016-05-01 | Henrik Grubbström (Grubba) | | | TOK_AUTO_ID { push_type(T_ZERO); push_type(PIKE_T_AUTO); }
|
157fc6 | 2007-03-03 | Henrik Grubbström (Grubba) | | | TOK_STRING_ID opt_string_width {}
|
122021 | 2001-05-08 | Henrik Grubbström (Grubba) | | | TOK_INT_ID opt_int_range {}
| TOK_MAPPING_ID opt_mapping_type {}
| TOK_FUNCTION_ID opt_function_type {}
|
0e2ad4 | 2017-11-24 | Henrik Grubbström (Grubba) | | | TOK_OBJECT_ID opt_program_type {}
|
651326 | 2014-02-16 | Henrik Grubbström (Grubba) | | | TOK_PROGRAM_ID opt_program_type { push_type(T_PROGRAM); }
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | | TOK_ARRAY_ID opt_array_type {}
| TOK_MULTISET_ID opt_multiset_type { push_type(T_MULTISET); }
|
dd46aa | 2014-08-11 | Per Hedbor | | | TOK_ATTRIBUTE_ID '(' string_constant ',' full_type ')'
|
d31508 | 2008-03-27 | Henrik 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);
}
|
dd46aa | 2014-08-11 | Per Hedbor | | | TOK_DEPRECATED_ID '(' full_type ')'
|
316e7d | 2008-04-04 | Henrik 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);
}
|
122021 | 2001-05-08 | Henrik Grubbström (Grubba) | | ;
|
3c0f89 | 2017-12-10 | Henrik Grubbström (Grubba) | | /* Identifier type. Value on type stack.
*
* NB: Introduces shift-reduce conflict on TOK_LOCAL_ID.
*/
identifier_type: idents
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
17f4dc | 2014-05-04 | Henrik Grubbström (Grubba) | | if ($1) {
fix_type_field($1);
|
ff8572 | 2021-03-22 | Henrik Grubbström (Grubba) | | if (!pike_types_le($1->type, typeable_type_string, 0, 0) &&
|
17f4dc | 2014-05-04 | Henrik 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.");
}
|
38f931 | 2014-05-03 | Henrik Grubbström (Grubba) | | }
|
94d5aa | 2017-11-25 | Henrik Grubbström (Grubba) | | resolv_type($1);
|
7a08f3 | 2000-01-25 | Henrik Grubbström (Grubba) | |
|
f62c41 | 2001-03-05 | Henrik Grubbström (Grubba) | | /* Attempt to name the type. */
if (Pike_compiler->last_identifier) {
push_type_name(Pike_compiler->last_identifier);
}
|
cb1f78 | 2017-11-26 | Henrik Grubbström (Grubba) | |
|
7a08f3 | 2000-01-25 | Henrik Grubbström (Grubba) | | free_node($1);
}
|
960a87 | 2016-05-14 | Henrik Grubbström (Grubba) | | | typeof
{
|
e9fbb7 | 2018-05-21 | Henrik Grubbström (Grubba) | | if ($1 && CAR($1)) {
fix_type_field($1);
push_finished_type(CAR($1)->type);
|
960a87 | 2016-05-14 | Henrik Grubbström (Grubba) | | free_node($1);
} else {
push_finished_type(mixed_type_string);
}
}
|
7a08f3 | 2000-01-25 | Henrik Grubbström (Grubba) | | ;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | number: TOK_NUMBER
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | '-' TOK_NUMBER
|
3dc856 | 1999-12-30 | Henrik Grubbström (Grubba) | | {
#ifdef PIKE_DEBUG
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (($2->token != F_CONSTANT) || (TYPEOF($2->u.sval) != T_INT)) {
|
5aad93 | 2002-08-15 | Marcus Comstedt | | Pike_fatal("Unexpected number in negative int-range.\n");
|
3dc856 | 1999-12-30 | Henrik Grubbström (Grubba) | | }
#endif /* PIKE_DEBUG */
$$ = mkintnode(-($2->u.sval.u.integer));
free_node($2);
}
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | | ;
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | number_or_maxint: /* Empty */
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | | {
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | $$ = mkintnode(MAX_INT_TYPE);
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | | }
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | | number;
number_or_minint: /* Empty */
|
3dc856 | 1999-12-30 | Henrik Grubbström (Grubba) | | {
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | $$ = mkintnode(MIN_INT_TYPE);
|
3dc856 | 1999-12-30 | Henrik Grubbström (Grubba) | | }
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | | number;
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | |
|
a7c3a4 | 2000-07-10 | Henrik Grubbström (Grubba) | | expected_dot_dot: TOK_DOT_DOT
| TOK_DOT_DOT_DOT
{
yyerror("Elipsis ('...') where range indicator ('..') expected.");
}
;
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | safe_int_range_type: TOK_BITS
|
e04ce1 | 2013-12-11 | Per Hedbor | | {
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | push_int_type( 0, (1<<$1->u.sval.u.integer)-1 );
free_node( $1 );
|
e04ce1 | 2013-12-11 | Per Hedbor | | }
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | | number_or_minint expected_dot_dot number_or_maxint
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | | {
|
69aa4b | 2003-01-26 | Mirar (Pontus Hagland) | | INT_TYPE min = MIN_INT_TYPE;
INT_TYPE max = MAX_INT_TYPE;
|
361142 | 2001-02-20 | Henrik Grubbström (Grubba) | |
|
1bcfb7 | 2020-01-09 | Henrik 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)) {
|
96c393 | 2002-08-27 | Henrik Grubbström (Grubba) | | push_int(0);
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | if (is_lt(&$3->u.sval, Pike_sp-1)) {
|
69aa4b | 2003-01-26 | Mirar (Pontus Hagland) | | max = MIN_INT_TYPE;
|
96c393 | 2002-08-27 | Henrik Grubbström (Grubba) | | }
pop_stack();
}
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | }
|
1bcfb7 | 2020-01-09 | Henrik 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)) {
|
96c393 | 2002-08-27 | Henrik Grubbström (Grubba) | | push_int(0);
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | if (is_lt(Pike_sp-1, &$1->u.sval)) {
|
69aa4b | 2003-01-26 | Mirar (Pontus Hagland) | | min = MAX_INT_TYPE;
|
96c393 | 2002-08-27 | Henrik Grubbström (Grubba) | | }
pop_stack();
}
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | }
|
361142 | 2001-02-20 | Henrik Grubbström (Grubba) | | push_int_type(min, max);
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | free_node($1);
free_node($3);
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | | number
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | {
INT_TYPE val = MAX_INT_TYPE;
|
1bcfb7 | 2020-01-09 | Henrik 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)) {
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | push_int(0);
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | if (is_lt(&$1->u.sval, Pike_sp-1)) {
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | val = MIN_INT_TYPE;
}
pop_stack();
}
}
push_int_type(val, val);
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | free_node($1);
|
b87869 | 2019-12-21 | Henrik Grubbström (Grubba) | | }
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | | error
|
157fc6 | 2007-03-03 | Henrik Grubbström (Grubba) | | {
|
4e6c08 | 2007-05-02 | Henrik Grubbström (Grubba) | | push_int_type(MIN_INT32, MAX_INT32);
yyerror("Expected integer range.");
|
157fc6 | 2007-03-03 | Henrik Grubbström (Grubba) | | }
|
4e6c08 | 2007-05-02 | Henrik Grubbström (Grubba) | | ;
|
157fc6 | 2007-03-03 | Henrik Grubbström (Grubba) | |
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | opt_int_range: /* Empty */
{
push_int_type(MIN_INT_TYPE, MAX_INT_TYPE);
}
| '(' safe_int_range_type ')'
;
|
4e6c08 | 2007-05-02 | Henrik Grubbström (Grubba) | | opt_string_width: opt_int_range
|
1bcfb7 | 2020-01-09 | Henrik 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 ')'
|
157fc6 | 2007-03-03 | Henrik Grubbström (Grubba) | | {
|
04017d | 2020-01-02 | Henrik Grubbström (Grubba) | | push_unlimited_array_type(T_STRING);
|
157fc6 | 2007-03-03 | Henrik Grubbström (Grubba) | | }
;
|
651326 | 2014-02-16 | Henrik Grubbström (Grubba) | | opt_program_type: /* Empty */ { push_object_type(0, 0); }
|
dd46aa | 2014-08-11 | Per Hedbor | | | '(' full_type ')'
|
8e3871 | 2017-11-27 | Henrik Grubbström (Grubba) | | | '(' string_constant ')'
{
resolv_type($2);
|
b6f16a | 2017-11-27 | Stephen R. van den Berg | | push_type_name($2->u.sval.u.string);
|
8e3871 | 2017-11-27 | Henrik Grubbström (Grubba) | | free_node($2);
}
|
651326 | 2014-02-16 | Henrik Grubbström (Grubba) | | | '(' error ')'
{
push_object_type(0, 0);
yyerror("Invalid program subtype.");
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | opt_function_type: '('
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
type_stack_mark();
}
function_type_list optional_dot_dot_dot ':'
{
|
0aa4ba | 2001-02-25 | Henrik Grubbström (Grubba) | | /* Add the many type if there is none. */
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | if ($4)
{
|
0aa4ba | 2001-02-25 | Henrik Grubbström (Grubba) | | if (!$3) {
|
7e71da | 2000-03-30 | Henrik Grubbström (Grubba) | | /* function_type_list ends with a comma, or is empty.
* FIXME: Should this be a syntax error or not?
*/
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) {
|
6deabd | 2000-03-30 | Henrik Grubbström (Grubba) | | yyerror("Missing type before ... .");
|
85fb3d | 2000-03-30 | Henrik Grubbström (Grubba) | | }
|
7e71da | 2000-03-30 | Henrik Grubbström (Grubba) | | push_type(T_MIXED);
|
cbae7e | 2000-03-30 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }else{
push_type(T_VOID);
}
}
|
dd46aa | 2014-08-11 | Per Hedbor | | full_type ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
92aeb1 | 2001-02-26 | Henrik Grubbström (Grubba) | | push_reverse_type(T_MANY);
Pike_compiler->pike_type_mark_stackp--;
|
dfed93 | 2001-03-03 | Henrik Grubbström (Grubba) | | while (*Pike_compiler->pike_type_mark_stackp+1 <
|
92aeb1 | 2001-02-26 | Henrik Grubbström (Grubba) | | Pike_compiler->type_stackp) {
push_reverse_type(T_FUNCTION);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
| /* empty */
{
push_type(T_MIXED);
|
327c05 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | push_type(T_VOID);
push_type(T_OR);
|
2401c7 | 2000-01-03 | Martin Stjernholm | | push_type(T_ZERO);
|
327c05 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | push_type(T_VOID);
push_type(T_OR);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | push_type(T_MANY);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
cbae7e | 2000-03-30 | Henrik Grubbström (Grubba) | | function_type_list: /* Empty */ optional_comma { $$=0; }
| function_type_list2 optional_comma { $$=!$2; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
dd46aa | 2014-08-11 | Per Hedbor | | function_type_list2: full_type { $$=1; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | function_type_list2 ','
{
}
|
dd46aa | 2014-08-11 | Per Hedbor | | full_type
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
1bcfb7 | 2020-01-09 | Henrik Grubbström (Grubba) | | opt_multiset_type: '(' full_type ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | { push_type(T_MIXED); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
1bcfb7 | 2020-01-09 | Henrik 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); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | opt_mapping_type: '('
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
dd46aa | 2014-08-11 | Per Hedbor | | full_type ':'
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
dd46aa | 2014-08-11 | Per Hedbor | | full_type
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
92aeb1 | 2001-02-26 | Henrik Grubbström (Grubba) | | push_reverse_type(T_MAPPING);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
')'
|
0ad650 | 2012-10-02 | Per Hedbor | | | /* empty */
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
push_type(T_MIXED);
push_type(T_MIXED);
|
92aeb1 | 2001-02-26 | Henrik Grubbström (Grubba) | | push_type(T_MAPPING);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
name_list: new_name
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | name_list ',' new_name
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | new_name: TOK_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *type;
|
a2af98 | 2014-03-01 | Henrik Grubbström (Grubba) | | node *n;
|
d39157 | 2021-02-22 | Henrik Grubbström (Grubba) | |
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->current_type);
|
d39157 | 2021-02-22 | Henrik 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,
|
ff8572 | 2021-03-22 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->current_type, 0, 0)) {
|
d39157 | 2021-02-22 | Henrik 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);
}
}
|
a2af98 | 2014-03-01 | Henrik Grubbström (Grubba) | | n = Pike_compiler->current_attributes;
while(n) {
push_type_attribute(CDR(n)->u.sval.u.string);
n = CAR(n);
}
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | define_variable($1->u.sval.u.string, type,
|
019b3d | 2000-07-09 | Henrik Grubbström (Grubba) | | Pike_compiler->current_modifiers);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(type);
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | | bad_identifier {}
| TOK_IDENTIFIER '='
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *type;
|
a2af98 | 2014-03-01 | Henrik Grubbström (Grubba) | | node *n;
|
d39157 | 2021-02-22 | Henrik Grubbström (Grubba) | |
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->current_type);
|
a2af98 | 2014-03-01 | Henrik Grubbström (Grubba) | | n = Pike_compiler->current_attributes;
while(n) {
push_type_attribute(CDR(n)->u.sval.u.string);
n = CAR(n);
}
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
019b3d | 2000-07-09 | Henrik Grubbström (Grubba) | | if ((Pike_compiler->current_modifiers & ID_EXTERN) &&
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
|
8fd931 | 1999-12-30 | Henrik Grubbström (Grubba) | | yywarning("Extern declared variable has initializer.");
}
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $<number>$=define_variable($1->u.sval.u.string, type,
|
019b3d | 2000-07-09 | Henrik Grubbström (Grubba) | | Pike_compiler->current_modifiers & (~ID_EXTERN));
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
expr0
{
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if ((Pike_compiler->compiler_pass == COMPILER_PASS_LAST) &&
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | !TEST_COMPAT(7, 8) && ($4) && ($4->token == F_CONSTANT) &&
|
85c69f | 2013-07-13 | Henrik Grubbström (Grubba) | | !Pike_compiler->num_parse_error) {
|
9dce2a | 2013-07-16 | Henrik Grubbström (Grubba) | | /* Check if it is zero, in which case we can throw it away.
|
548c51 | 2013-07-01 | Henrik Grubbström (Grubba) | | *
* NB: The compat test is due to that this changes the semantics
* of calling __INIT() by hand.
*/
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if ((TYPEOF($4->u.sval) == PIKE_T_INT) && !SUBTYPEOF($4->u.sval) &&
!$4->u.sval.u.integer &&
|
9dce2a | 2013-07-16 | Henrik Grubbström (Grubba) | | !IDENTIFIER_IS_ALIAS(ID_FROM_INT(Pike_compiler->new_program,
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $<number>3)->identifier_flags)) {
|
9dce2a | 2013-07-16 | Henrik Grubbström (Grubba) | | /* NB: Inherited variables get converted into aliases by
* define_variable, and we need to support clearing
* of inherited variables.
*/
|
85aa84 | 2015-02-06 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if (l_flag > 5) {
fprintf(stderr,
"Ignoring initialization to zero for variable %s.\n",
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $1->u.sval.u.string->str);
|
85aa84 | 2015-02-06 | Henrik Grubbström (Grubba) | | }
#endif /* PIKE_DEBUG */
|
bb8842 | 2015-12-29 | Per Hedbor | | if(Pike_compiler->compiler_frame->current_type->type == PIKE_T_AUTO)
|
6e0fce | 2013-05-28 | Per Hedbor | | {
// auto variable type needs to be updated.
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | fix_type_field( $4 );
fix_auto_variable_type( $<number>3, $4->type );
|
6e0fce | 2013-05-28 | Per Hedbor | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($4);
$4 = NULL;
|
548c51 | 2013-07-01 | Henrik Grubbström (Grubba) | | }
}
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if ($4) {
|
3ea024 | 2019-07-09 | Henrik Grubbström (Grubba) | | node *n;
|
bb8842 | 2015-12-29 | Per 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 )
|
6e0fce | 2013-05-28 | Per Hedbor | | {
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | fix_type_field( $4 );
fix_auto_variable_type( $<number>3, $4->type );
|
6e0fce | 2013-05-28 | Per Hedbor | | }
|
3ea024 | 2019-07-09 | Henrik 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);
}
|
548c51 | 2013-07-01 | Henrik Grubbström (Grubba) | | Pike_compiler->init_node=mknode(F_COMMA_EXPR,Pike_compiler->init_node,
|
3ea024 | 2019-07-09 | Henrik Grubbström (Grubba) | | n);
|
548c51 | 2013-07-01 | Henrik Grubbström (Grubba) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | | TOK_IDENTIFIER '=' error
|
296836 | 1998-04-14 | Henrik Grubbström (Grubba) | | {
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
296836 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | | TOK_IDENTIFIER '=' TOK_LEX_EOF
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | {
yyerror("Unexpected end of file in variable definition.");
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | | bad_identifier '=' expr0
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($3);
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | /* Type at compiler_frame->current_type. */
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | new_local_name: TOK_IDENTIFIER
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | {
int id;
|
3c7fe7 | 2015-12-28 | Per Hedbor | | struct pike_type *type;
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | copy_pike_type(type, Pike_compiler->compiler_frame->current_type);
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | id = add_local_name($1->u.sval.u.string, type, 0);
|
3c7fe7 | 2015-12-28 | Per Hedbor | | if( type->type == PIKE_T_AUTO )
{
/* FIXME: Update type on assign instead! */
yyerror("auto only valid when the variable is assigned in definition.");
}
|
c98166 | 2006-03-02 | Henrik Grubbström (Grubba) | | if (id >= 0) {
/* FIXME: Consider using mklocalnode(id, -1). */
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | $$=mknode(F_ASSIGN, mklocalnode(id,0), mkintnode(0));
|
c98166 | 2006-03-02 | Henrik Grubbström (Grubba) | | } else
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | $$ = 0;
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | | bad_identifier { $$=0; }
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | | TOK_IDENTIFIER '='
{
push_finished_type(Pike_compiler->compiler_frame->current_type);
type_stack_mark();
}
expr0
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | int id;
|
6e0fce | 2013-05-28 | Per Hedbor | | struct pike_type *type;
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | pop_stack_mark();
update_current_type();
copy_pike_type(type, Pike_compiler->compiler_frame->current_type);
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if( type->type == PIKE_T_AUTO &&
Pike_compiler->compiler_pass == COMPILER_PASS_LAST)
|
6e0fce | 2013-05-28 | Per Hedbor | | {
free_type( type );
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | fix_type_field( $4 );
copy_pike_type( type, $4->type );
|
6e0fce | 2013-05-28 | Per Hedbor | | }
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | id = add_local_name($1->u.sval.u.string, type, 0);
|
b1d40c | 2008-01-04 | Henrik Grubbström (Grubba) | | if (id >= 0) {
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | if (!(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
|
b1d40c | 2008-01-04 | Henrik Grubbström (Grubba) | | /* Only warn about unused initialized variables in strict types mode. */
Pike_compiler->compiler_frame->variable[id].flags |= LOCAL_VAR_IS_USED;
}
|
ed6145 | 2021-02-27 | Henrik Grubbström (Grubba) | | $$ = mknode(F_INITIALIZE, mklocalnode(id, 0), $4);
|
b1d40c | 2008-01-04 | Henrik Grubbström (Grubba) | | } else
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | $$ = 0;
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | | bad_identifier '='
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
35a405 | 2016-01-24 | Henrik 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);
|
5b6acd | 1998-04-30 | Fredrik Hübinette (Hubbe) | | $$=0;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | | TOK_IDENTIFIER '='
{
push_finished_type(Pike_compiler->compiler_frame->current_type);
type_stack_mark();
}
error
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | pop_stack_mark();
update_current_type();
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* No yyerok here since we aren't done yet. */
|
5b6acd | 1998-04-30 | Fredrik Hübinette (Hubbe) | | $$=0;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | | TOK_IDENTIFIER '='
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | {
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | push_finished_type(Pike_compiler->compiler_frame->current_type);
type_stack_mark();
}
TOK_LEX_EOF
{
pop_stack_mark();
update_current_type();
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file in local variable definition.");
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($1);
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | /* No yyerok here since we aren't done yet. */
$$=0;
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
9b3902 | 2003-03-27 | Martin Stjernholm | | line_number_info: /* empty */
{
/* Used to hold line-number info */
$$ = mkintnode(0);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | block:'{'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | $<number>1=Pike_compiler->num_used_modules;
$<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
|
0ad650 | 2012-10-02 | Per Hedbor | | }
|
9b3902 | 2003-03-27 | Martin Stjernholm | | line_number_info
|
02a79a | 2000-09-04 | Fredrik Hübinette (Hubbe) | | {
/* Trick to store more than one number on compiler stack - Hubbe */
$<number>$=Pike_compiler->compiler_frame->last_block_level;
|
120d84 | 2000-11-08 | Fredrik 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;
|
02a79a | 2000-09-04 | Fredrik Hübinette (Hubbe) | | }
|
46cce1 | 2017-08-13 | Henrik Grubbström (Grubba) | | {
$<ptr>$ = Pike_compiler;
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | statements end_block
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
46cce1 | 2017-08-13 | Henrik 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"); */
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass != COMPILER_PASS_LAST)
|
46cce1 | 2017-08-13 | Henrik Grubbström (Grubba) | | p = end_first_pass(0);
else
p=end_first_pass(1);
if (p) free_program(p);
}
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | unuse_modules(Pike_compiler->num_used_modules - $<number>1);
|
46cce1 | 2017-08-13 | Henrik Grubbström (Grubba) | | $6 = pop_local_variables($<number>2, $6);
|
702ea5 | 2002-10-11 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->last_block_level=$<number>4;
|
46cce1 | 2017-08-13 | Henrik Grubbström (Grubba) | | if ($6) COPY_LINE_NUMBER_INFO($6, $3);
|
9b3902 | 2003-03-27 | Martin Stjernholm | | free_node ($3);
|
46cce1 | 2017-08-13 | Henrik Grubbström (Grubba) | | $$=$6;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
eb9ef9 | 2010-11-19 | Henrik Grubbström (Grubba) | | /* Node with line number info at $0. */
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | end_block: '}'
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | {
yyerror("Missing '}'.");
|
eb9ef9 | 2010-11-19 | Henrik 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.");
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file.");
}
;
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | failsafe_block: block
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | | error { $$=0; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=0; }
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | ;
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | |
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | /* Type at compiler_frame->current_type. */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | local_name_list: new_local_name
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | | local_name_list ',' new_local_name
{ $$ = mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $1), $3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | |
|
8020bf | 2018-11-05 | Henrik 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($$);
|
843d2f | 2018-11-06 | Henrik Grubbström (Grubba) | | $$ = mkconstantsvaluenode(Pike_sp - 1);
|
8020bf | 2018-11-05 | Henrik Grubbström (Grubba) | | pop_stack();
}
;
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | local_constant_name: TOK_IDENTIFIER '=' safe_expr0
{
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *type;
|
f5df59 | 2000-10-25 | Fredrik 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);
|
71bde8 | 2001-03-16 | Fredrik Hübinette (Hubbe) | | optimize_node($3);
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | Pike_compiler->compiler_pass=tmp;
type=$3->u.node.a->type;
}
|
1adcc9 | 2018-02-14 | Henrik Grubbström (Grubba) | | if(!is_const($3))
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | {
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass == COMPILER_PASS_LAST)
|
1adcc9 | 2018-02-14 | Henrik Grubbström (Grubba) | | yyerror("Constant definition is not constant.");
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | }else{
|
1adcc9 | 2018-02-14 | Henrik Grubbström (Grubba) | | ptrdiff_t tmp=eval_low($3,1);
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | if(tmp < 1)
{
yyerror("Error in constant definition.");
}else{
|
bd6739 | 2015-10-14 | Martin Nilsson | | pop_n_elems((INT32)(tmp - 1));
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | if($3) free_node($3);
$3=mksvaluenode(Pike_sp-1);
type=$3->type;
pop_stack();
}
}
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | if(!type) type = mixed_type_string;
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | add_ref(type);
|
f2e544 | 2019-08-16 | Henrik Grubbström (Grubba) | | add_local_name($1->u.sval.u.string, type, $3);
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | | /* Note: Intentionally not marked as used. */
|
f5df59 | 2000-10-25 | Fredrik 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
|
107029 | 2000-11-04 | Henrik Grubbström (Grubba) | | | local_constant_list ',' local_constant_name
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | ;
|
107029 | 2000-11-04 | Henrik Grubbström (Grubba) | | local_constant: TOK_CONSTANT local_constant_list ';'
| TOK_CONSTANT error ';' { yyerrok; }
| TOK_CONSTANT error TOK_LEX_EOF
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | {
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
|
107029 | 2000-11-04 | Henrik Grubbström (Grubba) | | | TOK_CONSTANT error '}' { yyerror("Missing ';'."); }
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | statements: { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | statements statement
{
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | $$ = mknode(F_COMMA_EXPR, $1, mkcastnode(void_type_string, $2));
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
c59560 | 2018-09-09 | Henrik Grubbström (Grubba) | | statement_with_semicolon: unused2 expected_semicolon
;
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | |
|
71bde8 | 2001-03-16 | Fredrik Hübinette (Hubbe) | | normal_label_statement: statement_with_semicolon
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | import { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | cond
|
71bde8 | 2001-03-16 | Fredrik Hübinette (Hubbe) | | | return
|
f5df59 | 2000-10-25 | Fredrik Hübinette (Hubbe) | | | local_constant { $$=0; }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | block
|
586b8a | 1998-04-28 | Henrik Grubbström (Grubba) | | | break expected_semicolon
| continue expected_semicolon
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | | error ';' { reset_type_stack(); $$=0; yyerrok; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
reset_type_stack();
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
$$=0;
}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | error '}'
{
reset_type_stack();
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | yyerror("Missing ';'.");
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | /* yychar = '}'; */ /* Put the '}' back on the input stream. */
$$=0;
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
|
0ad650 | 2012-10-02 | Per Hedbor | | | ';' { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | statement: normal_label_statement
{
Pike_compiler->compiler_frame->opt_flags &= ~OPT_CUSTOM_LABELS;
}
| while
| do
| for
| foreach
| switch
| case
| default
| labeled_statement
|
963749 | 2016-10-06 | Henrik Grubbström (Grubba) | | | simple_type2 local_function { $$=mkcastnode(void_type_string, $2); }
|
3bc6c1 | 2019-09-17 | Henrik 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);
}
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | | implicit_modifiers named_class { $$=mkcastnode(void_type_string, $2); }
|
5a0fd5 | 2001-01-10 | Martin 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. */
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $1);
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | }
;
optional_label: TOK_IDENTIFIER
| /* empty */ {$$ = 0;}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | break: TOK_BREAK optional_label { $$=mknode(F_BREAK,$2,0); } ;
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | default: TOK_DEFAULT ':' { $$=mknode(F_DEFAULT,0,0); }
| TOK_DEFAULT
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | {
$$=mknode(F_DEFAULT,0,0); yyerror("Expected ':' after default.");
}
;
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | continue: TOK_CONTINUE optional_label { $$=mknode(F_CONTINUE,$2,0); } ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
acabf1 | 2016-01-09 | Henrik Grubbström (Grubba) | | /* This variant is used to push the compiler context for
* functions without a declared return type (ie lambdas).
*/
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | start_lambda: /* empty */
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
8322b6 | 2000-05-08 | Fredrik Hübinette (Hubbe) | | push_compiler_frame(SCOPE_LOCAL);
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | |
|
ab6b78 | 2016-05-07 | Henrik 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);
|
bc6289 | 2009-06-22 | Henrik Grubbström (Grubba) | | $$ = Pike_compiler->compiler_frame;
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | }
;
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | implicit_identifier: /* empty */
{
|
247987 | 2008-05-07 | Henrik Grubbström (Grubba) | | struct pike_string *name;
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | $$=mkstrnode(name = get_new_name(NULL));
|
247987 | 2008-05-07 | Henrik Grubbström (Grubba) | | free_string(name);
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | }
;
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | lambda: TOK_LAMBDA line_number_info implicit_identifier start_lambda
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | func_args
{
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | struct pike_string *name = $3->u.sval.u.string;
struct pike_type *type;
int e;
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | $<number>$ = Pike_compiler->varargs;
Pike_compiler->varargs = 0;
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | |
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST) {
|
907256 | 2008-05-07 | Henrik Grubbström (Grubba) | | /* Define a tentative prototype for the lambda. */
push_finished_type(mixed_type_string);
|
ab6b78 | 2016-05-07 | Henrik Grubbström (Grubba) | | e=$5-1;
|
907256 | 2008-05-07 | Henrik 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);
|
0ad650 | 2012-10-02 | Per Hedbor | | }
|
907256 | 2008-05-07 | Henrik Grubbström (Grubba) | | type=compiler_pop_type();
Pike_compiler->compiler_frame->current_function_number =
define_function(name, type,
|
95489a | 2008-06-29 | Martin Nilsson | | ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED,
|
907256 | 2008-05-07 | Henrik 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);
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | }
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | }
failsafe_block
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *type;
|
329cc0 | 1997-02-17 | Fredrik Hübinette (Hubbe) | | int f,e;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | struct pike_string *name;
|
e021fe | 2008-04-14 | Henrik 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;
|
d4f23b | 2001-08-10 | Martin Stjernholm | |
|
ab6b78 | 2016-05-07 | Henrik Grubbström (Grubba) | | debug_malloc_touch($7);
$7=mknode(F_COMMA_EXPR,$7,mknode(F_RETURN,mkintnode(0),0));
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
|
cbdf33 | 2003-03-27 | Martin Stjernholm | | /* Doing this in pass 1 might induce too strict checks on types
* in cases where we got placeholders. */
|
ab6b78 | 2016-05-07 | Henrik Grubbström (Grubba) | | type=find_return_type($7);
|
e3866b | 2007-09-03 | Henrik 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. */
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | push_type(T_MIXED);
|
e3866b | 2007-09-03 | Henrik Grubbström (Grubba) | | }
|
ab6b78 | 2016-05-07 | Henrik Grubbström (Grubba) | | e=$5-1;
if($<number>6)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | e--;
|
5b368e | 2001-03-31 | Henrik Grubbström (Grubba) | | pop_type_stack(T_ARRAY);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }else{
push_type(T_VOID);
}
|
903970 | 2000-08-15 | Henrik Grubbström (Grubba) | | Pike_compiler->varargs=0;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | push_type(T_MANY);
|
dfed93 | 2001-03-03 | Henrik Grubbström (Grubba) | | for(; e>=0; e--) {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
|
dfed93 | 2001-03-03 | Henrik Grubbström (Grubba) | | push_type(T_FUNCTION);
}
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | name = $3->u.sval.u.string;
|
c4d468 | 1998-06-06 | Henrik Grubbström (Grubba) | |
#ifdef LAMBDA_DEBUG
|
e3866b | 2007-09-03 | Henrik Grubbström (Grubba) | | fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n%d: type: ",
|
b2e726 | 2007-09-15 | Henrik 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);
|
e3866b | 2007-09-03 | Henrik Grubbström (Grubba) | | simple_describe_type(type);
fprintf(stderr, "\n");
|
c4d468 | 1998-06-06 | Henrik Grubbström (Grubba) | | #endif /* LAMBDA_DEBUG */
|
327118 | 2004-03-18 | Henrik Grubbström (Grubba) | |
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | f=dooptcode(name,
|
ab6b78 | 2016-05-07 | Henrik Grubbström (Grubba) | | $7,
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | type,
|
95489a | 2008-06-29 | Martin Nilsson | | ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED);
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | |
|
907256 | 2008-05-07 | Henrik 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 */
|
164d6b | 2001-11-29 | Henrik 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 */
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(Pike_compiler->compiler_frame->lexical_scope & SCOPE_SCOPED) {
|
8c70ba | 2001-09-28 | Fredrik Hübinette (Hubbe) | | $$ = mktrampolinenode(f, Pike_compiler->compiler_frame->previous);
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | } else {
$$ = mkidentifiernode(f);
}
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(type);
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | c->lex.current_line = save_line;
c->lex.current_file = save_file;
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | free_node($3);
|
9b3902 | 2003-03-27 | Martin Stjernholm | | free_node ($2);
|
bc6289 | 2009-06-22 | Henrik 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
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_compiler_frame();
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | | TOK_LAMBDA line_number_info implicit_identifier start_lambda error
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | {
|
bc6289 | 2009-06-22 | Henrik 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
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | pop_compiler_frame();
|
3857bd | 2000-11-04 | Henrik Grubbström (Grubba) | | $$ = mkintnode(0);
|
327118 | 2004-03-18 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $2);
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | free_node($3);
|
327118 | 2004-03-18 | Henrik Grubbström (Grubba) | | free_node($2);
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | local_function: TOK_IDENTIFIER start_function func_args
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_string *name;
struct pike_type *type;
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | int id,e;
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | node *n;
struct identifier *i=0;
/***/
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->current_return_type);
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | e=$3-1;
|
c3cfe9 | 2000-07-10 | Henrik Grubbström (Grubba) | | if(Pike_compiler->varargs)
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | e--;
|
5b368e | 2001-03-31 | Henrik Grubbström (Grubba) | | pop_type_stack(T_ARRAY);
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | }else{
push_type(T_VOID);
}
push_type(T_MANY);
|
dfed93 | 2001-03-03 | Henrik Grubbström (Grubba) | | for(; e>=0; e--) {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | push_finished_type(Pike_compiler->compiler_frame->variable[e].type);
|
dfed93 | 2001-03-03 | Henrik Grubbström (Grubba) | | push_type(T_FUNCTION);
}
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | /***/
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | |
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | name = get_new_name($1->u.sval.u.string);
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | |
#ifdef LAMBDA_DEBUG
fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n",
|
b2e726 | 2007-09-15 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_pass, name->str,
(long)Pike_compiler->new_program->id,
Pike_compiler->local_class_counter-1);
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | #endif /* LAMBDA_DEBUG */
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass > COMPILER_PASS_FIRST)
|
8c70ba | 2001-09-28 | Fredrik Hübinette (Hubbe) | | {
id=isidentifier(name);
}else{
id=define_function(name,
type,
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED,
|
3116ce | 2002-11-22 | Henrik Grubbström (Grubba) | | IDENTIFIER_PIKE_FUNCTION |
(Pike_compiler->varargs?IDENTIFIER_VARARGS:0),
|
8c70ba | 2001-09-28 | Fredrik Hübinette (Hubbe) | | 0,
OPT_SIDE_EFFECT|OPT_EXTERNAL_DEPEND);
}
|
3116ce | 2002-11-22 | Henrik Grubbström (Grubba) | | Pike_compiler->varargs=0;
|
b1aa47 | 2001-10-05 | Fredrik Hübinette (Hubbe) | | Pike_compiler->compiler_frame->current_function_number=id;
|
327118 | 2004-03-18 | Henrik Grubbström (Grubba) | |
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | n=0;
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass > COMPILER_PASS_FIRST &&
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | (i=ID_FROM_INT(Pike_compiler->new_program, id)))
|
8c70ba | 2001-09-28 | Fredrik Hübinette (Hubbe) | | {
if(i->identifier_flags & IDENTIFIER_SCOPED)
n = mktrampolinenode(id, Pike_compiler->compiler_frame->previous);
else
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | n = mkidentifiernode(id);
|
8c70ba | 2001-09-28 | Fredrik Hübinette (Hubbe) | | }
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | |
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | low_add_local_name(Pike_compiler->compiler_frame->previous,
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | $1->u.sval.u.string, type, n);
$<number>$=id;
free_string(name);
}
failsafe_block
{
int localid;
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | struct identifier *i=ID_FROM_INT(Pike_compiler->new_program, $<number>4);
|
e021fe | 2008-04-14 | Henrik 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;
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | |
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | $5=mknode(F_COMMA_EXPR,$5,mknode(F_RETURN,mkintnode(0),0));
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | |
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | debug_malloc_touch($5);
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | dooptcode(i->name,
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | $5,
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | i->type,
|
95489a | 2008-06-29 | Martin Nilsson | | ID_PROTECTED | ID_PRIVATE | ID_INLINE);
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | |
|
1ef557 | 2000-08-30 | Henrik Grubbström (Grubba) | | i->opt_flags = Pike_compiler->compiler_frame->opt_flags;
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | c->lex.current_line = save_line;
c->lex.current_file = save_file;
|
bc6289 | 2009-06-22 | Henrik 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
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | pop_compiler_frame();
free_node($1);
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | |
/* WARNING: If the local function adds more variables we are screwed */
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | /* WARNING2: if add_local_name stops adding local variables at the end,
* this has to be fixed.
*/
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | localid=Pike_compiler->compiler_frame->current_number_of_locals-1;
if(Pike_compiler->compiler_frame->variable[localid].def)
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | $$=copy_node(Pike_compiler->compiler_frame->variable[localid].def);
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | }else{
|
0ad650 | 2012-10-02 | Per Hedbor | | if(Pike_compiler->compiler_frame->lexical_scope &
|
b6cdf3 | 2000-06-28 | Fredrik Hübinette (Hubbe) | | (SCOPE_SCOPE_USED | SCOPE_SCOPED))
|
d18707 | 2000-06-20 | Fredrik Hübinette (Hubbe) | | {
|
3a77fb | 2003-02-26 | Henrik Grubbström (Grubba) | | $$ = mktrampolinenode($<number>4,Pike_compiler->compiler_frame);
|
d18707 | 2000-06-20 | Fredrik Hübinette (Hubbe) | | }else{
|
3a77fb | 2003-02-26 | Henrik Grubbström (Grubba) | | $$ = mkidentifiernode($<number>4);
|
d18707 | 2000-06-20 | Fredrik Hübinette (Hubbe) | | }
|
5fb9b0 | 2000-04-06 | Fredrik Hübinette (Hubbe) | | }
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | }
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | | TOK_IDENTIFIER start_function error
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | {
|
bc6289 | 2009-06-22 | Henrik 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
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | pop_compiler_frame();
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | $$=mkintnode(0);
|
b5aa65 | 1999-12-16 | Henrik Grubbström (Grubba) | | }
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | ;
|
3bc6c1 | 2019-09-17 | Henrik 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);
}
;
|
e17b7b | 2016-01-16 | Henrik Grubbström (Grubba) | | create_arg: modifiers simple_type optional_dot_dot_dot TOK_IDENTIFIER
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *type;
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | int ref_no;
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | |
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | if (Pike_compiler->num_create_args < 0) {
|
e6c089 | 2001-03-30 | Henrik Grubbström (Grubba) | | yyerror("Can't define more variables after ...");
}
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if ($3) {
|
648918 | 2016-01-22 | Henrik Grubbström (Grubba) | | push_finished_type(Pike_compiler->compiler_frame->current_type);
|
21c5ed | 2020-01-07 | Henrik Grubbström (Grubba) | | push_unlimited_array_type(T_ARRAY);
|
648918 | 2016-01-22 | Henrik Grubbström (Grubba) | | type = compiler_pop_type();
} else {
copy_pike_type(type, Pike_compiler->compiler_frame->current_type);
|
e6c089 | 2001-03-30 | Henrik Grubbström (Grubba) | | }
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | |
|
bc3efc | 2007-10-06 | Henrik 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.
*/
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | ref_no = define_variable($4->u.sval.u.string, type,
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | Pike_compiler->current_modifiers);
|
bc3efc | 2007-10-06 | Henrik Grubbström (Grubba) | | free_type(type);
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | |
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | if (Pike_compiler->num_create_args != ref_no) {
my_yyerror("Multiple definitions of create variable %S (%d != %d).",
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | $4->u.sval.u.string,
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | Pike_compiler->num_create_args, ref_no);
}
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | if ($3) {
|
1e9a88 | 2007-10-05 | Henrik 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;
}
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | |
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | /* free_type(type); */
|
eb6ba7 | 2016-01-11 | Henrik Grubbström (Grubba) | | free_node($4);
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | | $$=0;
}
|
e17b7b | 2016-01-16 | Henrik Grubbström (Grubba) | | | modifiers simple_type bad_identifier { $$=0; }
|
c20a52 | 2000-07-08 | Henrik 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
;
|
1104c6 | 2007-10-08 | Henrik Grubbström (Grubba) | | optional_create_arguments: /* empty */ { $$ = 0; }
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | | '(' create_arguments close_paren_or_missing
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | | {
|
1104c6 | 2007-10-08 | Henrik Grubbström (Grubba) | | /* NOTE: One more than the number of arguments, so that we
< * can detect the case of no parenthesis below. */
$$ = $2 + 1;
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | free_node($3);
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | | }
;
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | |
|
eb9ef9 | 2010-11-19 | Henrik Grubbström (Grubba) | | failsafe_program: '{' program { $<n>$ = NULL; } end_block
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | | error { yyerrok; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | {
yyerror("End of file where program definition expected.");
}
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | ;
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | /* Modifiers at $0. */
|
6dddaa | 2016-11-09 | Henrik 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;
}
{
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | /* fprintf(stderr, "LANGUAGE.YACC: ANON CLASS start\n"); */
if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | {
if ($<number>0 & ID_EXTERN) {
yywarning("Extern declared class definition.");
}
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_FIRST, $<n>3->u.sval.u.string,
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | $<number>0,
&$<number>$);
/* fprintf(stderr, "Pass 1: Program %s has id %d\n",
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
|
6dddaa | 2016-11-09 | Henrik 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!");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_LAST, 0,
|
6dddaa | 2016-11-09 | Henrik 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))
{
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(s->u.program, COMPILER_PASS_LAST,
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | $<n>3->u.sval.u.string,
$<number>0,
&$<number>$);
/* fprintf(stderr, "Pass 2: Program %s has id %d\n",
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | |
}else{
yyerror("Pass 2: constant redefined!");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_LAST, 0,
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | $<number>0,
&$<number>$);
}
}else{
yyerror("Pass 2: class constant no longer constant!");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_LAST, 0,
|
6dddaa | 2016-11-09 | Henrik 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);
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
|
6dddaa | 2016-11-09 | Henrik 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) &&
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) &&
|
6dddaa | 2016-11-09 | Henrik 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,
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | mknode(F_ASSIGN, mkidentifiernode(e), local_node));
|
6dddaa | 2016-11-09 | Henrik 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");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST &&
|
6dddaa | 2016-11-09 | Henrik 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();
}
}
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass != COMPILER_PASS_LAST)
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | p=end_first_pass(0);
else
p=end_first_pass(1);
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | /* fprintf(stderr, "LANGUAGE.YACC: ANON CLASS end\n"); */
|
6dddaa | 2016-11-09 | Henrik 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
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | if(!$3)
|
51ffdb | 1998-01-19 | Fredrik Hübinette (Hubbe) | | {
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
51ffdb | 1998-01-19 | Fredrik Hübinette (Hubbe) | | char buffer[42];
|
d4f23b | 2001-08-10 | Martin Stjernholm | | sprintf(buffer,"__class_%ld_%ld_line_%d",
(long)Pike_compiler->new_program->id,
(long)Pike_compiler->local_class_counter++,
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | (int) $2->line_number);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | s=make_shared_string(buffer);
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $3=mkstrnode(s);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_string(s);
|
95489a | 2008-06-29 | Martin Nilsson | | $<number>0|=ID_PROTECTED | ID_PRIVATE | ID_INLINE;
|
51ffdb | 1998-01-19 | Fredrik Hübinette (Hubbe) | | }
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | |
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* fprintf(stderr, "LANGUAGE.YACC: CLASS start\n"); */
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | if ($<number>0 & ID_EXTERN) {
|
8fd931 | 1999-12-30 | Henrik Grubbström (Grubba) | | yywarning("Extern declared class definition.");
}
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_FIRST, $3->u.sval.u.string,
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $<number>0,
|
993ba7 | 2000-02-15 | Fredrik Hübinette (Hubbe) | | &$<number>$);
|
ff88db | 2000-07-12 | Henrik Grubbström (Grubba) | |
/* fprintf(stderr, "Pass 1: Program %s has id %d\n",
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
|
ff88db | 2000-07-12 | Henrik Grubbström (Grubba) | |
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | store_linenumber($2->line_number, $2->current_file);
|
9b3902 | 2003-03-27 | Martin Stjernholm | | debug_malloc_name(Pike_compiler->new_program,
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $2->current_file->str,
$2->line_number);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }else{
int i;
struct identifier *id;
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | int tmp=Pike_compiler->compiler_pass;
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | i=isidentifier($3->u.sval.u.string);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(i<0)
{
|
6c2aad | 2003-09-01 | Martin Nilsson | | /* Seriously broken... */
|
25df64 | 2003-08-20 | Henrik Grubbström (Grubba) | | yyerror("Pass 2: program not defined!");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_LAST, 0,
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $<number>0,
|
993ba7 | 2000-02-15 | Fredrik Hübinette (Hubbe) | | &$<number>$);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }else{
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | id=ID_FROM_INT(Pike_compiler->new_program, i);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(IDENTIFIER_IS_CONSTANT(id->identifier_flags))
{
struct svalue *s;
|
89378b | 2010-11-23 | Henrik Grubbström (Grubba) | | if ((id->func.const_info.offset >= 0) &&
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | (TYPEOF(*(s = &PROG_FROM_INT(Pike_compiler->new_program,i)->
constants[id->func.const_info.offset].sval)) ==
T_PROGRAM))
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(s->u.program, COMPILER_PASS_LAST,
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $3->u.sval.u.string,
$<number>0,
|
993ba7 | 2000-02-15 | Fredrik Hübinette (Hubbe) | | &$<number>$);
|
ff88db | 2000-07-12 | Henrik Grubbström (Grubba) | |
/* fprintf(stderr, "Pass 2: Program %s has id %d\n",
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | $3->u.sval.u.string->str, Pike_compiler->new_program->id); */
|
ff88db | 2000-07-12 | Henrik Grubbström (Grubba) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }else{
yyerror("Pass 2: constant redefined!");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_LAST, 0,
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $<number>0,
|
993ba7 | 2000-02-15 | Fredrik Hübinette (Hubbe) | | &$<number>$);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
}else{
yyerror("Pass 2: class constant no longer constant!");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | low_start_new_program(0, COMPILER_PASS_LAST, 0,
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $<number>0,
|
993ba7 | 2000-02-15 | Fredrik Hübinette (Hubbe) | | &$<number>$);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
}
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->compiler_pass=tmp;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
afbd44 | 2004-10-22 | Andreas (Kaos) Stenius | | {
/* Clear scoped modifiers. */
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | $<number>$ = THIS_COMPILATION->lex.pragmas;
THIS_COMPILATION->lex.pragmas &= ~ID_MODIFIER_MASK;
|
afbd44 | 2004-10-22 | Andreas (Kaos) Stenius | | }
|
c20a52 | 2000-07-08 | Henrik Grubbström (Grubba) | | optional_create_arguments failsafe_program
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct program *p;
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | |
/* Check if we have create arguments but no locally defined create(). */
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | if ($6) {
|
1e9a88 | 2007-10-05 | Henrik 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 ||
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | ((id = ID_FROM_PTR(Pike_compiler->new_program, ref))->func.offset == -1)) {
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | int e;
struct pike_type *type = NULL;
int nargs = Pike_compiler->num_create_args;
push_compiler_frame(SCOPE_LOCAL);
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
1e9a88 | 2007-10-05 | Henrik 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);
|
b1d40c | 2008-01-04 | Henrik Grubbström (Grubba) | | /* Note: add_local_name() above will return e. */
|
01e7e5 | 2008-01-03 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->variable[e].flags |=
LOCAL_VAR_IS_USED;
|
1e9a88 | 2007-10-05 | Henrik 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);
|
b1d40c | 2008-01-04 | Henrik Grubbström (Grubba) | | /* Note: add_local_name() above will return e. */
|
01e7e5 | 2008-01-03 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->variable[e].flags |=
LOCAL_VAR_IS_USED;
|
1e9a88 | 2007-10-05 | Henrik 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,
|
95489a | 2008-06-29 | Martin Nilsson | | ID_INLINE | ID_PROTECTED,
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | IDENTIFIER_PIKE_FUNCTION |
(Pike_compiler->num_create_args < 0?IDENTIFIER_VARARGS:0),
0,
OPT_SIDE_EFFECT);
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | node *create_code = NULL;
int f;
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | |
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | /* Third: Generate the initialization code.
*
* global_arg = [type]local_arg;
* [,..]
*/
for(e=0; e<nargs; e++)
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | {
|
5a1b59 | 2009-11-17 | Henrik 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) &&
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) &&
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_frame->variable[e].type !=
mixed_type_string)) {
/* fprintf(stderr, "Creating soft cast node for local #%d\n", e);*/
|
faa323 | 2013-02-19 | Henrik Grubbström (Grubba) | | local_node = mkcastnode(mixed_type_string, local_node);
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
faa323 | 2013-02-19 | Henrik Grubbström (Grubba) | | /* NOTE: The cast to mixed above is needed to avoid generating
* compilation errors, as well as avoiding optimizations
* in mksoftcastnode().
*/
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | local_node = mksoftcastnode(Pike_compiler->compiler_frame->
variable[e].type, local_node);
}
create_code =
mknode(F_COMMA_EXPR, create_code,
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | mknode(F_ASSIGN, mkidentifiernode(e), local_node));
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | }
}
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | /* Fourth: Add a return 0; at the end. */
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | |
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | create_code = mknode(F_COMMA_EXPR,
mknode(F_POP_VALUE, create_code, NULL),
mknode(F_RETURN, mkintnode(0), NULL));
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | |
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | /* Fifth: Define the function. */
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | |
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | f=dooptcode(create_string, create_code, type, ID_PROTECTED);
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | |
#ifdef PIKE_DEBUG
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | if(Pike_interpreter.recoveries &&
Pike_sp-Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer)
Pike_fatal("Stack error (underflow)\n");
|
d38e6a | 2017-12-14 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass == COMPILER_PASS_FIRST &&
|
5a1b59 | 2009-11-17 | Henrik 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);
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | | #endif
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | }
|
1e9a88 | 2007-10-05 | Henrik Grubbström (Grubba) | |
/* Done. */
free_type(type);
pop_compiler_frame();
}
}
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass != COMPILER_PASS_LAST)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | p=end_first_pass(0);
else
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | p=end_first_pass(1);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* fprintf(stderr, "LANGUAGE.YACC: CLASS end\n"); */
|
903dd3 | 2004-03-13 | Henrik Grubbström (Grubba) | | if(p) {
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | /* Update the type for the program constant,
* since we might have a lfun::create(). */
struct identifier *i;
struct svalue sv;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(sv, T_PROGRAM, 0, program, p);
|
5a1b59 | 2009-11-17 | Henrik Grubbström (Grubba) | | i = ID_FROM_INT(Pike_compiler->new_program, $<number>4);
free_type(i->type);
i->type = get_type_of_svalue(&sv);
|
e93b1f | 2019-01-22 | Henrik Grubbström (Grubba) | | if (p->flags & PROGRAM_CONSTANT) {
/* Update, in case of @constant. */
i->opt_flags = 0;
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | free_program(p);
|
4eab66 | 2004-03-17 | Henrik Grubbström (Grubba) | | } else if (!Pike_compiler->num_parse_error) {
|
72de5a | 2004-03-13 | Henrik Grubbström (Grubba) | | /* Make sure code in this class is aware that something went wrong. */
|
4eab66 | 2004-03-17 | Henrik Grubbström (Grubba) | | Pike_compiler->num_parse_error = 1;
|
2401c7 | 2000-01-03 | Martin Stjernholm | | }
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | $$=mkidentifiernode($<number>4);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | free_node($2);
|
afbd44 | 2004-10-22 | Andreas (Kaos) Stenius | | free_node($3);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | check_tree($$,0);
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | THIS_COMPILATION->lex.pragmas = $<number>5;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | simple_identifier: TOK_IDENTIFIER
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | | bad_identifier { $$ = 0; }
;
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | enum_value: /* EMPTY */ { $$ = 0; }
| '=' safe_expr0 { $$ = $2; }
;
/* Previous enum value at $0. */
enum_def: /* EMPTY */
| simple_identifier enum_value
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | {
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | if ($1) {
if ($2) {
/* Explicit enum value. */
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | |
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | /* This can be made more lenient in the future */
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | |
|
e33ab9 | 2008-07-18 | Henrik 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;
}
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | |
|
1adcc9 | 2018-02-14 | Henrik Grubbström (Grubba) | | if(!is_const($2))
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | {
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if(Pike_compiler->compiler_pass == COMPILER_PASS_LAST)
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | yyerror("Enum definition is not constant.");
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | push_int(0);
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | } else {
if(!Pike_compiler->num_parse_error)
{
|
1adcc9 | 2018-02-14 | Henrik Grubbström (Grubba) | | ptrdiff_t tmp=eval_low($2,1);
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | if(tmp < 1)
{
yyerror("Error in enum definition.");
push_int(0);
}else{
|
bd6739 | 2015-10-14 | Martin Nilsson | | pop_n_elems((INT32)(tmp - 1));
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | }
} else {
push_int(0);
}
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | }
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | free_node($2);
free_node($<n>0);
$<n>0 = mkconstantsvaluenode(Pike_sp-1);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | } else {
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | /* Implicit enum value. */
$<n>0 = safe_inc_enum($<n>0);
push_svalue(&$<n>0->u.sval);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | }
|
e33ab9 | 2008-07-18 | Henrik 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);
|
2a61e8 | 2011-03-24 | Henrik Grubbström (Grubba) | | struct pike_type *res = or_pike_types(new, current, 3);
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | free_type(current);
free_type(new);
type_stack_mark();
push_finished_type(res);
free_type(res);
}
pop_stack();
free_node($1);
|
43eaff | 2008-07-18 | Henrik Grubbström (Grubba) | | } else if ($2) {
free_node($2);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | }
}
;
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | /* Previous enum value at $-2 */
propagated_enum_value:
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | {
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | $$ = $<n>-2;
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | }
;
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | /* Previous enum value at $0. */
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | enum_list: enum_def
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | | enum_list ',' propagated_enum_value enum_def { $<n>0 = $3; }
|
cd6900 | 2004-07-23 | Henrik Grubbström (Grubba) | | | error
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | ;
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | /* Modifiers at $0. */
enum: TOK_ENUM
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | {
if ((Pike_compiler->current_modifiers & ID_EXTERN) &&
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | yywarning("Extern declared enum.");
}
type_stack_mark();
push_type(T_ZERO); /* Joined type so far. */
}
|
0ad650 | 2012-10-02 | Per Hedbor | | optional_identifier '{'
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | {
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | push_int(-1); /* Previous value. */
$<n>$ = mkconstantsvaluenode(Pike_sp-1);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | pop_stack();
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | }
|
eb9ef9 | 2010-11-19 | Henrik Grubbström (Grubba) | | enum_list { $<n>$ = NULL; } end_block
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | {
struct pike_type *t = pop_unfinished_type();
free_node($<n>5);
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | if ($3) {
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | ref_push_type_value(t);
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | add_constant($3->u.sval.u.string, Pike_sp-1,
|
3e1361 | 2001-04-03 | Henrik Grubbström (Grubba) | | (Pike_compiler->current_modifiers & ~ID_EXTERN) | ID_INLINE);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | pop_stack();
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | free_node($3);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | }
$$ = mktypenode(t);
free_type(t);
}
;
|
5e3aa5 | 2001-04-01 | Henrik 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) &&
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_FIRST)) {
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | yywarning("Extern declared typedef.");
}
if ($4) {
ref_push_type_value(t);
add_constant($4->u.sval.u.string, Pike_sp-1,
|
3e1361 | 2001-04-03 | Henrik Grubbström (Grubba) | | (Pike_compiler->current_modifiers & ~ID_EXTERN) | ID_INLINE);
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | pop_stack();
free_node($4);
}
free_type(t);
}
;
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | save_locals: /* empty */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->last_block_level =
$$ = Pike_compiler->compiler_frame->current_number_of_locals;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | ;
save_block_level: /* empty */
|
02a79a | 2000-09-04 | Fredrik Hübinette (Hubbe) | | {
/* Trick to store more than one number on compiler stack - Hubbe */
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | $$ = Pike_compiler->compiler_frame->last_block_level;
|
02a79a | 2000-09-04 | Fredrik Hübinette (Hubbe) | | }
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | ;
cond: TOK_IF save_block_level save_locals line_number_info
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' safe_comma_expr end_cond statement optional_else_part
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
702ea5 | 2002-10-11 | Henrik Grubbström (Grubba) | | $$ = mknode('?', $6,
|
0ef4e0 | 2002-05-09 | Henrik Grubbström (Grubba) | | mknode(':',
|
702ea5 | 2002-10-11 | Henrik Grubbström (Grubba) | | mkcastnode(void_type_string, $8),
mkcastnode(void_type_string, $9)));
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $4);
|
0ef4e0 | 2002-05-09 | Henrik Grubbström (Grubba) | | $$ = mkcastnode(void_type_string, $$);
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $4);
free_node($4);
$$ = pop_local_variables($3, $$);
Pike_compiler->compiler_frame->last_block_level = $2;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | end_cond: ')'
| '}' { yyerror("Missing ')'."); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | {
yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | optional_else_part: { $$=0; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_ELSE statement { $$=$2; }
|
0ad650 | 2012-10-02 | Per Hedbor | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | safe_lvalue: lvalue
|
a23d57 | 2008-01-07 | Henrik Grubbström (Grubba) | | {
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | if (!(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES) && $1) {
|
a23d57 | 2008-01-07 | Henrik 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;
}
}
}
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | error { $$=0; }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | ;
safe_expr0: expr0
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=0; }
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | | error { $$=0; }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | ;
|
4cdb80 | 2001-02-23 | Fredrik Hübinette (Hubbe) | |
foreach_optional_lvalue: /* empty */ { $$=0; }
| safe_lvalue
;
foreach_lvalues: ',' safe_lvalue { $$=$2; }
| ';' foreach_optional_lvalue ';' foreach_optional_lvalue
{ $$=mknode(':',$2,$4); }
;
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | foreach: TOK_FOREACH save_block_level save_locals line_number_info
|
3c7fe7 | 2015-12-28 | Per Hedbor | | '(' expr0 foreach_lvalues end_cond
{
}
statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
702ea5 | 2002-10-11 | Henrik Grubbström (Grubba) | | if ($7) {
|
4cdb80 | 2001-02-23 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_FOREACH,
|
507375 | 2018-05-26 | Henrik Grubbström (Grubba) | | mknode(F_FOREACH_VAL_LVAL,$6,$7),
|
3c7fe7 | 2015-12-28 | Per Hedbor | | $10);
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | } else {
/* Error in lvalue */
|
3c7fe7 | 2015-12-28 | Per Hedbor | | $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $6), $10);
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | }
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $4);
free_node($4);
$$ = pop_local_variables($3, $$);
Pike_compiler->compiler_frame->last_block_level = $2;
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
9b3902 | 2003-03-27 | Martin Stjernholm | | do: TOK_DO line_number_info statement
TOK_WHILE '(' safe_comma_expr end_cond expected_semicolon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
0c28ae | 2021-02-26 | Henrik Grubbström (Grubba) | | $$=mknode(F_DO,$6,$3);
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $2);
|
9b3902 | 2003-03-27 | Martin Stjernholm | | free_node ($2);
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
9b3902 | 2003-03-27 | Martin Stjernholm | | | TOK_DO line_number_info statement TOK_WHILE TOK_LEX_EOF
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | {
|
9b3902 | 2003-03-27 | Martin Stjernholm | | free_node ($2);
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | $$=0;
yyerror("Missing '(' in do-while loop.");
yyerror("Unexpected end of file.");
}
|
9b3902 | 2003-03-27 | Martin Stjernholm | | | TOK_DO line_number_info statement TOK_LEX_EOF
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | {
|
9b3902 | 2003-03-27 | Martin Stjernholm | | free_node ($2);
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | $$=0;
yyerror("Missing 'while' in do-while loop.");
yyerror("Unexpected end of file.");
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | expected_semicolon: ';'
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | {
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
;
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | for: TOK_FOR save_block_level save_locals line_number_info
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' unused expected_semicolon for_expr expected_semicolon unused end_cond
statement
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
702ea5 | 2002-10-11 | Henrik Grubbström (Grubba) | | $$=mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $6),
mknode(F_FOR,$8,mknode(':',$12,$10)));
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $4);
free_node($4);
$$ = pop_local_variables($3, $$);
Pike_compiler->compiler_frame->last_block_level = $2;
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | while: TOK_WHILE save_block_level save_locals line_number_info
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' safe_comma_expr end_cond statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
702ea5 | 2002-10-11 | Henrik Grubbström (Grubba) | | $$=mknode(F_FOR,$6,mknode(':',$8,NULL));
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $4);
free_node($4);
$$ = pop_local_variables($3, $$);
Pike_compiler->compiler_frame->last_block_level = $2;
|
5a0fd5 | 2001-01-10 | Martin Stjernholm | | Pike_compiler->compiler_frame->opt_flags |= OPT_CUSTOM_LABELS;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
for_expr: /* EMPTY */ { $$=mkintnode(1); }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | safe_comma_expr
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | switch: TOK_SWITCH save_block_level save_locals line_number_info
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' safe_comma_expr end_cond statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
702ea5 | 2002-10-11 | Henrik Grubbström (Grubba) | | $$=mknode(F_SWITCH,$6,$8);
|
845754 | 2016-05-13 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $4);
free_node($4);
$$ = pop_local_variables($3, $$);
Pike_compiler->compiler_frame->last_block_level = $2;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | case: TOK_CASE safe_comma_expr expected_colon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
$$=mknode(F_CASE,$2,0);
}
|
a7c3a4 | 2000-07-10 | Henrik Grubbström (Grubba) | | | TOK_CASE safe_comma_expr expected_dot_dot optional_comma_expr expected_colon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
9abda4 | 2002-03-02 | Martin Stjernholm | | $$=mknode(F_CASE_RANGE,$2,$4);
}
| TOK_CASE expected_dot_dot safe_comma_expr expected_colon
{
$$=mknode(F_CASE_RANGE,0,$3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | expected_colon: ':'
|
76b449 | 1999-12-09 | Henrik Grubbström (Grubba) | | | ';'
{
yyerror("Missing ':'.");
}
| '}'
{
yyerror("Missing ':'.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_LEX_EOF
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
3d7882 | 1999-11-06 | Henrik Grubbström (Grubba) | | yyerror("Missing ':'.");
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file.");
}
;
|
d0f734 | 2019-08-22 | Henrik Grubbström (Grubba) | | optional_continue: { $$ = 0; }
| TOK_CONTINUE { $$ = 1; }
| TOK_BREAK { $$ = 0; }
;
return: optional_continue TOK_RETURN expected_semicolon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
c2c932 | 2014-08-10 | Martin Nilsson | | if(!match_types(Pike_compiler->compiler_frame->current_return_type,
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | void_type_string))
{
|
f23f06 | 2004-03-12 | Henrik 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);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
816578 | 2019-08-22 | Henrik Grubbström (Grubba) | | $$ = mknode(F_RETURN, mkintnode(0), mkintnode($1));
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
d0f734 | 2019-08-22 | Henrik Grubbström (Grubba) | | | optional_continue TOK_RETURN safe_comma_expr expected_semicolon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
816578 | 2019-08-22 | Henrik Grubbström (Grubba) | | $$ = mknode(F_RETURN, $3, mkintnode($1));
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | unused: { $$=0; }
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | | safe_comma_expr { $$=mkcastnode(void_type_string, $1); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | unused2: comma_expr { $$=mkcastnode(void_type_string, $1); } ;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
ba62cf | 1997-09-18 | Fredrik Hübinette (Hubbe) | | optional_comma_expr: { $$=0; }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | safe_comma_expr
;
safe_comma_expr: comma_expr
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | | error { $$=0; }
|
ba62cf | 1997-09-18 | Fredrik Hübinette (Hubbe) | | ;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | comma_expr: comma_expr2
|
35a405 | 2016-01-24 | Henrik Grubbström (Grubba) | | | simple_type2 local_name_list { $$=$2; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
comma_expr2: expr0
| comma_expr2 ',' expr0
{
|
0ad650 | 2012-10-02 | Per Hedbor | | $$ = mknode(F_COMMA_EXPR, mkcastnode(void_type_string, $1), $3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
615cf5 | 2016-02-02 | Henrik Grubbström (Grubba) | | splice_expr: expr0
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | '@' expr0 { $$=mknode(F_PUSH_ARRAY,$2,0); };
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr0: expr01
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr4 assign expr0 { $$=mknode($2,$1,$3); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | expr4 assign error { $$=$1; reset_type_stack(); yyerrok; }
|
10fe60 | 2003-10-01 | Martin Stjernholm | | | open_bracket_with_line_info low_lvalue_list ']' assign expr0
{
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | if (!(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
mark_lvalues_as_used($2);
}
|
10fe60 | 2003-10-01 | Martin Stjernholm | | $$=mknode($4,mknode(F_ARRAY_LVALUE,$2,0),$5);
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $1);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($1);
}
| open_bracket_with_line_info low_lvalue_list ']' error
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | | {
$$=$2; free_node ($1); reset_type_stack(); yyerrok;
}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* | error { $$=0; reset_type_stack(); } */
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | expr01: expr1
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 '?' expr01 ':' expr01 { $$=mknode('?',$1,mknode(':',$3,$5)); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | assign: '=' { $$=F_ASSIGN; }
| TOK_AND_EQ { $$=F_AND_EQ; }
|
f76b4c | 2000-05-11 | Henrik 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; }
|
fbff33 | 2016-05-17 | Per Hedbor | | | TOK_POW_EQ { $$=F_POW_EQ; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_MOD_EQ { $$=F_MOD_EQ; }
| TOK_DIV_EQ { $$=F_DIV_EQ; }
|
d621b6 | 2020-11-12 | Henrik Grubbström (Grubba) | | | TOK_ATOMIC_GET_SET { $$=F_ATOMIC_GET_SET; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
cbae7e | 2000-03-30 | Henrik Grubbström (Grubba) | | optional_comma: { $$=0; } | ',' { $$=1; };
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr_list: { $$=0; }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | expr_list2 optional_comma
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
615cf5 | 2016-02-02 | Henrik Grubbström (Grubba) | | expr_list2: splice_expr
| expr_list2 ',' splice_expr { $$=mknode(F_ARG_LIST,$1,$3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
m_expr_list: { $$=0; }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | m_expr_list2 optional_comma
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
m_expr_list2: assoc_pair
|
998e1f | 1998-04-15 | Henrik 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
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
0ad650 | 2012-10-02 | Per Hedbor | | assoc_pair: expr0 expected_colon expr0
|
327118 | 2004-03-18 | Henrik Grubbström (Grubba) | | {
$$=mknode(F_ARG_LIST,$1,$3);
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | | expr0 expected_colon error { free_node($1); $$=0; }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr1: expr2
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | expr1 TOK_LOR expr1 { $$=mknode(F_LOR,$1,$3); }
| expr1 TOK_LAND expr1 { $$=mknode(F_LAND,$1,$3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 '|' expr1 { $$=mkopernode("`|",$1,$3); }
| expr1 '^' expr1 { $$=mkopernode("`^",$1,$3); }
| expr1 '&' expr1 { $$=mkopernode("`&",$1,$3); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | expr1 TOK_EQ expr1 { $$=mkopernode("`==",$1,$3); }
| expr1 TOK_NE expr1 { $$=mkopernode("`!=",$1,$3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 '>' expr1 { $$=mkopernode("`>",$1,$3); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | expr1 TOK_GE expr1 { $$=mkopernode("`>=",$1,$3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 '<' expr1 { $$=mkopernode("`<",$1,$3); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | expr1 TOK_LE expr1 { $$=mkopernode("`<=",$1,$3); }
| expr1 TOK_LSH expr1 { $$=mkopernode("`<<",$1,$3); }
| expr1 TOK_RSH expr1 { $$=mkopernode("`>>",$1,$3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 '+' expr1 { $$=mkopernode("`+",$1,$3); }
| expr1 '-' expr1 { $$=mkopernode("`-",$1,$3); }
| expr1 '*' expr1 { $$=mkopernode("`*",$1,$3); }
|
fbff33 | 2016-05-17 | Per Hedbor | | | expr1 TOK_POW expr1 { $$=mkopernode("`**",$1,$3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 '%' expr1 { $$=mkopernode("`%",$1,$3); }
| expr1 '/' expr1 { $$=mkopernode("`/",$1,$3); }
|
0ad650 | 2012-10-02 | Per Hedbor | | | expr1 TOK_LOR error
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | expr1 TOK_LAND error
|
0ad650 | 2012-10-02 | Per 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
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | expr1 '/' error
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr2: expr3
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | cast expr2
{
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | $$ = mkcastnode($1->u.sval.u.type, $2);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
1d73ef | 1999-11-23 | Henrik Grubbström (Grubba) | | | soft_cast expr2
{
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | $$ = mksoftcastnode($1->u.sval.u.type, $2);
|
1d73ef | 1999-11-23 | Henrik Grubbström (Grubba) | | free_node($1);
}
|
f76b4c | 2000-05-11 | Henrik 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); }
|
519273 | 2015-05-15 | Henrik 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);
}
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr3: expr4
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | expr4 TOK_INC { $$=mknode(F_POST_INC,$1,0); }
| expr4 TOK_DEC { $$=mknode(F_POST_DEC,$1,0); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
a30f09 | 2000-07-12 | Fredrik 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
*/
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | optional_block: /* EMPTY */ { $$=0; }
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | | '{' line_number_info
/* FIXME: Use implicit_identifier to make __func__ point to the lambda? */
|
f2dbd2 | 2016-01-25 | Henrik Grubbström (Grubba) | | start_lambda
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | {
/* block code */
$<number>1=Pike_compiler->num_used_modules;
|
c68a29 | 2001-06-10 | Henrik Grubbström (Grubba) | | $<number>$=Pike_compiler->compiler_frame->current_number_of_locals;
|
cbe130 | 2017-01-06 | Henrik Grubbström (Grubba) | |
|
cbcf32 | 2017-01-07 | Henrik Grubbström (Grubba) | | /* Declare the argument variable.
*
* NB: The code in the next block knows that this variable
* will be variable #0.
*/
|
cbe130 | 2017-01-06 | Henrik Grubbström (Grubba) | | push_type(T_MIXED);
|
04017d | 2020-01-02 | Henrik Grubbström (Grubba) | | push_unlimited_array_type(T_ARRAY);
|
cbe130 | 2017-01-06 | Henrik Grubbström (Grubba) | | add_local_name(args_string, compiler_pop_type(), 0);
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | }
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | statements end_block
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | {
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *type;
|
c68a29 | 2001-06-10 | Henrik Grubbström (Grubba) | | int f/*, e */;
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | struct pike_string *name;
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | struct compilation *c = THIS_COMPILATION;
struct pike_string *save_file = c->lex.current_file;
int save_line = c->lex.current_line;
|
cbcf32 | 2017-01-07 | Henrik 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;
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | c->lex.current_file = $2->current_file;
c->lex.current_line = $2->line_number;
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | |
|
cbcf32 | 2017-01-07 | Henrik 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));
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass != COMPILER_PASS_FIRST) {
|
cbdf33 | 2003-03-27 | Martin Stjernholm | | /* Doing this in pass 1 might induce too strict checks on types
* in cases where we got placeholders. */
type=find_return_type($5);
|
e3866b | 2007-09-03 | Henrik 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. */
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | push_type(T_MIXED);
|
e3866b | 2007-09-03 | Henrik Grubbström (Grubba) | | }
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
cbcf32 | 2017-01-07 | Henrik Grubbström (Grubba) | | if (args_used) {
|
cbe130 | 2017-01-06 | Henrik Grubbström (Grubba) | | /* __ARGS__ is used. */
push_type(T_MIXED);
} else {
push_type(T_VOID);
}
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | push_type(T_MANY);
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | name = get_new_name(NULL);
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | |
#ifdef LAMBDA_DEBUG
fprintf(stderr, "%d: IMPLICIT LAMBDA: %s 0x%08lx 0x%08lx\n",
|
b2e726 | 2007-09-15 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_pass, name->str,
(long)Pike_compiler->new_program->id,
Pike_compiler->local_class_counter-1);
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | #endif /* LAMBDA_DEBUG */
|
0ad650 | 2012-10-02 | Per Hedbor | |
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | f=dooptcode(name,
|
9b3902 | 2003-03-27 | Martin Stjernholm | | $5,
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | type,
|
95489a | 2008-06-29 | Martin Nilsson | | ID_PROTECTED | ID_PRIVATE | ID_INLINE | ID_USED);
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | |
if(Pike_compiler->compiler_frame->lexical_scope & SCOPE_SCOPED) {
|
8c70ba | 2001-09-28 | Fredrik Hübinette (Hubbe) | | $$ = mktrampolinenode(f,Pike_compiler->compiler_frame->previous);
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | } else {
$$ = mkidentifiernode(f);
}
|
d4f23b | 2001-08-10 | Martin Stjernholm | |
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | c->lex.current_line = save_line;
c->lex.current_file = save_file;
|
9b3902 | 2003-03-27 | Martin Stjernholm | | free_node ($2);
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | free_string(name);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(type);
|
bc6289 | 2009-06-22 | Henrik 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
|
a30f09 | 2000-07-12 | Fredrik Hübinette (Hubbe) | | pop_compiler_frame();
}
;
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | apply:
expr4 open_paren_with_line_info expr_list ')' optional_block
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | $$ = mkapplynode($1, mknode(F_ARG_LIST, $3, $5));
COPY_LINE_NUMBER_INFO($$, $2);
free_node ($2);
}
|
aab83d | 2019-11-03 | Marcus 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
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | {
$$=mkapplynode($1, $5);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($2);
yyerrok;
}
|
aab83d | 2019-11-03 | Marcus Comstedt | | | expr4 open_paren_or_safe_apply_with_line_info error TOK_LEX_EOF
|
10fe60 | 2003-10-01 | Martin Stjernholm | | {
yyerror("Missing ')'.");
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file.");
|
10fe60 | 2003-10-01 | Martin Stjernholm | | $$=mkapplynode($1, NULL);
free_node ($2);
}
|
aab83d | 2019-11-03 | Marcus Comstedt | | | expr4 open_paren_or_safe_apply_with_line_info error ';'
|
10fe60 | 2003-10-01 | Martin Stjernholm | | {
yyerror("Missing ')'.");
$$=mkapplynode($1, NULL);
free_node ($2);
}
|
aab83d | 2019-11-03 | Marcus Comstedt | | | expr4 open_paren_or_safe_apply_with_line_info error '}'
|
10fe60 | 2003-10-01 | Martin Stjernholm | | {
yyerror("Missing ')'.");
$$=mkapplynode($1, NULL);
free_node ($2);
}
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | ;
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | implicit_modifiers:
{
|
843d2f | 2018-11-06 | Henrik Grubbström (Grubba) | | free_node(Pike_compiler->current_annotations);
Pike_compiler->current_annotations = NULL;
|
3a30d7 | 2014-10-05 | Martin Nilsson | | $$ = Pike_compiler->current_modifiers = ID_PROTECTED|ID_INLINE|ID_PRIVATE |
(THIS_COMPILATION->lex.pragmas & ID_MODIFIER_MASK);
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | }
;
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | expr4: idents | expr5
|
aea6a4 | 2016-05-09 | Henrik 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);
}
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | bad_expr_ident
{
$$ = mknewintnode(0);
}
|
aea6a4 | 2016-05-09 | Henrik Grubbström (Grubba) | | ;
expr5: literal_expr
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | | catch
| gauge
| typeof
| sscanf
|
975c1e | 2018-09-10 | Henrik Grubbström (Grubba) | | | static_assertion { $$ = mknewintnode(0); }
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | | lambda
|
6dddaa | 2016-11-09 | Henrik Grubbström (Grubba) | | | implicit_modifiers anon_class { $$ = $2; }
|
2a343f | 2008-04-04 | Henrik Grubbström (Grubba) | | | implicit_modifiers enum { $$ = $2; }
|
55bd77 | 2005-02-18 | Henrik Grubbström (Grubba) | | | apply
|
10fe60 | 2003-10-01 | Martin Stjernholm | | | expr4 open_bracket_with_line_info '*' ']'
{
$$=mknode(F_AUTO_MAP_MARKER, $1, 0);
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $2);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($2);
}
| expr4 open_bracket_with_line_info expr0 ']'
{
$$=mknode(F_INDEX,$1,$3);
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $2);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($2);
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | }
|
10fe60 | 2003-10-01 | Martin Stjernholm | | | expr4 open_bracket_with_line_info
|
408a1e | 2004-10-30 | Martin Stjernholm | | range_bound expected_dot_dot range_bound ']'
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
408a1e | 2004-10-30 | Martin Stjernholm | | $$=mknode(F_RANGE,$1,mknode(':',$3,$5));
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $2);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($2);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
0ad650 | 2012-10-02 | Per Hedbor | | | expr4 TOK_SAFE_START_INDEX line_number_info expr0 ']'
{
|
252589 | 2013-11-02 | Per Hedbor | | /* A[?X] to ((tmp=A) && tmp[X]) */
|
aa5031 | 2014-12-09 | Henrik Grubbström (Grubba) | | if( $1 && ($1->token == F_LOCAL) )
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
efd3b6 | 2013-10-28 | Arne Goedeke | | $$=mknode(F_LAND, copy_node($1), mknode(F_INDEX, $1, $4));
|
0ad650 | 2012-10-02 | Per Hedbor | | }
else
{
fix_type_field( $1 );
|
aa5031 | 2014-12-09 | Henrik Grubbström (Grubba) | | if( $1 && $1->type )
|
0ad650 | 2012-10-02 | Per 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,
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | mknode(F_ASSIGN, mklocalnode(temporary,0), $1),
|
0ad650 | 2012-10-02 | Per Hedbor | | mknode(F_INDEX, mklocalnode(temporary,0), $4));
|
b7dce3 | 2016-05-12 | Henrik Grubbström (Grubba) | | $$ = pop_local_variables(temporary, $$);
|
0ad650 | 2012-10-02 | Per 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 ']'
{
|
252589 | 2013-11-02 | Per Hedbor | | /* A[?X..Y] to ((tmp=A) && tmp[X..Y]) */
|
0ad650 | 2012-10-02 | Per Hedbor | | node *range = mknode(':',$4,$6);
|
aa5031 | 2014-12-09 | Henrik Grubbström (Grubba) | | if( $1 && ($1->token == F_LOCAL ) )
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
efd3b6 | 2013-10-28 | Arne Goedeke | | $$ = mknode( F_LAND, copy_node($1), mknode(F_RANGE, $1, range) );
|
0ad650 | 2012-10-02 | Per Hedbor | | }
else
{
fix_type_field( $1 );
|
aa5031 | 2014-12-09 | Henrik Grubbström (Grubba) | | if( $1 && $1->type )
|
0ad650 | 2012-10-02 | Per 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,
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | mknode(F_ASSIGN, mklocalnode(temporary,0), $1),
|
0ad650 | 2012-10-02 | Per Hedbor | | mknode(F_RANGE, mklocalnode(temporary,0), range) );
|
b7dce3 | 2016-05-12 | Henrik Grubbström (Grubba) | | $$ = pop_local_variables(temporary, $$);
|
0ad650 | 2012-10-02 | Per Hedbor | | }
else
{
$$ = mknode( F_LAND, $1, mknode(F_RANGE,$1,range) );
yyerror("Indexing unexpected value.");
}
}
COPY_LINE_NUMBER_INFO($$, $3);
free_node ($3);
}
|
10fe60 | 2003-10-01 | Martin Stjernholm | | | expr4 open_bracket_with_line_info error ']'
{
$$=$1;
free_node ($2);
yyerrok;
}
| expr4 open_bracket_with_line_info error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
$$=$1; yyerror("Missing ']'.");
yyerror("Unexpected end of file.");
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($2);
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | }
|
10fe60 | 2003-10-01 | Martin 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 ')'
|
63e584 | 2005-01-27 | Henrik Grubbström (Grubba) | | {
$$=$2;
if ($$) {
COPY_LINE_NUMBER_INFO($$, $1);
}
free_node ($1);
}
|
10fe60 | 2003-10-01 | Martin Stjernholm | | | open_paren_with_line_info error ')' { $$=$1; yyerrok; }
| open_paren_with_line_info error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
10fe60 | 2003-10-01 | Martin Stjernholm | | $$=$1; yyerror("Missing ')'.");
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file.");
}
|
10fe60 | 2003-10-01 | Martin 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
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
10fe60 | 2003-10-01 | Martin Stjernholm | | $$=mknode(F_ARROW,$1,$4);
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | COPY_LINE_NUMBER_INFO($$, $3);
|
10fe60 | 2003-10-01 | Martin Stjernholm | | free_node ($3);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
0ad650 | 2012-10-02 | Per Hedbor | | | expr4 TOK_SAFE_INDEX line_number_info TOK_IDENTIFIER
{
|
19582d | 2019-11-02 | Peter Bortas | | /* A->?B to ((tmp=A) && tmp->B) */
|
0ad650 | 2012-10-02 | Per Hedbor | | int temporary;
|
aa5031 | 2014-12-09 | Henrik Grubbström (Grubba) | | if( $1 && ($1->token == F_LOCAL) )
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
efd3b6 | 2013-10-28 | Arne Goedeke | | $$=mknode(F_LAND, copy_node($1), mknode(F_ARROW, $1, $4));
|
0ad650 | 2012-10-02 | Per Hedbor | | }
else
{
fix_type_field( $1 );
|
2a01c2 | 2015-07-21 | Arne Goedeke | | if( $1 && $1->type )
|
0ad650 | 2012-10-02 | Per Hedbor | | {
|
b7dce3 | 2016-05-12 | Henrik Grubbström (Grubba) | | add_ref($1->type);
|
0ad650 | 2012-10-02 | Per Hedbor | | temporary = add_local_name(empty_pike_string, $1->type, 0);
|
b7dce3 | 2016-05-12 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->variable[temporary].flags |=
LOCAL_VAR_IS_USED;
|
0ad650 | 2012-10-02 | Per Hedbor | | $$=mknode(F_LAND,
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | mknode(F_ASSIGN, mklocalnode(temporary,0), $1),
|
0ad650 | 2012-10-02 | Per Hedbor | | mknode(F_ARROW, mklocalnode(temporary,0), $4));
|
b7dce3 | 2016-05-12 | Henrik Grubbström (Grubba) | | $$ = pop_local_variables(temporary, $$);
|
0ad650 | 2012-10-02 | Per Hedbor | | }
else
{
$$=mknode(F_ARROW, $1,$4);
yyerror("Indexing unexpected value.");
}
}
COPY_LINE_NUMBER_INFO($$, $3);
free_node ($3);
}
|
10fe60 | 2003-10-01 | Martin Stjernholm | | | expr4 TOK_ARROW line_number_info error {$$=$1; free_node ($3);}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | ;
|
f99cdd | 2016-05-08 | Henrik 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 '>)'."); }
;
|
7bf71d | 2017-12-10 | Henrik 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
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | {
|
de1d7d | 2000-07-10 | Henrik Grubbström (Grubba) | | $$=index_node($1, Pike_compiler->last_identifier?Pike_compiler->last_identifier->str:NULL,
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | | $3->u.sval.u.string);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
de1d7d | 2000-07-10 | Henrik 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);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($3);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | qualified_idents '.' bad_identifier {}
;
idents: unqualified_idents
| qualified_idents
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | ;
|
a83d12 | 2013-11-08 | Henrik Grubbström (Grubba) | | string_or_identifier: TOK_IDENTIFIER
| string
;
|
062e84 | 2013-11-09 | Henrik 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.
*/
|
a83d12 | 2013-11-08 | Henrik Grubbström (Grubba) | | inherit_specifier: string_or_identifier TOK_COLON_COLON
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | {
|
885388 | 2008-04-26 | Henrik Grubbström (Grubba) | | struct compilation *c = THIS_COMPILATION;
|
062e84 | 2013-11-09 | Henrik Grubbström (Grubba) | | struct program_state *state = Pike_compiler;
int depth;
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | int e = INHERIT_ALL;
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | |
|
062e84 | 2013-11-09 | Henrik 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.
*
|
cbcad3 | 2019-06-11 | Henrik Grubbström (Grubba) | | * 6: this & this_program.
|
062e84 | 2013-11-09 | Henrik 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).
*/
|
91b0d9 | 2002-05-05 | Martin Stjernholm | | e = inh;
|
062e84 | 2013-11-09 | Henrik Grubbström (Grubba) | | inherit_state = state;
inherit_depth = depth;
if (state->new_program->inherits[inh].inherit_level == 1) {
/* Name of direct inherit ==> Done. */
break;
}
|
91b0d9 | 2002-05-05 | Martin Stjernholm | | }
|
062e84 | 2013-11-09 | Henrik Grubbström (Grubba) | | /* The top-level class does not have a name, so break here. */
if (depth == c->compilation_depth) break;
|
ec8008 | 2014-08-24 | Martin Nilsson | | if (ID_FROM_INT (state->previous->new_program,
|
062e84 | 2013-11-09 | Henrik Grubbström (Grubba) | | state->parent_identifier)->name ==
|
91b0d9 | 2002-05-05 | Martin Stjernholm | | $1->u.sval.u.string) {
|
062e84 | 2013-11-09 | Henrik Grubbström (Grubba) | | /* Name of surrounding class ==> Done. */
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | e = INHERIT_SELF;
|
062e84 | 2013-11-09 | Henrik Grubbström (Grubba) | | inherit_state = state;
inherit_depth = depth;
|
91b0d9 | 2002-05-05 | Martin Stjernholm | | break;
}
|
8c6423 | 2000-06-26 | Henrik Grubbström (Grubba) | | }
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | if (e < 0) {
|
cbcad3 | 2019-06-11 | Henrik 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)) {
|
ec8008 | 2014-08-24 | Martin Nilsson | | my_yyerror("No inherit or surrounding class %S.",
$1->u.sval.u.string);
|
cbcad3 | 2019-06-11 | Henrik Grubbström (Grubba) | | }
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | }
free_node($1);
|
8c6423 | 2000-06-26 | Henrik Grubbström (Grubba) | | $$ = e;
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_LOCAL_ID TOK_COLON_COLON
{
inherit_state = Pike_compiler;
inherit_depth = 0;
$$ = INHERIT_LOCAL;
}
|
360436 | 2002-05-05 | Martin Stjernholm | | | TOK_GLOBAL TOK_COLON_COLON
{
|
885388 | 2008-04-26 | Henrik Grubbström (Grubba) | | struct compilation *c = THIS_COMPILATION;
|
360436 | 2002-05-05 | Martin Stjernholm | | inherit_state = Pike_compiler;
|
885388 | 2008-04-26 | Henrik Grubbström (Grubba) | | for (inherit_depth = 0; inherit_depth < c->compilation_depth;
|
360436 | 2002-05-05 | Martin Stjernholm | | inherit_depth++, inherit_state = inherit_state->previous) {}
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | $$ = INHERIT_GLOBAL;
|
360436 | 2002-05-05 | Martin Stjernholm | | }
|
7bf71d | 2017-12-10 | Henrik 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;
}
}
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | | inherit_specifier TOK_IDENTIFIER TOK_COLON_COLON
{
|
a2f423 | 2008-05-30 | Henrik Grubbström (Grubba) | | int e = 0;
|
7e6428 | 2008-05-30 | Henrik Grubbström (Grubba) | | if ($1 < 0) {
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | $1 = INHERIT_SELF;
|
7e6428 | 2008-05-30 | Henrik Grubbström (Grubba) | | }
|
0b3d0f | 2000-06-26 | Henrik Grubbström (Grubba) | | #if 0
|
a2f423 | 2008-05-30 | Henrik Grubbström (Grubba) | | /* FIXME: The inherit modifiers aren't kept. */
if (!(inherit_state->new_program->inherits[$1].flags & ID_PRIVATE)) {
|
0b3d0f | 2000-06-26 | Henrik Grubbström (Grubba) | | #endif /* 0 */
|
a2f423 | 2008-05-30 | Henrik Grubbström (Grubba) | | e = find_inherit(inherit_state->new_program->inherits[$1].prog,
$2->u.sval.u.string);
|
0b3d0f | 2000-06-26 | Henrik Grubbström (Grubba) | | #if 0
|
a2f423 | 2008-05-30 | Henrik Grubbström (Grubba) | | }
|
0b3d0f | 2000-06-26 | Henrik Grubbström (Grubba) | | #endif /* 0 */
|
a2f423 | 2008-05-30 | Henrik 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);
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | } else {
|
a2f423 | 2008-05-30 | Henrik Grubbström (Grubba) | | my_yyerror("No such inherit %S.", $2->u.sval.u.string);
}
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | $$ = INHERIT_ALL;
|
a2f423 | 2008-05-30 | Henrik Grubbström (Grubba) | | } else {
/* We know stuff about the inherit structure... */
|
7e6428 | 2008-05-30 | Henrik Grubbström (Grubba) | | $$ = e + $1;
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | }
free_node($2);
}
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | inherit_specifier bad_inherit TOK_COLON_COLON { $$ = INHERIT_ALL; }
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | ;
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | low_idents: TOK_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
de1d7d | 2000-07-10 | Henrik 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);
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | |
|
de1d7d | 2000-07-10 | Henrik Grubbström (Grubba) | | if(($$=lexical_islocal(Pike_compiler->last_identifier)))
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | /* done, nothing to do here */
|
0ee38f | 2002-05-11 | Martin Stjernholm | | }else if(!($$=find_module_identifier(Pike_compiler->last_identifier,1)) &&
|
388e5d | 2008-05-30 | Henrik Grubbström (Grubba) | | !($$ = program_magic_identifier (Pike_compiler, 0, -1,
|
0ee38f | 2002-05-11 | Martin Stjernholm | | Pike_compiler->last_identifier, 0))) {
|
cd2be3 | 2004-03-13 | Henrik Grubbström (Grubba) | | if((Pike_compiler->flags & COMPILATION_FORCE_RESOLVE) ||
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_LAST)) {
|
ce060e | 2004-06-30 | Martin Nilsson | | my_yyerror("Undefined identifier %S.",
Pike_compiler->last_identifier);
|
4eab66 | 2004-03-17 | Henrik 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.
|
13670c | 2015-05-25 | Martin Nilsson | | */
|
f23f06 | 2004-03-12 | Henrik Grubbström (Grubba) | | $$=0;
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | }else{
|
f23f06 | 2004-03-12 | Henrik Grubbström (Grubba) | | $$=mknode(F_UNDEFINED,0,0);
|
dffa01 | 1997-01-15 | Fredrik Hübinette (Hubbe) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
bbd892 | 2011-07-07 | Henrik Grubbström (Grubba) | | | '.' TOK_IDENTIFIER
{
|
4a001a | 2019-12-15 | Marcus Comstedt | | push_constant_text("");
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | if (call_handle_import()) {
|
bbd892 | 2011-07-07 | Henrik 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);
}
|
32bc32 | 2008-06-18 | Henrik 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;
}
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | ;
qualified_ident:
TOK_PREDEF TOK_COLON_COLON TOK_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
4d889f | 2008-04-25 | Henrik Grubbström (Grubba) | | struct compilation *c = THIS_COMPILATION;
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | node *tmp2;
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | |
|
4d889f | 2008-04-25 | Henrik Grubbström (Grubba) | | if(Pike_compiler->last_identifier)
free_string(Pike_compiler->last_identifier);
|
de1d7d | 2000-07-10 | Henrik Grubbström (Grubba) | | copy_shared_string(Pike_compiler->last_identifier, $3->u.sval.u.string);
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | |
|
4d889f | 2008-04-25 | Henrik Grubbström (Grubba) | | tmp2 = mkconstantsvaluenode(&c->default_module);
$$ = index_node(tmp2, "predef", $3->u.sval.u.string);
|
43fc17 | 1999-09-19 | Fredrik Hübinette (Hubbe) | | if(!$$->name)
add_ref( $$->name=$3->u.sval.u.string );
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | free_node(tmp2);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PREDEF TOK_COLON_COLON bad_identifier
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
a0af02 | 2006-01-21 | Henrik Grubbström (Grubba) | | | TOK_VERSION TOK_COLON_COLON TOK_IDENTIFIER
{
|
7f012e | 2014-11-09 | Henrik Grubbström (Grubba) | | $$ = find_versioned_identifier($3->u.sval.u.string,
$1->u.integer.a, $1->u.integer.b);
|
a0af02 | 2006-01-21 | Henrik Grubbström (Grubba) | | free_node($1);
free_node($3);
}
| TOK_VERSION TOK_COLON_COLON bad_identifier
{
free_node($1);
$$=0;
}
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | | inherit_specifier TOK_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
388e5d | 2008-05-30 | Henrik Grubbström (Grubba) | | int id;
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | |
|
388e5d | 2008-05-30 | Henrik 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);
|
a005eb | 1999-03-04 | Fredrik Hübinette (Hubbe) | |
|
c52846 | 2016-05-03 | Henrik Grubbström (Grubba) | | $$ = find_inherited_identifier(inherit_state, inherit_depth, $1,
Pike_compiler->last_identifier);
if (!$$) {
|
388e5d | 2008-05-30 | Henrik Grubbström (Grubba) | | if ((Pike_compiler->flags & COMPILATION_FORCE_RESOLVE) ||
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_LAST)) {
|
4f6c97 | 2019-06-11 | Henrik Grubbström (Grubba) | | if (($1 >= 0) && inherit_state->new_program &&
inherit_state->new_program->inherits[$1].name) {
|
388e5d | 2008-05-30 | Henrik 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);
|
8c6423 | 2000-06-26 | Henrik Grubbström (Grubba) | | }
|
388e5d | 2008-05-30 | Henrik Grubbström (Grubba) | | $$=0;
|
8c6423 | 2000-06-26 | Henrik Grubbström (Grubba) | | }
|
388e5d | 2008-05-30 | Henrik Grubbström (Grubba) | | else
$$=mknode(F_UNDEFINED,0,0);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
82e1b7 | 2000-06-22 | Henrik Grubbström (Grubba) | | free_node($2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c6423 | 2000-06-26 | Henrik Grubbström (Grubba) | | | inherit_specifier bad_identifier { $$=0; }
| inherit_specifier error { $$=0; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_COLON_COLON TOK_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | if(Pike_compiler->last_identifier) {
free_string(Pike_compiler->last_identifier);
}
|
de1d7d | 2000-07-10 | Henrik Grubbström (Grubba) | | copy_shared_string(Pike_compiler->last_identifier, $2->u.sval.u.string);
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | |
|
baa771 | 2016-05-06 | Henrik Grubbström (Grubba) | | $$ = find_inherited_identifier(Pike_compiler, 0, INHERIT_ALL,
|
c52846 | 2016-05-03 | Henrik Grubbström (Grubba) | | Pike_compiler->last_identifier);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | if(!$$)
{
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
|
c52846 | 2016-05-03 | Henrik Grubbström (Grubba) | | my_yyerror("Undefined identifier ::%S.", $2->u.sval.u.string);
|
2756c1 | 2002-11-27 | Henrik Grubbström (Grubba) | | }
|
c52846 | 2016-05-03 | Henrik Grubbström (Grubba) | | $$=mkintnode(0);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_COLON_COLON bad_identifier
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
408a1e | 2004-10-30 | Martin Stjernholm | | range_bound:
/* empty */
{$$ = mknode (F_RANGE_OPEN, NULL, NULL);}
|
55356e | 1999-05-26 | Fredrik Hübinette (Hubbe) | | | comma_expr
|
408a1e | 2004-10-30 | Martin 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);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | gauge: TOK_GAUGE catch_arg
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | {
|
47f976 | 2003-02-08 | Martin Stjernholm | | $$=mkopernode("`/",
mkopernode("`-",
mkopernode("`-",
mkefuncallnode("gethrvtime",
mkintnode(1)),
|
c0637b | 2001-06-25 | Henrik Grubbström (Grubba) | | mknode(F_COMMA_EXPR,
mknode(F_POP_VALUE, $2, NULL),
|
47f976 | 2003-02-08 | Martin Stjernholm | | mkefuncallnode("gethrvtime",
mkintnode(1)))),
NULL),
mkfloatnode((FLOAT_TYPE)1e9));
|
4868db | 1997-05-07 | Per Hedbor | | };
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | typeof: TOK_TYPEOF '(' expr0 ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
e9fbb7 | 2018-05-21 | Henrik Grubbström (Grubba) | | $$ = mknode(F_TYPEOF, $3, 0);
|
13670c | 2015-05-25 | Martin Nilsson | | }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_TYPEOF '(' error ')' { $$=0; yyerrok; }
| TOK_TYPEOF '(' error '}' { $$=0; yyerror("Missing ')'."); }
| TOK_TYPEOF '(' error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0; yyerror("Missing ')'.");
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_TYPEOF '(' error ';' { $$=0; yyerror("Missing ')'."); }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | ;
|
13670c | 2015-05-25 | Martin Nilsson | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | catch_arg: '(' comma_expr ')' { $$=$2; }
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | | '(' error ')' { $$=0; yyerrok; }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | '(' error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0; yyerror("Missing ')'.");
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file.");
}
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | | '(' error '}' { $$=0; yyerror("Missing ')'."); }
| '(' error ';' { $$=0; yyerror("Missing ')'."); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | block
|
4cb7d9 | 1999-12-10 | Henrik Grubbström (Grubba) | | | error { $$=0; yyerror("Bad expression for catch."); }
|
13670c | 2015-05-25 | Martin Nilsson | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | catch: TOK_CATCH
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->catch_level++;
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | }
catch_arg
{
$$=mknode(F_CATCH,$3,NULL);
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->catch_level--;
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | sscanf: TOK_SSCANF '(' expr0 ',' expr0 lvalue_list ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | if ($6 && !(THIS_COMPILATION->lex.pragmas & ID_STRICT_TYPES)) {
|
a23d57 | 2008-01-07 | Henrik Grubbström (Grubba) | | mark_lvalues_as_used($6);
}
|
fffdad | 2014-10-13 | Martin Nilsson | | $$=mknode(F_SSCANF,mknode(F_ARG_LIST,$3,$5),$6);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 ',' expr0 error ')'
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | free_node($3);
free_node($5);
yyerrok;
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 ',' expr0 error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | free_node($3);
free_node($5);
yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 ',' expr0 error '}'
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | free_node($3);
free_node($5);
yyerror("Missing ')'.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 ',' expr0 error ';'
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | free_node($3);
free_node($5);
yyerror("Missing ')'.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 error ')'
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | free_node($3);
yyerrok;
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | free_node($3);
yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 error '}'
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | free_node($3);
yyerror("Missing ')'.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' expr0 error ';'
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0;
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | free_node($3);
yyerror("Missing ')'.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' error ')' { $$=0; yyerrok; }
| TOK_SSCANF '(' error TOK_LEX_EOF
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | {
|
498ec1 | 1999-11-12 | Henrik Grubbström (Grubba) | | $$=0; yyerror("Missing ')'.");
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Unexpected end of file.");
}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_SSCANF '(' error '}' { $$=0; yyerror("Missing ')'."); }
| TOK_SSCANF '(' error ';' { $$=0; yyerror("Missing ')'."); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | lvalue: expr4
|
10fe60 | 2003-10-01 | Martin Stjernholm | | | open_bracket_with_line_info low_lvalue_list ']'
|
019596 | 2004-08-25 | Henrik Grubbström (Grubba) | | {
$$=mknode(F_ARRAY_LVALUE, $2,0);
COPY_LINE_NUMBER_INFO($$, $1);
free_node($1);
}
|
dd46aa | 2014-08-11 | Per Hedbor | | | type2 TOK_IDENTIFIER
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | int id = add_local_name($2->u.sval.u.string,compiler_pop_type(),0);
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | | /* Note: Variable intentionally not marked as used. */
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | if (id >= 0)
|
c98166 | 2006-03-02 | Henrik Grubbström (Grubba) | | $$=mklocalnode(id,-1);
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | else
$$ = 0;
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
dd46aa | 2014-08-11 | Per Hedbor | | /* FIXME: Add production for type2 ==> constant type svalue here? */
|
39245b | 1998-04-17 | Henrik Grubbström (Grubba) | | ;
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | |
low_lvalue_list: lvalue lvalue_list
{
$$=mknode(F_LVALUE_LIST,$1,$2);
}
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | lvalue_list: /* empty */ { $$ = 0; }
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | | | ',' lvalue lvalue_list
{
$$ = mknode(F_LVALUE_LIST,$2,$3);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
9aee97 | 2008-05-06 | Henrik Grubbström (Grubba) | | string_segment: TOK_STRING
| TOK_FUNCTION_NAME
{
struct compiler_frame *f = Pike_compiler->compiler_frame;
|
ff0232 | 2008-05-07 | Henrik Grubbström (Grubba) | | if (!f || (f->current_function_number < 0)) {
$$ = mkstrnode(lfun_strings[LFUN___INIT]);
|
9aee97 | 2008-05-06 | Henrik Grubbström (Grubba) | | } else {
struct identifier *id =
ID_FROM_INT(Pike_compiler->new_program, f->current_function_number);
|
28b736 | 2008-07-08 | Henrik 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);
}
|
9aee97 | 2008-05-06 | Henrik Grubbström (Grubba) | | }
}
;
string: string_segment
| string string_segment
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
3c0c28 | 1998-01-26 | Fredrik 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);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
a83d12 | 2013-11-08 | Henrik 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);
}
;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /*
* Some error-handling
*/
|
de1d7d | 2000-07-10 | Henrik Grubbström (Grubba) | | /* FIXME: Should probably set Pike_compiler->last_identifier. */
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | bad_identifier: bad_inherit
| TOK_LOCAL_ID
{ yyerror_reserved("local"); }
;
bad_inherit: bad_expr_ident
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_ARRAY_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("array"); }
|
d31508 | 2008-03-27 | Henrik Grubbström (Grubba) | | | TOK_ATTRIBUTE_ID
{ yyerror_reserved("__attribute__"); }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_BREAK
{ yyerror_reserved("break"); }
| TOK_CASE
{ yyerror_reserved("case"); }
| TOK_CATCH
{ yyerror_reserved("catch"); }
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | | TOK_CLASS
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("class"); }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_CONTINUE
{ yyerror_reserved("continue"); }
| TOK_DEFAULT
{ yyerror_reserved("default"); }
|
316e7d | 2008-04-04 | Henrik Grubbström (Grubba) | | | TOK_DEPRECATED_ID
{ yyerror_reserved("__deprecated__"); }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_DO
{ yyerror_reserved("do"); }
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | | TOK_ENUM
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("enum"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_FLOAT_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("float");}
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_FOR
{ yyerror_reserved("for"); }
| TOK_FOREACH
{ yyerror_reserved("foreach"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_FUNCTION_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("function");}
|
d31508 | 2008-03-27 | Henrik Grubbström (Grubba) | | | TOK_FUNCTION_NAME
{ yyerror_reserved("__FUNCTION__");}
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_GAUGE
{ yyerror_reserved("gauge"); }
| TOK_IF
{ yyerror_reserved("if"); }
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | | TOK_IMPORT
{ yyerror_reserved("import"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_INT_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("int"); }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_LAMBDA
{ yyerror_reserved("lambda"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_MAPPING_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("mapping"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_MIXED_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("mixed"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_MULTISET_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("multiset"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_OBJECT_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("object"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PROGRAM_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("program"); }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_RETURN
{ yyerror_reserved("return"); }
| TOK_SSCANF
{ yyerror_reserved("sscanf"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_STRING_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("string"); }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_SWITCH
{ yyerror_reserved("switch"); }
|
5e3aa5 | 2001-04-01 | Henrik Grubbström (Grubba) | | | TOK_TYPEDEF
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("typedef"); }
|
7bf71d | 2017-12-10 | Henrik Grubbström (Grubba) | | | TOK_TYPEOF
{ yyerror_reserved("typeof"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_VOID_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("void"); }
|
32bc32 | 2008-06-18 | Henrik 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);
}
|
a66319 | 1998-04-17 | Henrik Grubbström (Grubba) | | ;
bad_expr_ident:
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | TOK_INLINE
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("inline"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PREDEF
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("predef"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PRIVATE
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("private"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PROTECTED
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("protected"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_PUBLIC
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("public"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_OPTIONAL
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("optional"); }
|
8f733e | 2000-07-12 | Henrik Grubbström (Grubba) | | | TOK_VARIANT
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("variant"); }
|
fa47dd | 2016-09-27 | Henrik Grubbström (Grubba) | | | TOK_WEAK
{ yyerror_reserved("__weak__"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_STATIC
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("static"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_EXTERN
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("extern"); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_FINAL_ID
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("final");}
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_ELSE
|
2a7c7c | 1999-07-18 | Fredrik Hübinette (Hubbe) | | { yyerror("else without if."); }
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | | TOK_INHERIT
|
1fb2de | 2004-10-23 | Martin Nilsson | | { yyerror_reserved("inherit"); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | ;
|
702ea5 | 2002-10-11 | Henrik 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.
*/
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | |
|
10fe60 | 2003-10-01 | Martin Stjernholm | | /* empty: ; */ /* line_number_info is now used in these cases. */
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %%
|
2be52d | 2007-11-10 | Martin Nilsson | | static void yyerror_reserved(const char *keyword)
|
1fb2de | 2004-10-23 | Martin Nilsson | | {
|
94d66b | 2008-05-24 | Henrik Grubbström (Grubba) | | my_yyerror("%s is a reserved word.", keyword);
|
1fb2de | 2004-10-23 | Martin Nilsson | | }
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | static struct pike_string *get_new_name(struct pike_string *prefix)
|
b2e726 | 2007-09-15 | Henrik 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. */
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | (int) THIS_COMPILATION->lex.current_line);
|
28b736 | 2008-07-08 | Henrik 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);
}
|
b2e726 | 2007-09-15 | Henrik Grubbström (Grubba) | | return make_shared_string(buf);
}
|
120d84 | 2000-11-08 | Fredrik 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--)
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | if(f->variable[e].name==str) {
f->variable[e].flags |= LOCAL_VAR_IS_USED;
|
120d84 | 2000-11-08 | Fredrik Hübinette (Hubbe) | | return e;
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | }
|
120d84 | 2000-11-08 | Fredrik Hübinette (Hubbe) | | return -1;
}
|
401f2a | 2006-04-02 | Henrik 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.
*/
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | int low_add_local_name(struct compiler_frame *frame,
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_string *str,
struct pike_type *type,
node *def)
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | {
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | |
|
067ddd | 2014-08-11 | Martin Nilsson | | if (str->len) {
|
120d84 | 2000-11-08 | Fredrik Hübinette (Hubbe) | | int tmp=low_islocal(frame,str);
if(tmp>=0 && tmp >= frame->last_block_level)
|
fe8061 | 2000-09-05 | Henrik Grubbström (Grubba) | | {
|
ce060e | 2004-06-30 | Martin Nilsson | | my_yyerror("Duplicate local variable %S, "
"previous declaration on line %d\n",
str, frame->variable[tmp].line);
|
fe8061 | 2000-09-05 | Henrik Grubbström (Grubba) | | }
|
f8a4be | 2000-10-03 | Fredrik Hübinette (Hubbe) | |
if(type == void_type_string)
{
|
ce060e | 2004-06-30 | Martin Nilsson | | my_yyerror("Local variable %S is void.\n", str);
|
f8a4be | 2000-10-03 | Fredrik Hübinette (Hubbe) | | }
|
02a79a | 2000-09-04 | Fredrik Hübinette (Hubbe) | | }
|
a566ca | 1999-12-14 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(def);
debug_malloc_touch(type);
|
ef9a24 | 2006-07-06 | Henrik Grubbström (Grubba) | | debug_malloc_touch(str);
|
05ae7d | 2006-03-01 | Henrik 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)
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | {
|
401f2a | 2006-04-02 | Henrik Grubbström (Grubba) | | my_yyerror("Too many local variables: no space for local variable %S.",
str);
free_type(type);
if (def) free_node(def);
|
abdfb6 | 2002-09-28 | Martin Stjernholm | | return -1;
|
401f2a | 2006-04-02 | Henrik Grubbström (Grubba) | | } else {
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | int var = frame->current_number_of_locals;
|
ff8572 | 2021-03-22 | Henrik Grubbström (Grubba) | | if (pike_types_le(type, void_type_string, 0, 0)) {
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | if (Pike_compiler->compiler_pass == COMPILER_PASS_LAST) {
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | yywarning("Declaring local variable %S with type void "
"(converted to type zero).", str);
|
119124 | 1999-12-18 | Henrik Grubbström (Grubba) | | }
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(type);
|
be6fec | 2001-04-01 | Henrik Grubbström (Grubba) | | copy_pike_type(type, zero_type_string);
|
5fdb4d | 1999-12-18 | Henrik Grubbström (Grubba) | | }
|
1e5c8b | 2008-01-03 | Henrik Grubbström (Grubba) | | frame->variable[var].type = type;
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | frame->variable[var].name = str;
reference_shared_string(str);
frame->variable[var].def = def;
|
e021fe | 2008-04-14 | Henrik Grubbström (Grubba) | | frame->variable[var].line = THIS_COMPILATION->lex.current_line;
copy_shared_string(frame->variable[var].file,
THIS_COMPILATION->lex.current_file);
|
02a79a | 2000-09-04 | Fredrik Hübinette (Hubbe) | |
|
b3c52f | 2019-08-25 | Henrik Grubbström (Grubba) | | if (frame->generator_local != -1) {
frame->variable[var].flags = LOCAL_VAR_IS_USED | LOCAL_VAR_USED_IN_SCOPE;
|
ff8572 | 2021-03-22 | Henrik Grubbström (Grubba) | | } else if (pike_types_le(void_type_string, type, 0, 0)) {
|
4d889f | 2008-04-25 | Henrik Grubbström (Grubba) | | /* Don't warn about unused voidable variables. */
frame->variable[var].flags = LOCAL_VAR_IS_USED;
} else {
frame->variable[var].flags = 0;
}
|
02a79a | 2000-09-04 | Fredrik Hübinette (Hubbe) | |
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | frame->current_number_of_locals++;
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | if(frame->current_number_of_locals > frame->max_number_of_locals)
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | {
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | frame->max_number_of_locals = frame->current_number_of_locals;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | }
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | |
|
2c8a26 | 2008-01-03 | Henrik Grubbström (Grubba) | | return var;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | }
}
|
97f628 | 2000-03-07 | Fredrik 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,
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *type,
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | node *def)
{
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | return low_add_local_name(Pike_compiler->compiler_frame,
|
97f628 | 2000-03-07 | Fredrik Hübinette (Hubbe) | | str,
type,
def);
}
|
a23d57 | 2008-01-07 | Henrik Grubbström (Grubba) | | /* Mark local variables declared in a multi-assign or sscanf expression
* as used. */
|
6572be | 2008-01-05 | Henrik Grubbström (Grubba) | | static void mark_lvalues_as_used(node *n)
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | | {
while (n && n->token == F_LVALUE_LIST) {
|
3424a6 | 2008-06-12 | Henrik Grubbström (Grubba) | | if (!CAR(n)) {
/* Can happen if a variable hasn't been declared. */
} else if (CAR(n)->token == F_ARRAY_LVALUE) {
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | | mark_lvalues_as_used(CAAR(n));
} else if ((CAR(n)->token == F_LOCAL) && !(CAR(n)->u.integer.b)) {
|
c4e78f | 2008-01-05 | Henrik Grubbström (Grubba) | | Pike_compiler->compiler_frame->variable[CAR(n)->u.integer.a].flags |=
|
147cb7 | 2008-01-05 | Henrik Grubbström (Grubba) | | LOCAL_VAR_IS_USED;
}
n = CDR(n);
}
}
|
008035 | 2007-09-16 | Henrik 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.
*/
|
30c061 | 2008-06-29 | Martin Stjernholm | | static node *add_protected_variable(struct pike_string *name,
struct pike_type *type,
int depth,
node *initializer)
|
008035 | 2007-09-16 | Henrik 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) {
|
30c061 | 2008-06-29 | Martin Stjernholm | | my_yyerror("Too many levels of protected (%d, max:%d).",
|
008035 | 2007-09-16 | Henrik Grubbström (Grubba) | | depth, depth - (i+1));
parent_depth -= i+1;
break;
}
p->new_program->flags |= PROGRAM_USES_PARENT;
p = p->previous;
}
|
13670c | 2015-05-25 | Martin Nilsson | |
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | tmp_name = get_new_name(name);
|
008035 | 2007-09-16 | Henrik Grubbström (Grubba) | | id = define_parent_variable(p, tmp_name, type,
|
30c061 | 2008-06-29 | Martin Stjernholm | | ID_PROTECTED|ID_PRIVATE|ID_INLINE);
|
008035 | 2007-09-16 | Henrik 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,
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | mknode(F_ASSIGN,
mkidentifiernode(id), initializer)));
|
008035 | 2007-09-16 | Henrik Grubbström (Grubba) | | initializer = NULL;
}
n = mkexternalnode(id, parent_depth);
}
} else if (depth) {
f->lexical_scope|=SCOPE_SCOPE_USED;
|
28b736 | 2008-07-08 | Henrik Grubbström (Grubba) | | tmp_name = get_new_name(name);
|
008035 | 2007-09-16 | Henrik 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! */
|
30c061 | 2008-06-29 | Martin Stjernholm | | yyerror("Initializers not yet supported for protected variables with function scope.");
|
008035 | 2007-09-16 | Henrik Grubbström (Grubba) | | }
n = mklocalnode(id, depth);
}
id = add_local_name(name, type, n);
if (id >= 0) {
if (initializer) {
|
a1af30 | 2017-03-18 | Henrik Grubbström (Grubba) | | return mknode(F_ASSIGN, mklocalnode(id,0), initializer);
|
008035 | 2007-09-16 | Henrik Grubbström (Grubba) | | }
return mklocalnode(id, 0);
}
if (initializer) {
free_node(initializer);
}
return NULL;
}
#endif /* 0 */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | int islocal(struct pike_string *str)
{
|
120d84 | 2000-11-08 | Fredrik Hübinette (Hubbe) | | return low_islocal(Pike_compiler->compiler_frame, str);
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | }
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | |
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | /* argument must be a shared string */
static node *lexical_islocal(struct pike_string *str)
{
int e,depth=0;
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | struct compiler_frame *f=Pike_compiler->compiler_frame;
|
13670c | 2015-05-25 | Martin Nilsson | |
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | while(1)
{
for(e=f->current_number_of_locals-1;e>=0;e--)
{
if(f->variable[e].name==str)
{
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | struct compiler_frame *q=Pike_compiler->compiler_frame;
|
164d6b | 2001-11-29 | Henrik Grubbström (Grubba) | |
|
2d5f59 | 2008-01-03 | Henrik Grubbström (Grubba) | | f->variable[e].flags |= LOCAL_VAR_IS_USED;
|
13670c | 2015-05-25 | Martin Nilsson | | while(q!=f)
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | {
|
8322b6 | 2000-05-08 | Fredrik Hübinette (Hubbe) | | q->lexical_scope|=SCOPE_SCOPED;
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | q=q->previous;
}
|
8322b6 | 2000-05-08 | Fredrik Hübinette (Hubbe) | |
|
1faa90 | 2006-02-25 | Henrik Grubbström (Grubba) | | if(depth) {
|
8322b6 | 2000-05-08 | Fredrik Hübinette (Hubbe) | | q->lexical_scope|=SCOPE_SCOPE_USED;
|
1faa90 | 2006-02-25 | Henrik Grubbström (Grubba) | | if(q->min_number_of_locals < e+1)
q->min_number_of_locals = e+1;
|
9d5208 | 2016-10-30 | Martin Karlgren | | q->variable[e].flags |= LOCAL_VAR_USED_IN_SCOPE;
|
1faa90 | 2006-02-25 | Henrik Grubbström (Grubba) | | }
|
9ed8de | 2001-12-06 | Henrik 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);
}
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | return mklocalnode(e,depth);
}
}
|
8322b6 | 2000-05-08 | Fredrik Hübinette (Hubbe) | | if(!(f->lexical_scope & SCOPE_LOCAL)) return 0;
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | depth++;
f=f->previous;
}
}
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | static node *safe_inc_enum(node *n)
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | {
JMP_BUF recovery;
|
eab66a | 2016-03-13 | Arne Goedeke | | node *ret;
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | STACK_LEVEL_START(0);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | |
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | if (SETJMP(recovery)) {
|
37338b | 2003-11-14 | Martin Stjernholm | | handle_compile_exception ("Bad implicit enum value (failed to add 1).");
|
3601d3 | 2002-11-23 | Martin Stjernholm | | push_int(0);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | } else {
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | if (n->token != F_CONSTANT) Pike_fatal("Bad node to safe_inc_enum().\n");
push_svalue(&n->u.sval);
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | push_int(1);
f_add(2);
}
UNSETJMP(recovery);
|
3601d3 | 2002-11-23 | Martin Stjernholm | | STACK_LEVEL_DONE(1);
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | free_node(n);
|
eab66a | 2016-03-13 | Arne Goedeke | | ret = mkconstantsvaluenode(Pike_sp-1);
|
e33ab9 | 2008-07-18 | Henrik Grubbström (Grubba) | | pop_stack();
|
eab66a | 2016-03-13 | Arne Goedeke | | return ret;
|
a418ce | 2001-03-31 | Henrik Grubbström (Grubba) | | }
|
7f012e | 2014-11-09 | Henrik 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;
|
7b3c00 | 2018-07-11 | Henrik Grubbström (Grubba) | | node *res;
|
7f012e | 2014-11-09 | Henrik 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. */
|
7b3c00 | 2018-07-11 | Henrik Grubbström (Grubba) | | res = NULL;
|
7f012e | 2014-11-09 | Henrik 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) ||
|
bdfe4e | 2017-12-11 | Henrik Grubbström (Grubba) | | (Pike_compiler->compiler_pass == COMPILER_PASS_LAST)) {
|
7f012e | 2014-11-09 | Henrik 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;
}
|
9036e8 | 2001-08-16 | Martin Stjernholm | |
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | static int call_handle_import(void)
|
9036e8 | 2001-08-16 | Martin Stjernholm | | {
|
dbbb40 | 2018-11-03 | Tobias S. Josefowitz | | if (safe_apply_low2(Pike_fp->current_object,
PC_HANDLE_IMPORT_FUN_NUM
+ Pike_fp->context->identifier_level, 1, NULL)) {
|
d3c9c9 | 2018-07-12 | Henrik 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;
|
9036e8 | 2001-08-16 | Martin Stjernholm | | pop_stack();
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | my_yyerror("Couldn't find module to import.");
|
d3c9c9 | 2018-07-12 | Henrik Grubbström (Grubba) | | return 0;
|
9036e8 | 2001-08-16 | Martin Stjernholm | | }
|
d3c9c9 | 2018-07-12 | Henrik 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();
|
9036e8 | 2001-08-16 | Martin Stjernholm | |
return 0;
}
|
b75419 | 2016-01-19 | Henrik Grubbström (Grubba) | | /* Set compiler_frame->current_type from the type stack. */
|
088097 | 2019-03-26 | Henrik Grubbström (Grubba) | | static void update_current_type(void)
|
b75419 | 2016-01-19 | Henrik Grubbström (Grubba) | | {
|
e25c3d | 2021-02-21 | Henrik 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);
}
}
|
b75419 | 2016-01-19 | Henrik 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();
}
|