63ad5eff18
commit 1e5213d43fdd170bb0c30af914a4e40610014b2b
Author: David Anderson <dvander@alliedmods.net>
Date: Sat Jun 21 04:09:27 2014 -0700
Quell MSVC C99 bugs.
commit f2e166c5925fda49b5abeadc0aa0f9156b99cf11
Author: David Anderson <dvander@alliedmods.net>
Date: Sat Jun 21 03:59:23 2014 -0700
Fix varying levels of stupid memory errors.
commit b0773d7be45345351ab1c1738681d5215a97f3f3
Author: David Anderson <dvander@alliedmods.net>
Date: Sat Jun 21 03:36:39 2014 -0700
Fix memory leak in parsing some control flow structures.
commit 5aca55713cfc2dd09c5900132fc4a6be51e3e309
Author: David Anderson <dvander@alliedmods.net>
Date: Sat Jun 21 03:35:17 2014 -0700
Fix memory leak in struct parsing.
commit b46ec5cd281b46177e83c4f0a4acac9cc1065c53
Author: David Anderson <dvander@alliedmods.net>
Date: Sat Jun 21 03:32:03 2014 -0700
Fix build.
commit 17bbbb9a46bfc00862adca7d3e15369a48e9ac0f
Merge: c083409 2107599
Author: David Anderson <dvander@alliedmods.net>
Date: Sat Jun 21 01:26:27 2014 -0700
Merge branch 'master' into methodmaps
commit c083409b569abff13f24d3b8c47f8ff199036840
Author: David Anderson <dvander@alliedmods.net>
Date: Fri Jun 20 23:49:36 2014 -0700
Add VS2k13 support.
commit b7993778494d538cb1c1965116030142a7f7765b
Author: David Anderson <dvander@alliedmods.net>
Date: Fri Jun 20 01:28:08 2014 -0700
Implement destructors.
commit 1a340dec260d079ed1b79351ed7b50b58a997cea
Author: David Anderson <dvander@alliedmods.net>
Date: Fri Jun 20 00:08:04 2014 -0700
Add some tests.
commit 12db52ee64eb009ead9294495e9034c63ab75b09
Author: David Anderson <dvander@alliedmods.net>
Date: Fri Jun 20 00:05:49 2014 -0700
Initial implementation of constructors.
commit 074669a658caa2822aa864164b615a244c00a0bc
Author: David Anderson <dvander@alliedmods.net>
Date: Thu Jun 19 22:42:35 2014 -0700
Add simple test harness.
commit 27c1e3cf14e1e6c5cf35c80c792cce2744b804d7
Author: David Anderson <dvander@alliedmods.net>
Date: Thu Jun 19 22:15:42 2014 -0700
Big refactoring for new syntax.
commit f3c37fdc919e76ee0815e2394cbe8d221f9fc0ca
Author: David Anderson <dvander@alliedmods.net>
Date: Thu Jun 19 22:12:54 2014 -0700
Refactor tests for the new syntax.
commit 6211f392f8e722b907474cf380cfac4347e46b8e
Author: David Anderson <dvander@alliedmods.net>
Date: Wed Jun 18 22:25:48 2014 -0700
Make lexer tokens an enum.
commit 5210b013756b0b00de3a61c6490685c768ff8cbd
Author: David Anderson <dvander@alliedmods.net>
Date: Tue Jun 17 06:48:15 2014 -0700
Add comment.
commit 06688ff4aced14077dd21a9cc1db4c26c7420ff3
Author: David Anderson <dvander@alliedmods.net>
Date: Tue Jun 17 06:46:10 2014 -0700
Allow |this| to be a base type of the methodmap.
commit 05cf3682020e0e6d9f47b1a0a6727b9edbfe7622
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 22:11:58 2014 -0700
Unify duplicate typesymbol checking.
commit 09161bf2691c8c1ed25b9b70fda01c336f21aa0b
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 19:53:36 2014 -0700
Close loophole that allowed methodmaps for enums.
commit 5bb4aeba89fec47a4de7a7532d27830999d1fcb4
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 01:50:42 2014 -0700
Add tests and dbi/handle changes.
commit b9203e2491daec2a8073874d6375949483778d14
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 01:38:29 2014 -0700
Ensure methodmap tags are fixed.
commit 878b80fd87a2ea500d3a28ce2d53f616d1efe5e8
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 01:36:04 2014 -0700
Implement inheritance.
commit 6ba9e004fbae18ad68056368ddd0affdc78659f1
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 01:31:00 2014 -0700
Refactor matchtag() to not be insane.
commit 4ede6343b0682c6df98fa869153828e92f891bcc
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 01:20:50 2014 -0700
Fix indenting.
commit e3ddef8916e3dd5f4ff0fe571d6e1c3acd163352
Author: David Anderson <dvander@alliedmods.net>
Date: Mon Jun 16 01:20:27 2014 -0700
Initial prototype.
172 lines
4.0 KiB
C
172 lines
4.0 KiB
C
/* vim: set sts=2 ts=8 sw=2 tw=99 et: */
|
|
#ifndef _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_
|
|
#define _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_
|
|
|
|
#define MEMUSE_STATIC 0
|
|
#define MEMUSE_DYNAMIC 1
|
|
|
|
typedef struct memuse_s {
|
|
int type; /* MEMUSE_STATIC or MEMUSE_DYNAMIC */
|
|
int size; /* size of array for static (0 for dynamic) */
|
|
struct memuse_s *prev; /* previous block on the list */
|
|
} memuse_t;
|
|
|
|
typedef struct memuse_list_s {
|
|
struct memuse_list_s *prev; /* last used list */
|
|
int list_id;
|
|
memuse_t *head; /* head of the current list */
|
|
} memuse_list_t;
|
|
|
|
typedef struct funcarg_s
|
|
{
|
|
int tagcount;
|
|
int tags[sTAGS_MAX];
|
|
int dimcount;
|
|
cell dims[sDIMEN_MAX];
|
|
int ident;
|
|
int fconst;
|
|
int ommittable;
|
|
} funcarg_t;
|
|
|
|
typedef struct functag_s
|
|
{
|
|
int ret_tag;
|
|
int type;
|
|
int argcount;
|
|
int ommittable;
|
|
funcarg_t args[sARGS_MAX];
|
|
struct functag_s *next;
|
|
} functag_t;
|
|
|
|
typedef struct funcenum_s
|
|
{
|
|
int value;
|
|
char name[sNAMEMAX+1];
|
|
functag_t *first;
|
|
functag_t *last;
|
|
struct funcenum_s *next;
|
|
} funcenum_t;
|
|
|
|
typedef struct structarg_s
|
|
{
|
|
int tag;
|
|
int dimcount;
|
|
cell dims[sDIMEN_MAX];
|
|
char name[sNAMEMAX+1];
|
|
int fconst;
|
|
int ident;
|
|
unsigned int offs;
|
|
int index;
|
|
} structarg_t;
|
|
|
|
typedef struct pstruct_s
|
|
{
|
|
int argcount;
|
|
char name[sNAMEMAX+1];
|
|
structarg_t **args;
|
|
struct pstruct_s *next;
|
|
} pstruct_t;
|
|
|
|
// The ordering of these definitions should be preserved for
|
|
// can_redef_layout_spec().
|
|
typedef enum LayoutSpec_t
|
|
{
|
|
Layout_None,
|
|
Layout_Enum,
|
|
Layout_FuncTag,
|
|
Layout_PawnStruct,
|
|
Layout_MethodMap,
|
|
Layout_Class
|
|
} LayoutSpec;
|
|
|
|
// The method name buffer is larger since we can include our parent class's
|
|
// name, a "." to separate it, and a "~" for constructors.
|
|
#define METHOD_NAMEMAX sNAMEMAX * 2 + 2
|
|
|
|
typedef struct methodmap_method_s
|
|
{
|
|
char name[METHOD_NAMEMAX + 1];
|
|
symbol *target;
|
|
} methodmap_method_t;
|
|
|
|
typedef struct methodmap_s
|
|
{
|
|
struct methodmap_s *next;
|
|
struct methodmap_s *parent;
|
|
int tag;
|
|
LayoutSpec spec;
|
|
char name[sNAMEMAX+1];
|
|
methodmap_method_t **methods;
|
|
size_t nummethods;
|
|
|
|
// Shortcut.
|
|
methodmap_method_t *dtor;
|
|
} methodmap_t;
|
|
|
|
/**
|
|
* Pawn Structs
|
|
*/
|
|
pstruct_t *pstructs_add(const char *name);
|
|
void pstructs_free();
|
|
pstruct_t *pstructs_find(const char *name);
|
|
structarg_t *pstructs_addarg(pstruct_t *pstruct, const structarg_t *arg);
|
|
structarg_t *pstructs_getarg(pstruct_t *pstruct, const char *member);
|
|
|
|
/**
|
|
* Function enumeration tags
|
|
*/
|
|
void funcenums_free();
|
|
funcenum_t *funcenums_add(const char *name);
|
|
funcenum_t *funcenums_find_byval(int value);
|
|
functag_t *functags_add(funcenum_t *en, functag_t *src);
|
|
|
|
/**
|
|
* Given a name or tag, find any extra weirdness it has associated with it.
|
|
*/
|
|
LayoutSpec deduce_layout_spec_by_tag(int tag);
|
|
LayoutSpec deduce_layout_spec_by_name(const char *name);
|
|
const char *layout_spec_name(LayoutSpec spec);
|
|
int can_redef_layout_spec(LayoutSpec olddef, LayoutSpec newdef);
|
|
|
|
/**
|
|
* Heap functions
|
|
*/
|
|
void pushheaplist();
|
|
memuse_list_t *popsaveheaplist();
|
|
void popheaplist();
|
|
int markheap(int type, int size);
|
|
|
|
/**
|
|
* Stack functions
|
|
*/
|
|
void pushstacklist();
|
|
void popstacklist(int codegen);
|
|
int markstack(int type, int size);
|
|
/**
|
|
* Generates code to free mem usage, but does not pop the list.
|
|
* This is used for code like dobreak()/docont()/doreturn().
|
|
* stop_id is the list at which to stop generating.
|
|
*/
|
|
void genstackfree(int stop_id);
|
|
void genheapfree(int stop_id);
|
|
|
|
/**
|
|
* Resets a mem list by freeing everything
|
|
*/
|
|
void resetstacklist();
|
|
void resetheaplist();
|
|
|
|
/**
|
|
* Method maps.
|
|
*/
|
|
void methodmap_add(methodmap_t *map);
|
|
methodmap_t *methodmap_find_by_tag(int tag);
|
|
methodmap_t *methodmap_find_by_name(const char *name);
|
|
methodmap_method_t *methodmap_find_method(methodmap_t *map, const char *name);
|
|
void methodmaps_free();
|
|
|
|
extern memuse_list_t *heapusage;
|
|
extern memuse_list_t *stackusage;
|
|
|
|
#endif //_INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_
|