mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-03-25 18:10:23 +08:00
NASM 0.98.14
This commit is contained in:
parent
788e6c10e1
commit
ce61607e11
@ -141,7 +141,10 @@ static void out (long offset, long segto, void *data, unsigned long type,
|
||||
}
|
||||
|
||||
if (src_get(&lineno,&lnfname))
|
||||
{
|
||||
outfmt->current_dfmt->linenum(lnfname,lineno,segto);
|
||||
if (lnfname) nasm_free(lnfname);
|
||||
}
|
||||
|
||||
outfmt->output (segto, data, type, segment, wrt);
|
||||
}
|
||||
|
11
nasm.c
11
nasm.c
@ -111,7 +111,7 @@ static char *suppressed_what[1+ERR_WARN_MAX] = {
|
||||
|
||||
static void no_pp_reset (char *, int, efunc, evalfunc, ListGen *);
|
||||
static char *no_pp_getline (void);
|
||||
static void no_pp_cleanup (void);
|
||||
static void no_pp_cleanup (int);
|
||||
static Preproc no_pp = {
|
||||
no_pp_reset,
|
||||
no_pp_getline,
|
||||
@ -189,7 +189,7 @@ int main(int argc, char **argv)
|
||||
fprintf(stdout, "%s: %s", outname, inname);
|
||||
while ( (line = preproc->getline()) )
|
||||
nasm_free (line);
|
||||
preproc->cleanup();
|
||||
preproc->cleanup(0);
|
||||
putc('\n', stdout);
|
||||
}
|
||||
break;
|
||||
@ -233,7 +233,7 @@ int main(int argc, char **argv)
|
||||
nasm_free (line);
|
||||
}
|
||||
nasm_free(file_name);
|
||||
preproc->cleanup();
|
||||
preproc->cleanup(0);
|
||||
if (ofile)
|
||||
fclose(ofile);
|
||||
if (ofile && terminate_after_phase)
|
||||
@ -1241,7 +1241,7 @@ static void assemble_file (char *fname)
|
||||
if (pass1==2 && global_offset_changed)
|
||||
report_error(ERR_NONFATAL, "phase error detected at end of assembly.");
|
||||
|
||||
if (pass1 == 1) preproc->cleanup();
|
||||
if (pass1 == 1) preproc->cleanup(1);
|
||||
|
||||
if (pass1==1 && terminate_after_phase) {
|
||||
fclose(ofile);
|
||||
@ -1258,6 +1258,7 @@ static void assemble_file (char *fname)
|
||||
|
||||
} /* for (pass=1; pass<=2; pass++) */
|
||||
|
||||
preproc->cleanup(0);
|
||||
nasmlist.cleanup();
|
||||
#if 1
|
||||
if (optimizing>0 && using_debug_info) /* -On and -g switches */
|
||||
@ -1494,7 +1495,7 @@ static char *no_pp_getline (void)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static void no_pp_cleanup (void)
|
||||
static void no_pp_cleanup (int pass)
|
||||
{
|
||||
fclose(no_pp_fp);
|
||||
}
|
||||
|
4
nasm.h
4
nasm.h
@ -13,7 +13,7 @@
|
||||
|
||||
#define NASM_MAJOR_VER 0
|
||||
#define NASM_MINOR_VER 98
|
||||
#define NASM_VER "0.98.12"
|
||||
#define NASM_VER "0.98.14"
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
@ -312,7 +312,7 @@ typedef struct {
|
||||
/*
|
||||
* Called at the end of a pass.
|
||||
*/
|
||||
void (*cleanup) (void);
|
||||
void (*cleanup) (int);
|
||||
} Preproc;
|
||||
|
||||
/*
|
||||
|
69
preproc.c
69
preproc.c
@ -48,6 +48,7 @@ typedef struct SMacro SMacro;
|
||||
typedef struct MMacro MMacro;
|
||||
typedef struct Context Context;
|
||||
typedef struct Token Token;
|
||||
typedef struct Blocks Blocks;
|
||||
typedef struct Line Line;
|
||||
typedef struct Include Include;
|
||||
typedef struct Cond Cond;
|
||||
@ -396,6 +397,12 @@ int any_extrastdmac;
|
||||
*/
|
||||
#define TOKEN_BLOCKSIZE 4096
|
||||
static Token *freeTokens = NULL;
|
||||
struct Blocks {
|
||||
Blocks *next;
|
||||
void *chunk;
|
||||
};
|
||||
|
||||
static Blocks blocks = { NULL, NULL };
|
||||
|
||||
/*
|
||||
* Forward declarations.
|
||||
@ -406,6 +413,8 @@ static Token *expand_id(Token * tline);
|
||||
static Context *get_ctx(char *name, int all_contexts);
|
||||
static void make_tok_num(Token * tok, long val);
|
||||
static void error(int severity, char *fmt, ...);
|
||||
static void *new_Block(size_t size);
|
||||
static void delete_Blocks(void);
|
||||
static Token *new_Token(Token * next, int type, char *text, int txtlen);
|
||||
static Token *delete_Token(Token * t);
|
||||
|
||||
@ -869,10 +878,56 @@ tokenise(char *line)
|
||||
}
|
||||
line = p;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/*
|
||||
* this function allocates a new managed block of memory and
|
||||
* returns a pointer to the block. The managed blocks are
|
||||
* deleted only all at once by the delete_Blocks function.
|
||||
*/
|
||||
static void *
|
||||
new_Block(size_t size)
|
||||
{
|
||||
Blocks *b = &blocks;
|
||||
|
||||
/* first, get to the end of the linked list */
|
||||
while (b->next)
|
||||
b = b->next;
|
||||
/* now allocate the requested chunk */
|
||||
b->chunk = nasm_malloc(size);
|
||||
|
||||
/* now allocate a new block for the next request */
|
||||
b->next = nasm_malloc(sizeof(Blocks));
|
||||
/* and initialize the contents of the new block */
|
||||
b->next->next = NULL;
|
||||
b->next->chunk = NULL;
|
||||
return b->chunk;
|
||||
}
|
||||
|
||||
/*
|
||||
* this function deletes all managed blocks of memory
|
||||
*/
|
||||
static void
|
||||
delete_Blocks(void)
|
||||
{
|
||||
Blocks *a,*b = &blocks;
|
||||
|
||||
/*
|
||||
* keep in mind that the first block, pointed to by blocks
|
||||
* is a static and not dynamically allocated, so we don't
|
||||
* free it.
|
||||
*/
|
||||
while (b)
|
||||
{
|
||||
if (b->chunk)
|
||||
nasm_free(b->chunk);
|
||||
a = b;
|
||||
b = b->next;
|
||||
if (a != &blocks)
|
||||
nasm_free(a);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* this function creates a new Token and passes a pointer to it
|
||||
@ -887,7 +942,7 @@ new_Token(Token * next, int type, char *text, int txtlen)
|
||||
|
||||
if (freeTokens == NULL)
|
||||
{
|
||||
freeTokens = nasm_malloc(TOKEN_BLOCKSIZE * sizeof(Token));
|
||||
freeTokens = (Token *)new_Block(TOKEN_BLOCKSIZE * sizeof(Token));
|
||||
for (i = 0; i < TOKEN_BLOCKSIZE - 1; i++)
|
||||
freeTokens[i].next = &freeTokens[i + 1];
|
||||
freeTokens[i].next = NULL;
|
||||
@ -917,7 +972,6 @@ delete_Token(Token * t)
|
||||
{
|
||||
Token *next = t->next;
|
||||
nasm_free(t->text);
|
||||
/* t->next = freeTokens ? freeTokens->next : NULL; */
|
||||
t->next = freeTokens;
|
||||
freeTokens = t;
|
||||
return next;
|
||||
@ -3169,6 +3223,8 @@ expand_smacro(Token * tline)
|
||||
new_Token(org_tline->next, org_tline->type, org_tline->text,
|
||||
0);
|
||||
tline->mac = org_tline->mac;
|
||||
nasm_free(org_tline->text);
|
||||
org_tline->text = NULL;
|
||||
}
|
||||
|
||||
again:
|
||||
@ -4124,7 +4180,7 @@ pp_getline(void)
|
||||
}
|
||||
|
||||
static void
|
||||
pp_cleanup(void)
|
||||
pp_cleanup(int pass)
|
||||
{
|
||||
int h;
|
||||
|
||||
@ -4163,6 +4219,11 @@ pp_cleanup(void)
|
||||
}
|
||||
while (cstk)
|
||||
ctx_pop();
|
||||
if (pass == 0)
|
||||
{
|
||||
free_llist(predef);
|
||||
delete_Blocks();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
x
Reference in New Issue
Block a user