5f4f12acf3
* 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.
255 lines
6 KiB
C
255 lines
6 KiB
C
/***************************************************************************
|
|
|
|
gbc_trans.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 __GBC_TRANS_H
|
|
#define __GBC_TRANS_H
|
|
|
|
#include "gbc_type.h"
|
|
#include "gb_reserved.h"
|
|
#include "gbc_read.h"
|
|
#include "gb_limit.h"
|
|
|
|
#include "gbc_trans_common.h"
|
|
|
|
enum {
|
|
TT_NOTHING = 0,
|
|
TT_DO_NOT_CHECK_AS = 1,
|
|
TT_CAN_EMBED = 2,
|
|
TT_CAN_ARRAY = 4,
|
|
TT_CAN_NEW = 8
|
|
};
|
|
|
|
enum {
|
|
TS_MODE_READ = (1 << 0),
|
|
TS_MODE_WRITE = (1 << 1),
|
|
TS_MODE_APPEND = (1 << 2),
|
|
TS_MODE_CREATE = (1 << 3),
|
|
TS_MODE_DIRECT = (1 << 4),
|
|
TS_MODE_WATCH = (1 << 6),
|
|
TS_MODE_PIPE = (1 << 7),
|
|
TS_MODE_MEMORY = (1 << 8),
|
|
TS_MODE_STRING = (1 << 9),
|
|
};
|
|
|
|
enum {
|
|
TS_EXEC_NONE = 0,
|
|
TS_EXEC_READ = (1 << 0),
|
|
TS_EXEC_WRITE = (1 << 1),
|
|
TS_EXEC_TERM = (1 << 2),
|
|
TS_EXEC_STRING = (1 << 3),
|
|
TS_EXEC_WAIT = (1 << 4),
|
|
TS_EXEC_ERROR = (1 << 5)
|
|
};
|
|
|
|
enum {
|
|
TS_SUBR_PRINT,
|
|
TS_SUBR_INPUT,
|
|
TS_SUBR_WRITE,
|
|
TS_SUBR_WRITE_BYTES,
|
|
TS_SUBR_READ,
|
|
TS_SUBR_READ_BYTES,
|
|
TS_SUBR_OPEN,
|
|
TS_SUBR_CLOSE,
|
|
TS_SUBR_SEEK,
|
|
TS_SUBR_LINE_INPUT,
|
|
TS_SUBR_FLUSH,
|
|
TS_SUBR_EXEC,
|
|
TS_SUBR_SHELL,
|
|
TS_SUBR_WAIT,
|
|
TS_SUBR_KILL,
|
|
TS_SUBR_MOVE,
|
|
TS_SUBR_MKDIR,
|
|
TS_SUBR_RMDIR,
|
|
TS_SUBR_ARRAY,
|
|
TS_SUBR_COLLECTION,
|
|
TS_SUBR_COPY,
|
|
TS_SUBR_LINK,
|
|
TS_SUBR_ERROR,
|
|
TS_SUBR_LOCK,
|
|
TS_SUBR_UNLOCK,
|
|
TS_SUBR_LOCK_WAIT,
|
|
TS_SUBR_INPUT_FROM,
|
|
TS_SUBR_OUTPUT_TO,
|
|
TS_SUBR_DEBUG,
|
|
TS_SUBR_SLEEP,
|
|
TS_SUBR_RANDOMIZE,
|
|
TS_SUBR_ERROR_TO,
|
|
TS_SUBR_LEFT,
|
|
TS_SUBR_MID,
|
|
TS_SUBR_OPEN_MEMORY,
|
|
TS_SUBR_CHMOD,
|
|
TS_SUBR_CHOWN,
|
|
TS_SUBR_CHGRP,
|
|
TS_SUBR_USE,
|
|
TS_SUBR_CHECK_EXEC,
|
|
TS_SUBR_MOVE_KILL
|
|
};
|
|
|
|
enum {
|
|
TSO_SUBR_SCAN
|
|
};
|
|
|
|
enum {
|
|
TS_NONE = -1,
|
|
TS_STDIN = 0,
|
|
TS_STDOUT = 1,
|
|
TS_STDERR = 2
|
|
};
|
|
|
|
#define TS_NO_SUBR ((void (*)())-1)
|
|
|
|
#ifndef __GBC_TRANS_C
|
|
EXTERN short TRANS_in_assignment;
|
|
EXTERN short TRANS_in_left_value;
|
|
EXTERN bool TRANS_in_try;
|
|
EXTERN ushort *TRANS_labels;
|
|
#endif
|
|
|
|
#define TRANS_newline() (PATTERN_is_newline(*JOB->current) ? JOB->line = PATTERN_index(*JOB->current) + 1, JOB->current++, TRUE : FALSE)
|
|
|
|
void TRANS_reset(void);
|
|
/*PUBLIC bool TRANS_type(bool check_as, bool square, bool array, bool new, TRANS_DECL *result);*/
|
|
bool TRANS_type(int flag, TRANS_DECL *result);
|
|
bool TRANS_get_number(int index, TRANS_NUMBER *result);
|
|
bool TRANS_check_declaration(void);
|
|
PATTERN *TRANS_get_constant_value(TRANS_DECL *decl, PATTERN *current);
|
|
|
|
void TRANS_want(int reserved, char *msg);
|
|
void TRANS_want_newline(void);
|
|
//int TRANS_get_class(PATTERN pattern);
|
|
bool TRANS_is_end_function(bool is_proc, PATTERN *look);
|
|
char *TRANS_get_num_desc(int num);
|
|
|
|
#define TRANS_is(_reserved) (PATTERN_is(*JOB->current, (_reserved)) ? JOB->current++, TRUE : FALSE)
|
|
#define TRANS_ignore(_reserved) (void)TRANS_is(_reserved)
|
|
|
|
/* trans_code.c */
|
|
|
|
void TRANS_code(void);
|
|
#define TRANS_has_init_var(_decl) ((_decl)->is_new || (_decl)->init)
|
|
bool TRANS_init_var(TRANS_DECL *decl);
|
|
void TRANS_statement(void);
|
|
void TRANS_init_optional(TRANS_PARAM *param);
|
|
#define TRANS_add_label(_pos) (TRANS_labels ? *ARRAY_add(&TRANS_labels) = (_pos) : 0)
|
|
|
|
/* trans_expr.c */
|
|
|
|
void TRANS_expression(bool check);
|
|
void TRANS_ignore_expression(void);
|
|
bool TRANS_popify_last(void);
|
|
void TRANS_reference(void);
|
|
bool TRANS_affectation(bool dup);
|
|
void TRANS_operation(short op, short nparam, bool output, PATTERN previous);
|
|
void TRANS_new(void);
|
|
TYPE TRANS_variable_get_type(void);
|
|
void TRANS_class(int index);
|
|
bool TRANS_string(PATTERN pattern);
|
|
|
|
/* trans_tree.c */
|
|
|
|
#define RS_UNARY (-1)
|
|
|
|
//TRANS_TREE *TRANS_tree(bool check_statement);
|
|
void TRANS_tree(bool check_statement, TRANS_TREE **result, int *count);
|
|
|
|
/* trans_ctrl.c */
|
|
|
|
void TRANS_control_init(void);
|
|
void TRANS_control_exit(void);
|
|
|
|
void TRANS_if(void);
|
|
void TRANS_else(void);
|
|
void TRANS_endif(void);
|
|
void TRANS_goto(void);
|
|
void TRANS_gosub(void);
|
|
void TRANS_on_goto_gosub(void);
|
|
void TRANS_do(int type);
|
|
void TRANS_loop(int type);
|
|
void TRANS_select(void);
|
|
void TRANS_case(void);
|
|
void TRANS_default(void);
|
|
void TRANS_end_select(void);
|
|
void TRANS_break(void);
|
|
void TRANS_continue(void);
|
|
void TRANS_return(void);
|
|
void TRANS_for(void);
|
|
void TRANS_for_each(void);
|
|
void TRANS_next(void);
|
|
void TRANS_try(void);
|
|
void TRANS_finally(void);
|
|
void TRANS_catch(void);
|
|
void TRANS_label(void);
|
|
void TRANS_with(void);
|
|
void TRANS_use_with(void);
|
|
void TRANS_end_with(void);
|
|
void TRANS_raise(void);
|
|
void TRANS_stop(void);
|
|
|
|
/* trans_subr.c */
|
|
|
|
void TRANS_subr(int subr, int nparam);
|
|
|
|
void TRANS_print(void);
|
|
void TRANS_input(void);
|
|
void TRANS_read(void);
|
|
void TRANS_read_old(void);
|
|
void TRANS_write(void);
|
|
void TRANS_open(void);
|
|
void TRANS_pipe(void);
|
|
void TRANS_memory(void);
|
|
void TRANS_open_string(void);
|
|
void TRANS_close(void);
|
|
void TRANS_lock(void);
|
|
void TRANS_unlock(void);
|
|
void TRANS_seek(void);
|
|
void TRANS_line_input(void);
|
|
void TRANS_flush(void);
|
|
void TRANS_quit(void);
|
|
void TRANS_exec(void);
|
|
void TRANS_shell(void);
|
|
void TRANS_wait(void);
|
|
void TRANS_sleep(void);
|
|
void TRANS_kill(void);
|
|
void TRANS_move(void);
|
|
void TRANS_chmod(void);
|
|
void TRANS_chown(void);
|
|
void TRANS_chgrp(void);
|
|
void TRANS_inc(void);
|
|
void TRANS_dec(void);
|
|
void TRANS_swap(void);
|
|
void TRANS_mkdir(void);
|
|
void TRANS_rmdir(void);
|
|
void TRANS_use(void);
|
|
void TRANS_copy(void);
|
|
void TRANS_link(void);
|
|
void TRANS_input_from(void);
|
|
void TRANS_output_to(void);
|
|
void TRANS_debug(void);
|
|
void TRANS_error(void);
|
|
void TRANS_scan(void);
|
|
void TRANS_randomize(void);
|
|
void TRANS_mid(void);
|
|
void TRANS_use(void);
|
|
|
|
#endif
|
|
|