From: Matthias Kramm Date: Tue, 3 Feb 2009 18:48:55 +0000 (+0100) Subject: added support for token re-use X-Git-Tag: release-0-9-0~167 X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=commitdiff_plain;h=07022f6394b1436b8bc67b61d535579c46208088 added support for token re-use --- diff --git a/lib/as3/compiler.c b/lib/as3/compiler.c index 049d158..fded71e 100644 --- a/lib/as3/compiler.c +++ b/lib/as3/compiler.c @@ -26,7 +26,6 @@ #include "parser.h" #include "parser.tab.h" #include "compiler.h" -#include /* flex/bison definitions */ extern void as3_set_in (FILE * in_str ); @@ -46,9 +45,35 @@ void as3_add_include_dir(char*dir) static char registry_initialized = 0; static char parser_initialized = 0; -void a3_lex() +//#define STORE_TOKENS + +#ifdef STORE_TOKENS +static mem_t tokens; +#endif + +int a3_lex() { - as3_lex(); + as3_tokencount++; +#ifdef STORE_TOKENS + if(as3_pass==1) { + int token = as3_lex(); + /* FIXME: current_file needs to be stored, too */ + mem_put(&tokens, &token, sizeof(token)); + mem_put(&tokens, &a3_lval, sizeof(a3_lval)); + mem_put(&tokens, ¤t_line, sizeof(current_line)); + mem_put(&tokens, ¤t_column, sizeof(current_column)); + return token; + } else { + int token; + mem_get(&tokens, &token, sizeof(token)); + mem_get(&tokens, &a3_lval, sizeof(a3_lval)); + mem_get(&tokens, ¤t_line, sizeof(current_line)); + mem_get(&tokens, ¤t_column, sizeof(current_column)); + return token; + } +#else + return as3_lex(); +#endif } void as3_parse_file(char*filename) @@ -60,27 +85,35 @@ void as3_parse_file(char*filename) if(!parser_initialized) { parser_initialized = 1; initialize_parser(); +#if defined(STORE_TOKENS) + mem_init(&tokens); +#endif } - as3_pass = 0; - - char*fullfilename = enter_file(filename, 0); - FILE*fi = fopen(fullfilename, "rb"); - if(!fi) { - syntaxerror("Couldn't find file %s: %s", fullfilename, strerror(errno)); - } +#ifdef STORE_TOKENS + tokens.pos = 0; + tokens.read_pos = 0; +#endif + + FILE*fi = enter_file2(filename, 0); + /* pass 1 */ as3_pass = 1; + as3_tokencount=0; as3_set_in(fi); initialize_file(filename); a3_parse(); as3_lex_destroy(); finish_file(); + +#ifdef STORE_TOKENS + tokens.read_pos = 0; +#endif /* pass 2 */ - // TODO: this should re-use tokens! - enter_file(filename, 0); as3_pass = 2; + as3_tokencount=0; + enter_file(filename, 0); fseek(fi, 0, SEEK_SET); as3_set_in(fi); initialize_file(filename); @@ -111,6 +144,9 @@ void as3_destroy() if(parser_initialized) { parser_initialized = 0; swf_FreeABC(finish_parser()); +#ifdef STORE_TOKENS + mem_clear(&tokens); +#endif } if(as3_globalclass) { free(as3_globalclass);as3_globalclass=0;