cb2256 | 1995-10-11 | 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)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "constants.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "macros.h"
#include "program.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 "memory.h"
#include "interpret.h"
static struct hash_table *efun_hash = 0;
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | static INT32 num_callable=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct efun *lookup_efun(struct pike_string *name)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct hash_entry *h;
if(!efun_hash) return 0;
h=hash_lookup(efun_hash, name);
if(!h) return 0;
return BASEOF(h, efun, link);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void low_add_efun(struct pike_string *name, struct svalue *fun)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct efun *parent;
parent=lookup_efun(name);
if(!parent)
{
if(!fun) return;
parent=ALLOC_STRUCT(efun);
copy_shared_string(parent->link.s,name);
efun_hash=hash_insert(efun_hash, &parent->link);
}else{
free_svalue(& parent->function);
if(!fun)
{
efun_hash=hash_unlink(efun_hash, &parent->link);
free_string(parent->link.s);
free((char *)parent);
return;
}
}
assign_svalue_no_free(& parent->function, fun);
}
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | struct callable *make_callable(c_fun fun,
char *name,
char *type,
INT16 flags,
optimize_fun optimize,
docode_fun docode)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct callable *f;
f=ALLOC_STRUCT(callable);
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | num_callable++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | f->refs=1;
f->function=fun;
f->name=make_shared_string(name);
f->type=parse_type(type);
f->flags=flags;
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | f->docode=docode;
f->optimize=optimize;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return f;
}
void really_free_callable(struct callable *fun)
{
free_string(fun->type);
free_string(fun->name);
free((char *)fun);
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | num_callable--;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | void add_efun2(char *name,
c_fun fun,
char *type,
INT16 flags,
optimize_fun optimize,
docode_fun docode)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct svalue s;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *n;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
n=make_shared_string(name);
s.type=T_FUNCTION;
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | s.subtype=FUNCTION_BUILTIN;
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | s.u.efun=make_callable(fun, name, type, flags, optimize, docode);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | low_add_efun(n, &s);
free_svalue(&s);
free_string(n);
}
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | void add_efun(char *name, c_fun fun, char *type, INT16 flags)
{
add_efun2(name,fun,type,flags,0,0);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | static void push_efun_entry(struct hash_entry *h)
{
struct efun *f;
|
5e0340 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | check_stack(1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | f=BASEOF(h, efun, link);
push_string(f->link.s);
f->link.s->refs++;
|
5aa04a | 1996-05-16 | Fredrik Hübinette (Hubbe) | | copy_svalues_recursively_no_free(sp,& f->function,1,0);
sp++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void push_all_efuns_on_stack()
{
if(efun_hash)
map_hashtable(efun_hash,push_efun_entry);
}
static void free_one_hashtable_entry(struct hash_entry *h)
{
struct efun *f;
f=BASEOF(h, efun, link);
free_svalue(& f->function);
free((char *)f);
}
void cleanup_added_efuns()
{
if(efun_hash)
{
free_hashtable(efun_hash,free_one_hashtable_entry);
efun_hash=0;
}
}
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
void count_memory_in_constants(INT32 *num_, INT32 *size_)
{
INT32 size=0, num=0;
if(efun_hash)
{
size+=sizeof(struct hash_table) +
efun_hash->mask*sizeof(struct hash_entry)+
efun_hash->entries*sizeof(struct efun);
}
*num_=num;
*size_=size;
}
void count_memory_in_callables(INT32 *num_, INT32 *size_)
{
*num_=num_callable;
*size_=num_callable*sizeof(struct callable);
}
|