gambas-source-code/main/gbx/gbx_class.h
Benoît Minisini 5f900c0b68 [DEVELOPMENT ENVIRONMENT]
* NEW: English and french tips were updated. A new tip was added.
* NEW: Files that were opened at project close are automatically reopened
  when the project is loaded again.
* NEW: A warning message is displayed when the GNU translation tools are
  not installed.
* BUG: The code editor method combo-box is correctly updated now.
* BUG: Some fixes in the automatic completion.
* BUG: Replace points by dash in the name of packages generated by the IDE
  packager.
* NEW: Updated russian translation
* NEW: Updated french translation

[DATABASE MANAGER]
* NEW: Updated russian translation

[EXAMPLES]
* BUG: Fixed the Gravity and the GameOfLife examples so that they do not
  use public form controls anymore.

[INTERPRETER]
* OPT: Many optimizations in the string substitution routines, the 
  internal datatype conversions, the INPUT and LINE INPUT instructions, the 
  error messages generation, the object and string reference counting, and
  the memory allocation routines.
* NEW: Opening a device file in direct mode (FOR READ/WRITE) is now 
  automatically non blocking.
* OPT: Lof() now only tries its different methods (ioctl and lseek) once.
* BUG: Val() now ignores thousand separators characters at the end of the 
  number.
* NEW: A new flag for enabling the stack trace generation at each error.

[GB.DEBUG]
* BUG: The gb.debug component interface declaration was not 64-bits aware.

[GB.EVAL]
* BUG: The Highlight.Purge() method now correctly deals with non-ASCII 
 characters.

[GB.FORM]
* BUG: TableView.Edit() does not raise a "read-only combo-box" error 
  anymore.
  
[GB.FORM.DIALOG]
* BUG: Dialog buttons now are never cut.

[GB.GTK]
* BUG: Cached drawing areas are correctly redrawn now.
* BUG: Loading big images now works correctly. There is apparently a bug 
  in the GTK+ image loader, and I found a workaround.
* BUG: Message boxes correctly display the text of their buttons now.

[GB.QT]
* BUG: The Open, and initial Move and Resize event of embedded forms are 
  now always raised when you call the Show method or if you set the Visible
  property. Before, it was raised when the embedded form was actually 
  shown.

[GB.SETTINGS]
* NEW: Settings are now stored in ~/.config/gambasX, where X is the 
  gambas version number.
* BUG: Strings are correctly quoted inside the settings file now.

[GB.WEB]
* NEW: Application.Protocol is a new property that allows to tell the 
  component that the protocol is not necessarily "http".


git-svn-id: svn://localhost/gambas/trunk@1153 867c0c6c-44f3-4631-809d-bfa615b0a4ec
2008-03-11 13:29:47 +00:00

467 lines
11 KiB
C

