gambas-source-code/main/gbx/gbx_exec.h
Benoît Minisini d3501bf140 [DEVELOPMENT ENVIRONMENT]
* NEW: Work continues on integrating the database manager.
* NEW: Some cosmetic changes in the way controls are drawing on the form
  editor.
* NEW: Panels with Border property set to None are now drawn with a light 
  border.
* BUG: Fix the "Show tab" button and menu.

[INTERPRETER]
* NEW: _attach is a new dynamic special method that is called when an 
  object is attached to or detached from its event observer. The first 
  argument of this method is the event observer, and the second argument 
  the event handler prefix.

[COMPILER]
* NEW: An expression can be a NEW instruction now. Beware that it does not 
  work inside braces.

[GB.DB]
* BUG: Fix an error message in the sqlite handler.

[GB.DB.FORM]
* NEW: DataSource.Table can now be any SQL query. The Filter property is 
  ignored in that case.
* BUG: Setting DataSource.Table to NULL correctly resets the DataSource and
  its children.
* NEW: DataView automatically adjusts the height of its rows to the 
  contents.
* NEW: DataSource.CacheSize is a new property to set the number of rows 
  stored in the internal DataSource cache. When this property is set to 
  zero, the cache size takes its default value (64 rows).

[GB.DB.SQLITE2]
* BUG: Fix a crash in datatype mapping.

[GB.DB.SQLITE3]
* BUG: Fix a crash in datatype mapping.

[GB.QT4]
* BUG: Window.AutoResize property works as expected now.
* OPT: Some optimizations in GridView.
* NEW: GridView.Rows[].Visible returns if a specific row is visible.
* NEW: GridView.Rows[].EnsureVisible ensures that a specific row is 
  visible.
* BUG: Draw.Style.Panel draws the same thing as a panel border now.
* BUG: Window.Closed always returns the accurate value now.


git-svn-id: svn://localhost/gambas/trunk@2108 867c0c6c-44f3-4631-809d-bfa615b0a4ec
2009-07-12 21:49:13 +00:00

254 lines
5.7 KiB
C

