f6f02d | 1995-10-16 | Fredrik Hübinette (Hubbe) | | |
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
|
f6f02d | 1995-10-16 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | RCSID("$Id: program.c,v 1.14 1997/01/22 05:19:46 hubbe Exp $");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "program.h"
#include "object.h"
#include "dynamic_buffer.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "pike_types.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "stralloc.h"
#include "las.h"
#include "language.h"
#include "lex.h"
#include "macros.h"
#include "fsort.h"
#include "error.h"
#include "docode.h"
#include "interpret.h"
#include "hashtable.h"
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #include "main.h"
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | #include "gc.h"
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #include "threads.h"
|
8aeeb2 | 1996-11-19 | Fredrik Hübinette (Hubbe) | |
#include <errno.h>
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include <fcntl.h>
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #define FILE_STATE
#define PROGRAM_STATE
#define STRUCT
#include "compilation.h"
#undef STRUCT
#define DECLARE
#include "compilation.h"
#undef DECLARE
#undef FILE_STATE
#undef PROGRAM_STATE
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
558069 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
char *lfun_names[] = {
"__INIT",
"create",
"destroy",
"`+",
"`-",
"`&",
"`|",
"`^",
"`<<",
"`>>",
"`*",
"`/",
"`%",
"`~",
"`==",
"`<",
"`>",
"__hash",
"cast",
"`!",
|
774b06 | 1996-08-03 | Fredrik Hübinette (Hubbe) | | "`[]",
"`[]=",
|
dffa01 | 1997-01-15 | Fredrik Hübinette (Hubbe) | | "`->",
"`->=",
|
558069 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | };
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct program *first_program = 0;
struct program fake_program;
static int current_program_id=0;
static INT32 last_line = 0;
static INT32 last_pc = 0;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | static struct pike_string *last_file = 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | dynamic_buffer inherit_names;
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | dynamic_buffer used_modules;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | void use_module(struct svalue *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | low_my_binary_strcat((char *)s,sizeof(struct svalue *),&used_modules);
}
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | static int low_find_shared_string_identifier(struct pike_string *name,
struct program *prog);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | int find_module_identifier(struct pike_string *ident)
{
JMP_BUF tmp;
if(SETJMP(tmp))
{
ONERROR tmp;
SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!");
assign_svalue_no_free(sp++, & throw_value);
APPLY_MASTER("handle_error", 1);
pop_stack();
UNSET_ONERROR(tmp);
yyerror("Couldn't index module.");
}else{
struct svalue *modules=(struct svalue *)used_modules.s.str;
int e=used_modules.s.len / sizeof(struct svalue *);
while(--e>=0)
{
push_svalue(modules+e);
push_string(ident);
f_index(2);
if(!IS_ZERO(sp-1) || sp[-1].subtype != 1)
{
UNSETJMP(tmp);
return 1;
}
}
}
UNSETJMP(tmp);
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | |
{
struct program_state *p;
for(p=previous_program_state;p;p=p->previous)
{
INT32 i;
if(previous_file_state &&
previous_file_state->previous_program_state==p->previous)
break;
i=low_find_shared_string_identifier(ident, &p->fake_program);
if(i!=-1)
{
struct identifier *id;
id=ID_FROM_INT(&p->fake_program, i);
if(IDENTIFIER_IS_CONSTANT(id->flags))
{
push_svalue(PROG_FROM_INT(&p->fake_program, i)->constants+
id->func.offset);
return 1;
}else{
yyerror("Identifier is not a constant");
return 0;
}
}
}
}
return 0;
}
struct program *id_to_program(INT32 id)
{
struct program *p;
if(id)
for(p=first_program;p;p=p->next)
if(id==p->id)
return p;
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | return 0;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
#define SETUP(X,Y,TYPE,AREA) \
fake_program.X=(TYPE *)areas[AREA].s.str; \
fake_program.Y=areas[AREA].s.len/sizeof(TYPE)
void setup_fake_program()
{
fake_program.refs=0xffffff;
SETUP(program, program_size, unsigned char, A_PROGRAM);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | SETUP(strings, num_strings, struct pike_string *, A_STRINGS);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | SETUP(inherits, num_inherits, struct inherit, A_INHERITS);
SETUP(identifiers, num_identifiers, struct identifier, A_IDENTIFIERS);
SETUP(identifier_references, num_identifier_references, struct reference, A_IDENTIFIER_REFERENCES);
SETUP(constants, num_constants, struct svalue, A_CONSTANTS);
SETUP(linenumbers, num_linenumbers, char, A_LINENUMBERS);
fake_program.inherits[0].prog=&fake_program;
fake_program.next=0;
fake_program.prev=0;
fake_object.prog=&fake_program;
}
void start_new_program()
{
int e;
struct inherit inherit;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *name;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | threads_disabled++;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | if(local_variables)
setup_fake_program();
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #define PROGRAM_STATE
#define PUSH
#include "compilation.h"
#undef PUSH
#undef PROGRAM_STATE
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | if(previous_program_state->fake_program.num_inherits)
previous_program_state->fake_program.inherits[0].prog=
&previous_program_state->fake_program;
|
e43ca2 | 1996-11-15 | Fredrik Hübinette (Hubbe) | | for(e=0; e<NUM_AREAS; e++) low_reinit_buf(areas + e);
low_reinit_buf(& inherit_names);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | low_reinit_buf(& used_modules);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fake_program.id = ++current_program_id;
inherit.prog=&fake_program;
inherit.inherit_level=0;
inherit.identifier_level=0;
inherit.storage_offset=0;
add_to_mem_block(A_INHERITS,(char *)&inherit,sizeof inherit);
name=make_shared_string("this");
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | low_my_binary_strcat((char *)&name,sizeof(name), &inherit_names);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | num_parse_error=0;
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | |
|
8cc7a6 | 1995-10-30 | Fredrik Hübinette (Hubbe) | | local_variables=ALLOC_STRUCT(locals);
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | local_variables->next=0;
local_variables->current_number_of_locals=0;
|
8cc7a6 | 1995-10-30 | Fredrik Hübinette (Hubbe) | | local_variables->max_number_of_locals=0;
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | local_variables->current_type=0;
local_variables->current_return_type=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
static void low_free_program(struct program *p)
{
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | unsigned INT16 e;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(e=0; e<p->num_strings; e++)
free_string(p->strings[e]);
for(e=0; e<p->num_identifiers; e++)
{
free_string(p->identifiers[e].name);
free_string(p->identifiers[e].type);
}
for(e=0; e<p->num_constants; e++)
free_svalue(p->constants+e);
for(e=1; e<p->num_inherits; e++)
free_program(p->inherits[e].prog);
}
void really_free_program(struct program *p)
{
low_free_program(p);
if(p->prev)
p->prev->next=p->next;
else
first_program=p->next;
if(p->next)
p->next->prev=p->prev;
free((char *)p);
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | |
GC_FREE();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
void dump_program_desc(struct program *p)
{
int e,d,q;
fprintf(stderr,"All identifiers:\n");
for(e=0;e<(int)p->num_identifier_references;e++)
{
fprintf(stderr,"%3d:",e);
for(d=0;d<INHERIT_FROM_INT(p,e)->inherit_level;d++) fprintf(stderr," ");
fprintf(stderr,"%s;\n",ID_FROM_INT(p,e)->name->str);
}
fprintf(stderr,"All sorted identifiers:\n");
for(q=0;q<(int)p->num_identifier_indexes;q++)
{
e=p->identifier_index[q];
fprintf(stderr,"%3d (%3d):",e,q);
for(d=0;d<INHERIT_FROM_INT(p,e)->inherit_level;d++) fprintf(stderr," ");
fprintf(stderr,"%s;\n", ID_FROM_INT(p,e)->name->str);
}
}
#endif
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | static void toss_compilation_resources()
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string **names;
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | struct svalue *modules;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | int e;
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | for (e=0; e<NUM_AREAS; e++) toss_buffer(areas+e);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | names=(struct pike_string **)inherit_names.s.str;
e=inherit_names.s.len / sizeof(struct pike_string *);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | while(--e>=0) if(names[e]) free_string(names[e]);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | toss_buffer(& inherit_names);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | |
modules=(struct svalue *)used_modules.s.str;
e=used_modules.s.len / sizeof(struct svalue *);
while(--e>=0) free_svalue(modules+e);
toss_buffer(& used_modules);
while(local_variables)
{
struct locals *l;
for(e=0;e<local_variables->current_number_of_locals;e++)
{
free_string(local_variables->variable[e].name);
free_string(local_variables->variable[e].type);
}
if(local_variables->current_type)
free_string(local_variables->current_type);
if(local_variables->current_return_type)
free_string(local_variables->current_return_type);
l=local_variables->next;
free((char *)local_variables);
local_variables=l;
}
if(last_file)
{
free_string(last_file);
last_file=0;
}
}
void toss_current_program()
{
setup_fake_program();
low_free_program(&fake_program);
toss_compilation_resources();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | void check_program(struct program *p)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | {
INT32 size,e;
unsigned INT32 checksum;
if(p->refs <=0)
fatal("Program has zero refs.\n");
if(p->next && p->next->prev != p)
fatal("Program ->next->prev != program.\n");
if(p->prev)
{
if(p->prev->next != p)
fatal("Program ->prev->next != program.\n");
}else{
if(first_program != p)
fatal("Program ->prev == 0 but first_program != program.\n");
}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | if(p->id > current_program_id || p->id <= 0)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | fatal("Program id is wrong.\n");
if(p->storage_needed < 0)
fatal("Program->storage_needed < 0.\n");
size=MY_ALIGN(sizeof(struct program));
size+=MY_ALIGN(p->num_linenumbers);
size+=MY_ALIGN(p->program_size);
size+=MY_ALIGN(p->num_constants * sizeof(struct svalue));
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | size+=MY_ALIGN(p->num_strings * sizeof(struct pike_string *));
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | size+=MY_ALIGN(p->num_identifiers * sizeof(struct identifier));
size+=MY_ALIGN(p->num_identifier_references * sizeof(struct reference));
size+=MY_ALIGN(p->num_inherits * sizeof(struct inherit));
size+=MY_ALIGN(p->num_identifier_indexes * sizeof(INT16));
|
a60e66 | 1995-11-15 | Fredrik Hübinette (Hubbe) | | if(size > (INT32)p->total_size)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | fatal("Program size is in error.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | size-=MY_ALIGN(p->num_identifier_indexes * sizeof(INT16));
size+=MY_ALIGN(p->num_identifier_references * sizeof(INT16));
|
a60e66 | 1995-11-15 | Fredrik Hübinette (Hubbe) | | if(size < (INT32)p->total_size)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | fatal("Program size is in error.\n");
#define CHECKRANGE(X,Y) if((char *)(p->X) < (char *)p || (char *)(p->X)> ((char *)p)+size) fatal("Program->%s is wrong.\n",Y)
CHECKRANGE(program,"program");
CHECKRANGE(strings,"strings");
CHECKRANGE(inherits,"inherits");
CHECKRANGE(identifier_references,"identifier_references");
CHECKRANGE(identifiers,"identifier");
CHECKRANGE(identifier_index,"identifier_index");
CHECKRANGE(constants,"constants");
CHECKRANGE(linenumbers,"linenumbers");
checksum=hashmem(p->program, p->program_size, p->program_size) +
hashmem((unsigned char*)p->linenumbers,p->num_linenumbers,p->num_linenumbers);
if(!checksum) checksum=1;
if(!p->checksum)
{
p->checksum=checksum;
}else{
if(p->checksum != checksum)
fatal("Someone changed a program!!!\n");
}
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(int)p->num_constants;e++)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | {
check_svalue(p->constants + e);
}
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(int)p->num_strings;e++)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | check_string(p->strings[e]);
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(int)p->num_identifiers;e++)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | {
check_string(p->identifiers[e].name);
check_string(p->identifiers[e].type);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | if(p->identifiers[e].flags & ~15)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | fatal("Unknown flags in identifier flag field.\n");
if(p->identifiers[e].run_time_type!=T_MIXED)
check_type(p->identifiers[e].run_time_type);
}
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(int)p->num_identifier_references;e++)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | {
if(p->identifier_references[e].inherit_offset > p->num_inherits)
fatal("Inherit offset is wrong!\n");
if(p->identifier_references[e].identifier_offset >
p->inherits[p->identifier_references[e].inherit_offset].prog->num_identifiers)
fatal("Identifier offset is wrong!\n");
}
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(int)p->num_identifier_indexes;e++)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | {
if(p->identifier_index[e] > p->num_identifier_references)
fatal("Program->identifier_indexes[%ld] is wrong\n",(long)e);
}
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(int)p->num_inherits;e++)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | {
if(p->inherits[e].storage_offset < 0)
fatal("Inherit->storage_offset is wrong.\n");
}
}
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
static int funcmp(const void *a,const void *b)
{
return
my_order_strcmp(ID_FROM_INT(&fake_program, *(unsigned short *)a)->name,
ID_FROM_INT(&fake_program, *(unsigned short *)b)->name);
}
#define INS_BLOCK(PTR,PTRS,TYPE,AREA) \
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | prog->PTR=(TYPE *)p; \
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if((prog->PTRS = areas[AREA].s.len/sizeof(TYPE))) \
{ \
MEMCPY(p,areas[AREA].s.str, areas[AREA].s.len); \
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | p+=MY_ALIGN(areas[AREA].s.len); \
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
struct program *end_program()
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string **names;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | int size, i,e,t;
char *p;
struct program *prog;
if (init_node)
{
union idptr tmp;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | s=make_shared_string("__INIT");
tmp.offset=PC;
ins_byte(0, A_PROGRAM);
|
a8ef6e | 1996-12-03 | Fredrik Hübinette (Hubbe) | | ins_byte(0, A_PROGRAM);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | dooptcode(s,mknode(F_ARG_LIST,init_node,mknode(F_RETURN,mkintnode(0),0)),0);
define_function(s,
function_type_string,
0,
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | IDENTIFIER_PIKE_FUNCTION,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | & tmp);
free_string(s);
|
a8ef6e | 1996-12-03 | Fredrik Hübinette (Hubbe) | | init_node=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
if (num_parse_error > 0)
{
toss_current_program();
prog=0;
}else{
setup_fake_program();
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | size = MY_ALIGN(sizeof (struct program));
for (i=0; i<NUM_AREAS; i++) size += MY_ALIGN(areas[i].s.len);
size+=MY_ALIGN(fake_program.num_identifier_references * sizeof(unsigned short));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
p = (char *)xalloc(size);
prog = (struct program *)p;
*prog = fake_program;
prog->total_size = size;
prog->refs = 1;
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | p += MY_ALIGN(sizeof (struct program));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
INS_BLOCK(program,program_size,unsigned char,A_PROGRAM);
INS_BLOCK(linenumbers,num_linenumbers,char,A_LINENUMBERS);
INS_BLOCK(identifiers,num_identifiers,struct identifier,A_IDENTIFIERS);
INS_BLOCK(identifier_references,num_identifier_references,struct reference,A_IDENTIFIER_REFERENCES);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | INS_BLOCK(strings,num_strings,struct pike_string *,A_STRINGS);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | INS_BLOCK(inherits,num_inherits,struct inherit,A_INHERITS);
INS_BLOCK(constants,num_constants,struct svalue,A_CONSTANTS);
prog->identifier_index=(unsigned short *)p;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=i=0;i<(int)prog->num_identifier_references;i++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct reference *funp;
struct identifier *fun;
funp=prog->identifier_references+i;
if(funp->flags & (ID_HIDDEN|ID_STATIC)) continue;
if(funp->flags & ID_INHERITED)
{
if(funp->flags & ID_PRIVATE) continue;
fun=ID_FROM_PTR(prog, funp);
if(fun->func.offset == -1) continue;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(t=0;t>=0 && t<(int)prog->num_identifier_references;t++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct reference *funpb;
struct identifier *funb;
if(t==i) continue;
funpb=prog->identifier_references+t;
if(funpb->flags & (ID_HIDDEN|ID_STATIC)) continue;
if((funpb->flags & ID_INHERITED) && t<i) continue;
funb=ID_FROM_PTR(prog,funpb);
if(funb->func.offset == -1) continue;
if(fun->name==funb->name) t=-10;
}
if(t<0) continue;
}
prog->identifier_index[e]=i;
e++;
}
prog->num_identifier_indexes=e;
fsort((void *)prog->identifier_index, e,sizeof(unsigned short),(fsortfun)funcmp);
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | p+=MY_ALIGN(prog->num_identifier_indexes*sizeof(unsigned short));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | toss_compilation_resources();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
prog->inherits[0].prog=prog;
prog->prev=0;
if(prog->next=first_program)
first_program->prev=prog;
first_program=prog;
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | |
|
558069 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | for(i=0;i<NUM_LFUNS;i++)
prog->lfuns[i]=find_identifier(lfun_names[i],prog);
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | check_program(prog);
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | if(l_flag)
dump_program_desc(prog);
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | #endif
|
558069 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | GC_ALLOC();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #define PROGRAM_STATE
#define POP
#include "compilation.h"
#undef POP
#undef PROGRAM_STATE
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | if(fake_program.num_inherits)
fake_program.inherits[0].prog=&fake_program;
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | threads_disabled--;
|
a8ef6e | 1996-12-03 | Fredrik Hübinette (Hubbe) | | free_all_nodes();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return prog;
}
SIZE_T add_storage(SIZE_T size)
{
SIZE_T offset;
offset=fake_program.storage_needed;
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | size=MY_ALIGN(size);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fake_program.storage_needed += size;
return offset;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void set_init_callback(void (*init)(struct object *))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
fake_program.init=init;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void set_exit_callback(void (*exit)(struct object *))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
fake_program.exit=exit;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int low_reference_inherited_identifier(int e,struct pike_string *name)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct reference funp;
struct program *p;
int i,d;
p=fake_program.inherits[e].prog;
i=find_shared_string_identifier(name,p);
if(i==-1) return i;
if(p->identifier_references[i].flags & ID_HIDDEN)
return -1;
if(ID_FROM_INT(p,i)->func.offset == -1)
return -1;
funp=p->identifier_references[i];
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | funp.inherit_offset+=e;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | funp.flags|=ID_HIDDEN;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(d=0;d<(int)fake_program.num_identifier_references;d++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct reference *fp;
fp=fake_program.identifier_references+d;
if(!MEMCMP((char *)fp,(char *)&funp,sizeof funp)) return d;
}
add_to_mem_block(A_IDENTIFIER_REFERENCES,(char *)&funp,sizeof funp);
return fake_program.num_identifier_references;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int reference_inherited_identifier(struct pike_string *super_name,
struct pike_string *function_name)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string **names;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | int e,i;
#ifdef DEBUG
if(function_name!=debug_findstring(function_name))
fatal("reference_inherited_function on nonshared string.\n");
#endif
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | names=(struct pike_string **)inherit_names.s.str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | setup_fake_program();
for(e=fake_program.num_inherits-1;e>0;e--)
{
if(fake_program.inherits[e].inherit_level!=1) continue;
if(!names[e]) continue;
if(super_name)
{
int l;
l=names[e]->len;
if(l<super_name->len) continue;
if(strncmp(super_name->str,
names[e]->str+l-super_name->len,
super_name->len))
continue;
}
i=low_reference_inherited_identifier(e,function_name);
if(i==-1) continue;
return i;
}
return -1;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void rename_last_inherit(struct pike_string *n)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string **names;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | int e;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | names=(struct pike_string **)inherit_names.s.str;
e=inherit_names.s.len / sizeof(struct pike_string *);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free_string(names[e-1]);
copy_shared_string(names[e-1],n);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void do_inherit(struct program *p,INT32 flags, struct pike_string *name)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
int e, inherit_offset, storage_offset;
struct inherit inherit;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
setup_fake_program();
inherit_offset = fake_program.num_inherits;
storage_offset=fake_program.storage_needed;
add_storage(p->storage_needed);
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0; e<(int)p->num_inherits; e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
inherit=p->inherits[e];
inherit.prog->refs++;
inherit.identifier_level += fake_program.num_identifier_references;
inherit.storage_offset += storage_offset;
inherit.inherit_level ++;
add_to_mem_block(A_INHERITS,(char *)&inherit,sizeof inherit);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | low_my_binary_strcat((char *)&name,sizeof(name),&inherit_names);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | if(name)
{
reference_shared_string(name);
name=0;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for (e=0; e < (int)p->num_identifier_references; e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct reference fun;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *name;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
fun = p->identifier_references[e];
name=ID_FROM_PTR(p,&fun)->name;
fun.inherit_offset += inherit_offset;
if (fun.flags & ID_NOMASK)
{
int n;
n = isidentifier(name);
if (n != -1 && ID_FROM_INT(&fake_program,n)->func.offset != -1)
my_yyerror("Illegal to redefine 'nomask' function/variable \"%s\"",name->str);
}
|
558069 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(fun.flags & ID_PRIVATE) fun.flags|=ID_HIDDEN;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if (fun.flags & ID_PUBLIC)
fun.flags |= flags & ~ID_PRIVATE;
else
fun.flags |= flags;
fun.flags |= ID_INHERITED;
add_to_mem_block(A_IDENTIFIER_REFERENCES, (char *)&fun, sizeof fun);
}
s=findstring("__INIT");
if(s)
{
if(-1 != find_shared_string_identifier(s,p))
{
e=reference_inherited_identifier(0, s);
init_node=mknode(F_ARG_LIST,
init_node,
mkcastnode(void_type_string,
mkapplynode(mkidentifiernode(e),0)));
}
}
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void simple_do_inherit(struct pike_string *s, INT32 flags,struct pike_string *name)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
reference_shared_string(s);
push_string(s);
reference_shared_string(current_file);
push_string(current_file);
SAFE_APPLY_MASTER("handle_inherit", 2);
if(sp[-1].type != T_PROGRAM)
{
my_yyerror("Couldn't find file to inherit %s",s->str);
pop_stack();
return;
}
if(name)
{
free_string(s);
s=name;
}
do_inherit(sp[-1].u.program, flags, s);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | free_string(s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_stack();
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int isidentifier(struct pike_string *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
setup_fake_program();
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(int)fake_program.num_identifier_references;e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(fake_program.identifier_references[e].flags & ID_HIDDEN) continue;
if(ID_FROM_INT(& fake_program, e)->name == s)
return e;
}
return -1;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int define_variable(struct pike_string *name,
struct pike_string *type,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | INT32 flags)
{
int n;
#ifdef DEBUG
if(name!=debug_findstring(name))
fatal("define_variable on nonshared string.\n");
#endif
if(type == void_type_string)
yyerror("Variables can't be of type void");
setup_fake_program();
n = isidentifier(name);
if(n != -1)
{
setup_fake_program();
if (IDENTIFIERP(n)->flags & ID_NOMASK)
my_yyerror("Illegal to redefine 'nomask' variable/functions \"%s\"", name->str);
if(PROG_FROM_INT(& fake_program, n) == &fake_program)
|
27bd81 | 1996-10-09 | Fredrik Hübinette (Hubbe) | | my_yyerror("Variable '%s' defined twice.",name->str);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(ID_FROM_INT(& fake_program, n)->type != type)
|
27bd81 | 1996-10-09 | Fredrik Hübinette (Hubbe) | | my_yyerror("Illegal to redefine inherited variable with different type.");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(ID_FROM_INT(& fake_program, n)->flags != flags)
|
27bd81 | 1996-10-09 | Fredrik Hübinette (Hubbe) | | my_yyerror("Illegal to redefine inherited variable with different type.");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
} else {
struct identifier dummy;
struct reference ref;
copy_shared_string(dummy.name, name);
copy_shared_string(dummy.type, type);
dummy.flags = 0;
dummy.run_time_type=compile_type_to_runtime_type(type);
if(dummy.run_time_type == T_FUNCTION)
dummy.run_time_type = T_MIXED;
dummy.func.offset=add_storage(dummy.run_time_type == T_MIXED ?
sizeof(struct svalue) :
sizeof(union anything));
ref.flags=flags;
ref.identifier_offset=areas[A_IDENTIFIERS].s.len / sizeof dummy;
ref.inherit_offset=0;
add_to_mem_block(A_IDENTIFIERS, (char *)&dummy, sizeof dummy);
fake_program.num_identifiers ++;
n=areas[A_IDENTIFIER_REFERENCES].s.len / sizeof ref;
add_to_mem_block(A_IDENTIFIER_REFERENCES, (char *)&ref, sizeof ref);
fake_program.num_identifier_references ++;
}
return n;
}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | int add_constant(struct pike_string *name,
struct svalue *c,
INT32 flags)
{
int n;
#ifdef DEBUG
if(name!=debug_findstring(name))
|
e43ca2 | 1996-11-15 | Fredrik Hübinette (Hubbe) | | fatal("define_constant on nonshared string.\n");
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | #endif
setup_fake_program();
n = isidentifier(name);
if(n != -1)
{
setup_fake_program();
if (IDENTIFIERP(n)->flags & ID_NOMASK)
my_yyerror("Illegal to redefine 'nomask' identifier \"%s\"", name->str);
if(PROG_FROM_INT(& fake_program, n) == &fake_program)
my_yyerror("Identifier '%s' defined twice.",name->str);
} else {
struct identifier dummy;
struct reference ref;
copy_shared_string(dummy.name, name);
dummy.type = get_type_of_svalue(c);
dummy.flags = IDENTIFIER_CONSTANT;
dummy.run_time_type=c->type;
dummy.func.offset=store_constant(c, 0);
ref.flags=flags;
ref.identifier_offset=areas[A_IDENTIFIERS].s.len / sizeof dummy;
ref.inherit_offset=0;
add_to_mem_block(A_IDENTIFIERS, (char *)&dummy, sizeof dummy);
fake_program.num_identifiers ++;
n=areas[A_IDENTIFIER_REFERENCES].s.len / sizeof ref;
add_to_mem_block(A_IDENTIFIER_REFERENCES, (char *)&ref, sizeof ref);
fake_program.num_identifier_references ++;
}
return n;
}
|
e43ca2 | 1996-11-15 | Fredrik Hübinette (Hubbe) | | int add_integer_constant(char *name,
INT32 i,
INT32 flags)
{
struct svalue tmp;
struct pike_string *id;
int ret;
tmp.u.integer=i;
tmp.type=T_INT;
tmp.subtype=NUMBER_NUMBER;
id=make_shared_string(name);
ret=add_constant(id,&tmp, flags);
free_string(id);
return ret;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | INT32 define_function(struct pike_string *name,
struct pike_string *type,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | INT16 flags,
INT8 function_flags,
union idptr *func)
{
struct identifier *funp,fun;
struct reference ref;
INT32 i;
i=isidentifier(name);
setup_fake_program();
if(i >= 0)
{
funp=ID_FROM_INT(&fake_program, i);
ref=fake_program.identifier_references[i];
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | if(ref.inherit_offset == 0)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | if(!(!func || func->offset == -1) && !(funp->func.offset == -1))
{
my_yyerror("Redeclaration of function %s.",name->str);
return i;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | if(!match_types(type, funp->type))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
my_yyerror("Prototype doesn't match for function %s.",name->str);
}
}
if(!func || func->offset == -1) return i;
if((ref.flags & ID_NOMASK) &&
!(funp->func.offset == -1))
{
my_yyerror("Illegal to redefine 'nomask' function %s.",name->str);
}
if(ref.inherit_offset==0)
{
if(func)
funp->func = *func;
else
funp->func.offset = -1;
funp->flags=function_flags;
}else{
copy_shared_string(fun.name, name);
copy_shared_string(fun.type, type);
fun.run_time_type=T_FUNCTION;
fun.flags=function_flags;
if(func)
fun.func = *func;
else
fun.func.offset = -1;
ref.identifier_offset=fake_program.num_identifiers;
add_to_mem_block(A_IDENTIFIERS, (char *)&fun, sizeof(fun));
}
ref.inherit_offset = 0;
ref.flags = flags;
fake_program.identifier_references[i]=ref;
}else{
copy_shared_string(fun.name, name);
copy_shared_string(fun.type, type);
fun.flags=function_flags;
fun.run_time_type=T_FUNCTION;
if(func)
fun.func = *func;
else
fun.func.offset = -1;
i=fake_program.num_identifiers;
add_to_mem_block(A_IDENTIFIERS, (char *)&fun, sizeof(fun));
ref.flags = flags;
ref.identifier_offset = i;
ref.inherit_offset = 0;
i=fake_program.num_identifier_references;
add_to_mem_block(A_IDENTIFIER_REFERENCES, (char *)&ref, sizeof ref);
}
return i;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | static int low_find_shared_string_identifier(struct pike_string *name,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct program *prog)
{
int max,min,tst;
struct reference *funp;
struct identifier *fun;
unsigned short *funindex;
funindex = prog->identifier_index;
if(funindex)
{
max = prog->num_identifier_indexes;
min = 0;
while(max != min)
{
tst=(max + min) >> 1;
fun = ID_FROM_INT(prog, funindex[tst]);
if(is_same_string(fun->name,name)) return funindex[tst];
if(my_order_strcmp(fun->name, name) > 0)
max=tst;
else
min=tst+1;
}
}else{
int i,t;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(i=0;i<(int)prog->num_identifier_references;i++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
funp = prog->identifier_references + i;
if(funp->flags & ID_HIDDEN) continue;
fun = ID_FROM_PTR(prog, funp);
if(fun->func.offset == -1) continue;
if(!is_same_string(fun->name,name)) continue;
if(funp->flags & ID_INHERITED)
{
if(funp->flags & ID_PRIVATE) continue;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | for(t=0; t>=0 && t<(int)prog->num_identifier_references; t++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(t == i) continue;
if(is_same_string(fun->name, ID_FROM_INT(prog, i)->name))
t=-10;
}
if(t < 0) continue;
}
return i;
}
}
return -1;
}
#ifdef FIND_FUNCTION_HASHSIZE
#if FIND_FUNCTION_HASHSIZE == 0
#undef FIND_FUNCTION_HASHSIZE
#endif
#endif
#ifdef FIND_FUNCTION_HASHSIZE
struct ff_hash
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *name;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | int id;
int fun;
};
static struct ff_hash cache[FIND_FUNCTION_HASHSIZE];
#endif
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int find_shared_string_identifier(struct pike_string *name,
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct program *prog)
{
#ifdef FIND_FUNCTION_HASHSIZE
if(prog!=&fake_program)
{
unsigned int hashval;
hashval=my_hash_string(name);
hashval+=prog->id;
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | hashval^=(unsigned long)prog;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | hashval-=name->str[0];
hashval%=FIND_FUNCTION_HASHSIZE;
if(is_same_string(cache[hashval].name,name) &&
cache[hashval].id==prog->id)
return cache[hashval].fun;
if(cache[hashval].name) free_string(cache[hashval].name);
copy_shared_string(cache[hashval].name,name);
cache[hashval].id=prog->id;
return cache[hashval].fun=low_find_shared_string_identifier(name,prog);
}
#endif /* FIND_FUNCTION_HASHSIZE */
return low_find_shared_string_identifier(name,prog);
}
int find_identifier(char *name,struct program *prog)
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *n;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!prog)
error("Identifier lookup in destructed object.\n");
n=findstring(name);
if(!n) return -1;
return find_shared_string_identifier(n,prog);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int store_prog_string(struct pike_string *str)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
unsigned int i;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string **p;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | p = (struct pike_string **)areas[A_STRINGS].s.str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
for (i=0;i<areas[A_STRINGS].s.len / sizeof str;i++)
if (p[i] == str)
return i;
reference_shared_string(str);
add_to_mem_block(A_STRINGS, (char *)&str, sizeof str);
return i;
}
|
5683de | 1995-11-06 | Fredrik Hübinette (Hubbe) | | int store_constant(struct svalue *foo, int equal)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct svalue *s,tmp;
unsigned int e;
s=(struct svalue *)areas[A_CONSTANTS].s.str;
|
5683de | 1995-11-06 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(e=0;e<areas[A_CONSTANTS].s.len / sizeof(struct svalue);e++)
|
5683de | 1995-11-06 | Fredrik Hübinette (Hubbe) | | if(equal ? is_equal(s+e,foo) : is_eq(s+e,foo))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return e;
assign_svalue_no_free(&tmp,foo);
add_to_mem_block(A_CONSTANTS,(char *)&tmp,sizeof(struct svalue));
return e;
}
static int get_small_number(char **q)
{
int ret;
switch(ret=(*(signed char **)q)++[0])
{
case -127:
ret=EXTRACT_WORD((unsigned char*)*q);
*q+=2;
return ret;
case -128:
ret=EXTRACT_INT((unsigned char*)*q);
*q+=4;
return ret;
default:
return ret;
}
}
void start_line_numbering(void)
{
if(last_file) { free_string(last_file); last_file=0; }
last_pc=last_line=0;
}
static void insert_small_number(int a,int area)
{
if(a>-127 && a<127)
{
ins_byte(a,area);
}else if(a>=-32768 && a<32768){
ins_signed_byte(-127,area);
ins_short(a,area);
}else{
ins_signed_byte(-128,area);
|
d72a87 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | ins_int(a,area);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void store_linenumber(INT32 current_line, struct pike_string *current_file)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(last_line!=current_line || last_file != current_file)
{
if(last_file != current_file)
{
char *tmp;
if(last_file) free_string(last_file);
ins_byte(127,A_LINENUMBERS);
for(tmp=current_file->str; *tmp; tmp++) ins_byte(*tmp,A_LINENUMBERS);
ins_byte(0,A_LINENUMBERS);
copy_shared_string(last_file, current_file);
}
insert_small_number(PC-last_pc,A_LINENUMBERS);
insert_small_number(current_line-last_line,A_LINENUMBERS);
last_line=current_line;
last_pc=PC;
}
}
char *get_line(unsigned char *pc,struct program *prog,INT32 *linep)
{
char *file;
INT32 off,line,offset;
char *cnt;
|
5683de | 1995-11-06 | Fredrik Hübinette (Hubbe) | | if (prog == 0) return "Unkown program";
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | offset = pc - prog->program;
if(prog == & fake_program)
{
linep[0]=0;
return "Optimizer";
}
#ifdef DEBUG
if (offset > (INT32)prog->program_size || offset<0)
|
628379 | 1995-09-01 | Fredrik Hübinette (Hubbe) | | fatal("Illegal offset %ld in program.\n", (long)offset);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
cnt=prog->linenumbers;
off=line=0;
file="Line not found";
while(cnt < prog->linenumbers + prog->num_linenumbers)
{
if(*cnt == 127)
{
file=cnt+1;
cnt=file+strlen(file)+1;
}
off+=get_small_number(&cnt);
if(off > offset) break;
line+=get_small_number(&cnt);
}
linep[0]=line;
return file;
}
void my_yyerror(char *fmt,...)
{
va_list args;
char buf[1000];
va_start(args,fmt);
VSPRINTF(buf,fmt,args);
|
197d17 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | if((long)strlen(buf) >= (long)sizeof(buf))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | fatal("Buffer overflow in my_yyerror.");
yyerror(buf);
va_end(args);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | * Compile an PIKE file. Input is supposed to be initalized already.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
void compile()
{
void free_all_local_names();
int yyparse();
start_line_numbering();
num_parse_error = 0;
init_node=0;
yyparse();
free_all_local_names();
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct program *compile_file(struct pike_string *file_name)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
int fd;
struct program *p;
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | |
|
cf39c2 | 1996-11-18 | Fredrik Hübinette (Hubbe) | | while(1)
{
fd=open(file_name->str,O_RDONLY);
if(fd >= 0) break;
if(errno != EINTR)
error("Couldn't open file '%s'.\n",file_name->str);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #define FILE_STATE
#define PUSH
#include "compilation.h"
#undef PUSH
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | start_new_file(fd,file_name);
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | start_new_program();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | compile();
p=end_program();
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | end_new_file();
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | |
#define POP
#include "compilation.h"
#undef POP
#undef FILE_STATE
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!p) error("Failed to compile %s.\n",file_name->str);
return p;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct program *compile_string(struct pike_string *prog,
struct pike_string *name)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct program *p;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | |
#define FILE_STATE
#define PUSH
#include "compilation.h"
#undef PUSH
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | start_new_string(prog->str,prog->len,name);
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | start_new_program();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | compile();
p=end_program();
|
2acdd3 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | end_new_file();
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | |
#define POP
#include "compilation.h"
#undef POP
#undef FILE_STATE
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!p) error("Compilation failed.\n");
return p;
}
struct program *end_c_program(char *name)
{
struct program *q;
q=end_program();
push_string(make_shared_string(name));
push_program(q);
APPLY_MASTER("add_precompiled_program",2);
pop_stack();
return q;
}
void add_function(char *name,void (*cfun)(INT32),char *type,INT16 flags)
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *name_tmp,*type_tmp;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | union idptr tmp;
name_tmp=make_shared_string(name);
type_tmp=parse_type(type);
if(cfun)
{
tmp.c_fun=cfun;
define_function(name_tmp,
type_tmp,
flags,
IDENTIFIER_C_FUNCTION,
&tmp);
}else{
define_function(name_tmp,
type_tmp,
flags,
IDENTIFIER_C_FUNCTION,
0);
}
free_string(name_tmp);
free_string(type_tmp);
}
#ifdef DEBUG
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | void check_all_programs()
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct program *p;
for(p=first_program;p;p=p->next)
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | check_program(p);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
#endif
void cleanup_program()
{
#ifdef FIND_FUNCTION_HASHSIZE
int e;
for(e=0;e<FIND_FUNCTION_HASHSIZE;e++)
{
if(cache[e].name)
{
free_string(cache[e].name);
cache[e].name=0;
}
}
#endif
}
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | |
#ifdef GC2
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | void gc_mark_program_as_referenced(struct program *p)
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | {
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | if(gc_mark(p))
gc_mark_svalues(p->constants, p->num_constants);
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | }
void gc_check_all_programs()
{
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | struct program *p;
for(p=first_program;p;p=p->next)
gc_check_svalues(p->constants, p->num_constants);
}
void gc_mark_all_programs()
{
struct program *p;
for(p=first_program;p;p=p->next)
if(gc_is_referenced(p))
gc_mark_program_as_referenced(p);
}
void gc_free_all_unreferenced_programs()
{
struct program *p,*next;
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | for(p=first_program;p;p=next)
{
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | if(gc_do_free(p))
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | {
p->refs++;
|
c94c37 | 1996-03-28 | Fredrik Hübinette (Hubbe) | | free_svalues(p->constants, p->num_constants, -1);
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | next=p->next;
free_program(p);
}else{
next=p->next;
}
}
}
#endif /* GC2 */
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
void count_memory_in_programs(INT32 *num_, INT32 *size_)
{
INT32 size=0, num=0;
struct program *p;
for(p=first_program;p;p=p->next)
{
num++;
size+=p->total_size;
}
*num_=num;
*size_=size;
}
|