/***************************************************************************
gbx_class.h
(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_CLASS_H
#define __GBX_CLASS_H
#include "gb_error.h"
#include "gb_alloc.h"
#include "gbx_type.h"
#include "gb_table.h"
#include "gbx_class_desc.h"
#include "gbx_component.h"
typedef
int CLASS_ID;
/*
typedef
struct {
unsigned char flag;
unsigned char id;
short value;
}
PACKED
CLASS_TYPE;
*/
typedef
struct {
CTYPE type;
int pos;
}
PACKED
CLASS_VAR;
typedef
struct _CLASS *CLASS_REF;
typedef
char *CLASS_UNKNOWN;
typedef
union {
int type;
struct { int type; double value; } PACKED _float;
struct { int type; int value; } PACKED _integer;
struct { int type; int64_t value; } PACKED _long;
struct { int type; char *addr; int len; } PACKED _string;
struct { int type; int val[2]; } PACKED _swap;
}
PACKED
CLASS_CONST;
typedef
struct {
CTYPE type;
}
PACKED
CLASS_LOCAL;
typedef
struct {
TYPE type;
}
PACKED
CLASS_PARAM;
typedef
struct {
SYMBOL sym;
int value;
}
LOCAL_SYMBOL;
typedef
struct {
unsigned short line;
unsigned short nline;
unsigned short *pos;
char *name;
LOCAL_SYMBOL *local;
short n_local;
unsigned short _reserved;
}
PACKED
FUNC_DEBUG;
typedef
struct {
TYPE type;
char n_param;
char npmin;
char vararg;
char _reserved;
short n_local;
short n_ctrl;
short stack_usage;
short error;
unsigned short *code;
CLASS_PARAM *param;
CLASS_LOCAL *local;
FUNC_DEBUG *debug;
}
PACKED
FUNCTION;
typedef
struct {
TYPE type;
short n_param;
short _reserved;
CLASS_PARAM *param;
char *name;
}
PACKED
CLASS_EVENT;
typedef
struct {
TYPE type;
short n_param;
unsigned loaded : 1;
unsigned _reserved : 15;
CLASS_PARAM *param;
char *alias;
char *library;
}
PACKED
CLASS_EXTERN;
typedef
struct {
uint magic;
uint version;
uint endian;
uint flag;
}
PACKED
CLASS_HEADER;
typedef
struct {
short parent;
short flag;
int s_static;
int s_dynamic;
}
PACKED
CLASS_INFO;
typedef
struct {
CTYPE type;
int dim[0];
}
CLASS_ARRAY;
typedef
CLASS_ARRAY *CLASS_ARRAY_P;
struct _CLASS;
typedef
struct {
SYMBOL sym;
CTYPE ctype;
int value;
}
GLOBAL_SYMBOL;
typedef
struct {
short n_cst;
short n_stat;
short n_dyn;
short n_func;
CLASS_CONST *cst;
CLASS_VAR *stat;
CLASS_VAR *dyn;
FUNCTION *func;
CLASS_EVENT *event;
CLASS_EXTERN *ext;
CLASS_ARRAY **array;
CLASS_REF *class_ref;
char **unknown;
GLOBAL_SYMBOL *global; /* symboles globaux */
short n_global;
short n_ext;
#ifdef OS_64BITS
CLASS_DESC *desc;
CLASS_PARAM *local;
FUNC_DEBUG *debug;
#endif
}
PACKED
CLASS_LOAD;
enum
{
CS_NULL = 0,
CS_LOADED = 1,
CS_READY = 2
};
typedef
struct _CLASS {
struct _CLASS *class; /* 4 Points at the 'Class' class ! */
int ref; /* 8 Reference count */
int count; /* 12 Number of instanciated objects */
struct _CLASS *parent; /* 16 Inherited class */
COMPONENT *component; /* 20 The component the class belongs to */
char *name; /* 24 Class name */
char *path; /* 28 Source file path */
unsigned state : 2; /* Initialization state */
unsigned debug : 1; /* Debugging information ? */
unsigned free_name : 1; /* Must free the class name */
unsigned free_event : 1; /* Must free class->event */
unsigned in_load : 1; /* Class being loaded */
unsigned exit : 1; /* Marker used by CLASS_exit */
unsigned auto_create : 1; /* Automatically instanciated */
unsigned no_create : 1; /* Cannot instanciate this class */
unsigned is_virtual : 1; /* Virtual class (name beginning with a dot) */
unsigned mmapped : 1; /* mmap() was used to load the class */
unsigned swap : 1; /* class endianness was swapped */
unsigned enum_static : 1; /* if class enumeration is static */
unsigned quick_array : 2; /* array accessor optimization type */
unsigned is_stream : 1; /* 30 If the class inherits stream */
short n_desc; /* 32 number of descriptions */
CLASS_DESC_SYMBOL *table; /* 36 class description */
short n_event; /* 38 number of events */
short _reserved; /* 40 */
CLASS_EVENT *event; /* 44 event description */
int _reserved2; /* 48 quick array get method */
int _reserved3; /* 52 quick array put method */
int (*check)(); /* 56 method for checking that an object is valid */
short special[16]; /* 88 special functions index (_new, _free, ...) */
uint size_stat; /* 92 static class size */
uint size; /* 96 dynamic class size */
uint off_event; /* 100 offset of OBJECT_EVENT structure in the object */
char *data; /* 104 class file data for loaded class / generated description for native class */
CLASS_LOAD *load; /* 108 information about loaded class */
char *stat; /* 112 static class data */
TYPE *signature; /* 116 signatures address */
char *string; /* 120 strings address */
void *instance; /* 124 automatically created instance */
struct _CLASS *next; /* 128 next class */
}
CLASS;
typedef
struct {
SYMBOL sym;
CLASS *class;
}
PACKED
CLASS_SYMBOL;
typedef
enum {
SPEC_NEW,
SPEC_FREE,
SPEC_GET,
SPEC_PUT,
SPEC_FIRST,
SPEC_NEXT,
SPEC_CALL,
SPEC_UNKNOWN,
SPEC_COMPARE,
SPEC_PRINT
}
CLASS_SPECIAL;
typedef
enum {
CQA_NONE = 0,
CQA_ARRAY = 1,
CQA_COLLECTION = 2
}
CLASS_QUICK_ARRAY;
typedef
enum
{
CF_DEBUG = 1
}
CLASS_FLAG;
typedef
enum
{
CI_EXPORTED = 1,
CI_AUTOCREATE = 2,
CI_OPTIONAL = 4,
CI_NOCREATE = 8
}
CLASS_INFO_FLAG;
#ifndef __GBX_CLASS_INIT_C
EXTERN CLASS *CLASS_Class;
EXTERN CLASS *CLASS_Enum;
EXTERN CLASS *CLASS_Symbol;
EXTERN CLASS *CLASS_Array;
EXTERN CLASS *CLASS_Collection;
EXTERN CLASS *CLASS_Stream;
EXTERN CLASS *CLASS_File;
EXTERN CLASS *CLASS_Stat;
EXTERN CLASS *CLASS_AppArgs;
EXTERN CLASS *CLASS_AppEnv;
EXTERN CLASS *CLASS_Application;
EXTERN CLASS *CLASS_Process;
EXTERN CLASS *CLASS_Component;
EXTERN CLASS *CLASS_Observer;
EXTERN CLASS *CLASS_BooleanArray;
EXTERN CLASS *CLASS_ByteArray;
EXTERN CLASS *CLASS_ShortArray;
EXTERN CLASS *CLASS_IntegerArray;
EXTERN CLASS *CLASS_SingleArray;
EXTERN CLASS *CLASS_FloatArray;
EXTERN CLASS *CLASS_DateArray;
EXTERN CLASS *CLASS_StringArray;
EXTERN CLASS *CLASS_ObjectArray;
EXTERN CLASS *CLASS_VariantArray;
EXTERN CLASS *CLASS_LongArray;
EXTERN CLASS *CLASS_PointerArray;
EXTERN CLASS *CLASS_SubCollection;
#endif
#define DO_ERROR ((void (*)()) -1)
#define FUNCTION_is_static(func) ((func)->type & TF_STATIC)
#define CLASS_is_extern(class) ((class)->load == NULL)
#define CLASS_is_native CLASS_is_extern
#define FUNCTION_is_native(_desc) (((uintptr_t)(_desc)->exec >> 16) != 0)
#define FUNC_INIT_STATIC 0
#define FUNC_INIT_DYNAMIC 1
/* class.c */
void CLASS_init(void);
void CLASS_exit(void);
CLASS *CLASS_get(const char *name);
int CLASS_count(void);
CLASS_DESC_SYMBOL *CLASS_get_symbol(CLASS *class, const char *name);
CLASS_DESC *CLASS_get_symbol_desc(CLASS *class, const char *name);
short CLASS_get_symbol_index_kind(CLASS *class, const char *name, int kind, int kind2);
CLASS_DESC *CLASS_get_symbol_desc_kind(CLASS *class, const char *name, int kind, int kind2);
CLASS_DESC_METHOD *CLASS_get_special_desc(CLASS *class, int spec);
#define CLASS_get_desc(_class, _index) (((_class)->table[_index].desc))
CLASS_DESC_EVENT *CLASS_get_event_desc(CLASS *class, const char *name);
int CLASS_find_symbol(CLASS *class, const char *name);
int CLASS_find_symbol_with_prefix(CLASS *class, const char *name, const char *prefix);
CLASS *CLASS_look(const char *name, int len);
CLASS *CLASS_find(const char *name);
TABLE *CLASS_get_table(void);
boolean CLASS_inherits(CLASS *class, CLASS *parent);
CLASS *CLASS_replace_global(const char *name);
CLASS *CLASS_look_global(const char *name, int len);
CLASS *CLASS_find_global(const char *name);
CLASS *CLASS_check_global(char *name);
void CLASS_ref(void *object);
void CLASS_unref(void **pobject, boolean can_free);
void CLASS_free(void **pobject);
void CLASS_release(CLASS *class, char *data);
int CLASS_get_inheritance(CLASS *class, CLASS **her);
void CLASS_do_nothing();
int CLASS_return_zero();
void CLASS_sort(CLASS *class);
void CLASS_inheritance(CLASS *class, CLASS *parent);
void CLASS_make_description(CLASS *class, CLASS_DESC *desc, int n_desc, int *first);
void CLASS_make_event(CLASS *class, int *first);
void CLASS_calc_info(CLASS *class, int n_event, int size_dynamic, boolean all, int size_static);
void *CLASS_auto_create(CLASS *class, int nparam);
void CLASS_search_special(CLASS *class);
CLASS_DESC_SYMBOL *CLASS_get_next_sorted_symbol(CLASS *class, int *index);
int CLASS_can_be_used_like_an_array(CLASS *class);
//void CLASS_create_array_class(CLASS *class);
/* class_init.c */
void CLASS_init_native(void);
/* class_load.c */
TYPE CLASS_ctype_to_type(CLASS *class, CTYPE ctype);
void CLASS_load_without_init(CLASS *class);
void CLASS_load_real(CLASS *class);
#define CLASS_load(_class) \
{ \
if ((_class)->state != CS_READY) \
CLASS_load_real(_class); \
}
/* class_native.c */
CLASS *CLASS_register_class(GB_DESC *desc, CLASS *class);
CLASS *CLASS_register(GB_DESC *desc);
#define SET_IF_NULL(ptr, val) if ((ptr) == NULL) (ptr) = (val)
/*
#define DO_NOTHING(ptr) if ((ptr) == NULL) (ptr) = CLASS_do_nothing
#define RETURN_ZERO(ptr) if ((ptr) == NULL) (ptr) = CLASS_return_zero
*/
#define CLASS_is_virtual(class) (class->is_virtual)
#endif /* _CLASS_H */