gambas-source-code/main/share/gb_reserved.h
gambas 5f4f12acf3 [COMPILER]
* NEW: UNSAFE is a new keyword used in conjunction with FAST. It tells the JIT compiler not to do any safety check (null objects, division by zero, out of array bounds...). It makes the code a bit faster, but prone to segmentation fault.

[INTERPRETER]
* NEW: Support for the UNSAFE keyword.

[GB.JIT]
* NEW: Support for the UNSAFE keyword.
* NEW: Check validity of objects that can be invalid.
2018-06-29 00:10:31 +02:00

367 lines
6.3 KiB
C

/***************************************************************************
gb_reserved.h
(c) 2000-2017 Benoît Minisini <g4mba5@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
***************************************************************************/
#ifndef __GB_RESERVED_H
#define __GB_RESERVED_H
#include "gb_common.h"
#include "gb_table.h"
enum
{
RSF_NONE = 0x0000,
RSF_OP = 0x0001,
RSF_TYPE = 0x0002,
RSF_ASGN = 0x0004,
RSF_NOT = 0x0008, // operator can have NOT before it
RSF_N_ARY = 0x0000,
RSF_UNARY = 0x0010,
RSF_BINARY = 0x0020,
RSF_POST = 0x0030,
RSF_ONLY = 0x0040,
RSF_OPN = 0x0001,
RSF_OP1 = 0x0011,
RSF_OP2 = 0x0021,
RSF_OPP = 0x0031,
RSF_OP2S = 0x0061,
RSF_OP2SM = 0x00A1,
RSF_POINT = 0x0100, // last pattern is a point or an exclamation mark
RSF_IDENT = 0x0200, // last pattern waits for an identifier
RSF_CLASS = 0x0400, // last pattern waits for a class
RSF_AS = 0x0800, // last pattern waits for a datatype
RSF_PREV = 0x1000, // last pattern use the flags of the last last pattern
RSF_EVENT = 0x2000, // last pattern waits for an event name
RSF_PUB = 0x4000, // last pattern is PUBLIC, PRIVATE or STATIC
RSF_IMASK = 0xFF00
};
enum {
RST_SAME = 17, // T_OBJECT + 1
RST_ADD,
RST_AND,
RST_NOT,
RST_BCLR,
RST_MIN,
RST_MOD,
RST_GET,
};
#define RES_is_operator(value) (COMP_res_info[value].flag & RSF_OP)
#define RES_is_type(value) (COMP_res_info[value].flag & RSF_TYPE)
#define RES_is_assignment(value) (COMP_res_info[value].flag & RSF_ASGN)
#define RES_is_only(value) (COMP_res_info[value].flag & RSF_ONLY)
#define RES_get_ident_flag(value) (COMP_res_info[value].flag & RSF_IMASK)
#define RES_get_read_switch(value) (COMP_res_info[value].read_switch)
#define RES_priority(_res) (COMP_res_info[_res].priority)
#define RES_is_unary(value) ((COMP_res_info[value].flag & 0x30) == RSF_UNARY)
#define RES_is_binary(value) ((COMP_res_info[value].flag & 0x30) == RSF_BINARY)
#define RES_is_n_ary(value) ((COMP_res_info[value].flag & 0x30) == RSF_N_ARY)
#define RES_is_post(value) ((COMP_res_info[value].flag & 0x30) == RSF_POST)
#define RES_get_type(_res) (COMP_res_info[_res].value)
#define RES_get_assignment_operator(_res) (COMP_res_info[_res].value)
#define RES_can_have_not_before(value) (COMP_res_info[value].flag & RSF_NOT)
typedef
enum {
RS_NONE,
RS_BOOLEAN,
RS_BYTE,
RS_DATE,
RS_SINGLE,
RS_FLOAT,
RS_INTEGER,
RS_LONG,
RS_SHORT,
RS_STRING,
RS_VARIANT,
RS_OBJECT,
RS_POINTER,
RS_CLASS,
RS_FUNCTION,
RS_STRUCT,
RS_CONST,
RS_PRIVATE,
RS_PUBLIC,
RS_STATIC,
RS_FAST,
RS_UNSAFE,
RS_PROPERTY,
RS_EVENT,
RS_INHERITS,
RS_IMPLEMENTS,
RS_EXPORT,
RS_AS,
RS_OF,
RS_DIM,
RS_NEW,
RS_PROCEDURE,
RS_SUB,
RS_RETURN,
RS_OPTIONAL,
RS_OUTPUT,
RS_DO,
RS_LOOP,
RS_WHILE,
RS_UNTIL,
RS_REPEAT,
RS_WEND,
RS_IF,
RS_THEN,
RS_ELSE,
RS_ENDIF,
RS_END,
RS_FOR,
RS_TO,
RS_DOWNTO,
RS_FROM,
RS_STEP,
RS_NEXT,
RS_SELECT,
RS_CASE,
RS_EXIT,
RS_BREAK,
RS_CONTINUE,
RS_GOTO,
RS_GOSUB,
RS_ON,
RS_ME,
RS_LAST,
RS_TRY,
RS_FINALLY,
RS_CATCH,
RS_WITH,
RS_TRUE,
RS_FALSE,
RS_SWAP,
RS_NULL,
RS_EXTERN,
RS_EACH,
RS_IN,
RS_DEFAULT,
RS_STOP,
RS_QUIT,
RS_RAISE,
RS_ERROR,
RS_SUPER,
RS_ENUM,
RS_LET,
RS_PINF,
RS_MINF,
RS_USE,
RS_PRINT,
RS_INPUT,
RS_READ,
RS_WRITE,
RS_OPEN,
RS_CLOSE,
RS_SEEK,
RS_APPEND,
RS_CREATE,
RS_BINARY,
RS_LINE,
RS_FLUSH,
RS_EXEC,
RS_SHELL,
RS_WAIT,
RS_SLEEP,
RS_KILL,
RS_MOVE,
RS_COPY,
RS_INC,
RS_DEC,
RS_MKDIR,
RS_RMDIR,
RS_WATCH,
RS_LINK,
RS_LOCK,
RS_UNLOCK,
RS_LIBRARY,
RS_DEBUG,
RS_PIPE,
RS_RANDOMIZE,
RS_BYREF,
RS_MEMORY,
RS_CHMOD,
RS_CHOWN,
RS_CHGRP,
RS_P_IF,
RS_P_ELSE,
RS_P_ENDIF,
RS_P_CONST,
RS_P_LINE,
RS_COLON,
RS_SCOLON,
RS_COMMA,
RS_3PTS,
RS_SHARP,
RS_AT,
RS_QUES,
RS_LBRC,
RS_RBRC,
RS_EQUAL,
RS_NEAR,
RS_LBRA,
RS_RBRA,
RS_PT,
RS_EXCL,
RS_PLUS,
RS_MINUS,
RS_STAR,
RS_SLASH,
RS_FLEX,
RS_AMP,
RS_FILE,
RS_GT,
RS_LT,
RS_GE,
RS_LE,
RS_NE,
RS_LSQR,
RS_RSQR,
RS_AND,
RS_OR,
RS_NOT,
RS_XOR,
RS_BSLASH,
RS_DIV,
RS_PERCENT,
RS_MOD,
RS_IS,
RS_NOT_IS,
RS_LIKE,
RS_NOT_LIKE,
RS_BEGINS,
RS_NOT_BEGINS,
RS_ENDS,
RS_NOT_ENDS,
RS_PLUS_EQ,
RS_MINUS_EQ,
RS_STAR_EQ,
RS_SLASH_EQ,
RS_DIV_EQ,
RS_MOD_EQ,
RS_AMP_EQ,
RS_FILE_EQ,
}
RESERVED_ID;
enum
{
OP_NONE ,
OP_COLON ,
OP_EQUAL ,
OP_NEAR ,
OP_LBRA ,
OP_RBRA ,
OP_PT ,
OP_EXCL ,
OP_COMMA ,
OP_3PTS ,
OP_PLUS ,
OP_MINUS ,
OP_STAR ,
OP_SLASH ,
OP_FLEX ,
OP_AMP ,
OP_FILE ,
OP_GT ,
OP_LT ,
OP_GE ,
OP_LE ,
OP_NE ,
OP_LSQR ,
OP_RSQR ,
OP_AND ,
OP_OR ,
OP_NOT ,
OP_XOR ,
OP_DIV ,
OP_MOD ,
OP_IS ,
OP_LIKE
};
typedef
struct {
const char *name;
short flag;
uchar value;
uchar read_switch;
uchar priority;
uchar type;
ushort code;
ushort subcode;
void (*func)();
}
COMP_INFO;
typedef
struct {
const char *name;
ushort opcode;
ushort optype;
uchar type;
short min_param;
short max_param;
}
SUBR_INFO;
#ifndef __RESERVED_C
EXTERN COMP_INFO COMP_res_info[];
EXTERN SUBR_INFO COMP_subr_info[];
//EXTERN TABLE *COMP_res_table;
//EXTERN TABLE *COMP_subr_table;
EXTERN int SUBR_VarPtr;
EXTERN int SUBR_IsMissing;
EXTERN int SUBR_Mid;
EXTERN int SUBR_MidS;
#endif
void RESERVED_init(void);
void RESERVED_exit(void);
int RESERVED_find_word(const char *word, int len);
int RESERVED_find_subr(const char *word, int len);
SUBR_INFO *SUBR_get(const char *subr_name);
SUBR_INFO *SUBR_get_from_opcode(ushort opcode, ushort optype);
int RESERVED_get_from_opcode(ushort code);
#endif