/***************************************************************************
exec.h
Subroutines for the interpreter : executing methods, native methods,
the NEW operator, the casting operator, etc.
(c) 2000-2007 Benoit Minisini <gambas@users.sourceforge.net>
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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
***************************************************************************/
#ifndef __GBX_EXEC_H
#define __GBX_EXEC_H
#include "gb_alloc.h"
#include "gb_error.h"
#include "gbx_class.h"
#include "gbx_value.h"
#include "gb_pcode.h"
#include "gbx_stack.h"
#include "gbx_string.h"
#include "gbx_object.h"
#include "gbx_variant.h"
#include "gbx_array.h"
#include "gbx_c_enum.h"
typedef
void (*EXEC_FUNC)();
typedef
struct {
CLASS *class;
OBJECT *object;
int index;
//FUNCTION *func;
CLASS_DESC_METHOD *desc;
int nparam;
int nparvar;
bool drop;
bool native;
bool use_stack;
bool property;
const char *unknown;
}
EXEC_FUNCTION;
typedef
struct {
void (*main)();
void (*loop)();
void (*wait)();
void (*timer)();
void (*lang)();
void (*watch)();
void (*post)();
void (*quit)();
void (*error)();
int (*image)();
int (*picture)();
}
EXEC_HOOK;
#ifndef __GBX_EXEC_C
EXTERN STACK_CONTEXT EXEC_current;
EXTERN PCODE EXEC_code;
EXTERN VALUE *SP;
EXTERN VALUE TEMP;
EXTERN VALUE RET;
EXTERN EXEC_FUNCTION EXEC;
EXTERN VALUE *EXEC_super;
EXTERN bool EXEC_debug;
EXTERN bool EXEC_arch;
EXTERN bool EXEC_fifo;
EXTERN const char *EXEC_fifo_name;
EXTERN bool EXEC_keep_library;
EXTERN EXEC_HOOK EXEC_Hook;
EXTERN CENUM *EXEC_enum;
EXTERN bool EXEC_big_endian;
EXTERN bool EXEC_main_hook_done;
EXTERN int EXEC_return_value;
EXTERN bool EXEC_got_error;
/*EXTERN long EXEC_const[];*/
#endif
/* Local variables base pointer */
#define BP EXEC_current.bp
/* Current class */
#define CP EXEC_current.cp
/* Current object */
#define OP EXEC_current.op
/* Paramters base pointer */
#define PP EXEC_current.pp
/* Save stack pointer for a TRY */
#define EP EXEC_current.ep
/* Current function */
#define FP EXEC_current.fp
/* Program counter */
#define PC EXEC_current.pc
/* Where to go if there is an error */
#define EC EXEC_current.ec
/* Save register for TRY */
#define ET EXEC_current.et
/* Last break in the function */
#define TC EXEC_current.tc
/* Stack at the last break in the function */
#define TP EXEC_current.tp
/* Function return value pointer */
#define RP (&RET)
#define HOOK(func) (!EXEC_Hook.func) ? 0 : (*EXEC_Hook.func)
#define HOOK_DEFAULT(func, def) (*((!EXEC_Hook.func) ? def : EXEC_Hook.func))
#define GET_NPARAM(var) short var = *PC & 0x3F
#define GET_PARAM(var, nparam) VALUE *var = &SP[-nparam]
void EXEC_init(void);
void EXEC_enter_check(bool defined);
void EXEC_enter(void);
void EXEC_enter_quick(void);
void EXEC_leave(bool drop);
void EXEC_loop(void);
void EXEC_object(VALUE *SP, CLASS **pclass, OBJECT **pobject, bool *pdefined);
void *EXEC_auto_create(CLASS *class, bool ref);
bool EXEC_call_native(void (*exec)(), void *object, TYPE type, VALUE *param);
void EXEC_native_check(bool defined);
void EXEC_native_quick(void);
void EXEC_native();
void EXEC_function_real();
void EXEC_function_loop();
#define EXEC_function() EXEC_function_real(), EXEC_release_return_value()
#define EXEC_function_keep() EXEC_function_real()
void EXEC_public(CLASS *class, void *object, const char *name, int nparam);
bool EXEC_spec(int spec, CLASS *class, void *object, int nparam, bool drop);
#define EXEC_special EXEC_spec
void EXEC_special_inheritance(int special, CLASS *class, OBJECT *object, int nparam, bool drop);
void EXEC_nop(void);
void EXEC_ILLEGAL(void);
void EXEC_push_unknown(ushort code);
void EXEC_push_array(ushort code);
//void EXEC_push_special(void);
void EXEC_pop_unknown(void);
void EXEC_pop_array(ushort code);
void EXEC_enum_first(PCODE code);
bool EXEC_enum_next(PCODE code);
void *EXEC_create_object(CLASS *class, int np, char *event);
void EXEC_new(void);
void EXEC_release_return_value(void);
void EXEC_quit(void);
void EXEC_dup(int n);
void EXEC_borrow(TYPE type, VALUE *val);
void UNBORROW(VALUE *val);
void EXEC_release(TYPE type, VALUE *val);
void RELEASE_many(VALUE *val, int n);
#define BORROW(_value) \
{ \
VALUE *_v = (_value); \
TYPE type = _v->type; \
if (TYPE_is_object(type)) \
{ \
OBJECT_REF(_v->_object.object, "BORROW"); \
} \
else if (type == T_STRING) \
STRING_ref(_v->_string.addr); \
else \
EXEC_borrow(type, _v); \
}
#define RELEASE(_value) \
do { \
VALUE *_v = (_value); \
TYPE type = _v->type; \
if (TYPE_is_object(type)) \
{ \
OBJECT_UNREF(_v->_object.object, "RELEASE"); \
} \
else if (type == T_STRING) \
STRING_unref(&_v->_string.addr); \
else \
EXEC_release(type, _v); \
} while (0)
#define RELEASE_MANY(_val, _n) \
do { \
if (_n) \
{ \
if ((_n) == 1) \
{ \
_val--; \
RELEASE((_val)); \
} \
else \
{ \
RELEASE_many((_val), (_n)); \
_val -= (_n); \
} \
} \
} while (0)
#define PUSH() \
do { \
BORROW(SP); \
SP++; \
} while (0)
#define POP() \
do { \
SP--; \
RELEASE(SP); \
} while (0)
#define COPY_VALUE(_dst, _src) VALUE_copy(_dst, _src)
#endif /* */