e576bb | 2002-10-11 | Martin Nilsson | |
|
aedfb1 | 2002-10-09 | Martin Nilsson | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "constants.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #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"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "interpret.h"
|
244ce6 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | #include "mapping.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
5e8344 | 2008-05-11 | Martin Stjernholm | | #include "gc.h"
|
6eff5e | 2013-10-09 | Arne Goedeke | | #include "block_allocator.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
5f61da | 2000-04-13 | Fredrik Hübinette (Hubbe) | | struct mapping *builtin_constants = 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
1e9388 | 2003-08-20 | Martin Stjernholm | | #ifdef PIKE_DEBUG
struct callable *first_callable = NULL;
#endif
|
6c3a6f | 2013-11-20 | Henrik Grubbström (Grubba) | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct mapping *get_builtin_constants(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
244ce6 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | return builtin_constants;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
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) | | {
|
244ce6 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | struct svalue s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(s, T_STRING, 0, string, name);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
244ce6 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(fun)
{
mapping_insert(builtin_constants, &s, fun);
}else{
map_delete(builtin_constants, &s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
0929a0 | 2002-09-12 | Marcus Comstedt | | void low_add_constant(const char *name, struct svalue *fun)
|
cecf51 | 1997-02-06 | Fredrik Hübinette (Hubbe) | | {
struct pike_string *p;
p=make_shared_string(name);
low_add_efun(p, fun);
free_string(p);
}
|
7abd89 | 2004-12-30 | Henrik Grubbström (Grubba) | | void add_pike_string_constant(const char *name, const char *str, int len)
{
struct pike_string *key = make_shared_string(name);
struct pike_string *val = make_shared_binary_string(str, len);
mapping_string_insert_string(builtin_constants, key, val);
free_string(val);
free_string(key);
}
|
0929a0 | 2002-09-12 | Marcus Comstedt | | PMOD_EXPORT void add_global_program(const char *name, struct program *p)
|
cecf51 | 1997-02-06 | Fredrik Hübinette (Hubbe) | | {
struct svalue s;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(s, T_PROGRAM, 0, program, p);
|
ac0bdd | 2007-04-17 | Henrik Grubbström (Grubba) | | low_add_constant(name, p?&s:NULL);
|
cecf51 | 1997-02-06 | Fredrik Hübinette (Hubbe) | | }
|
d47659 | 2013-06-12 | Arne Goedeke | | static struct block_allocator callable_allocator
= BA_INIT_PAGES(sizeof(struct callable), 2);
void really_free_callable(struct callable * c) {
|
6eff5e | 2013-10-09 | Arne Goedeke | | #ifdef PIKE_DEBUG
DOUBLEUNLINK (first_callable, c);
#endif
free_type(c->type);
free_string(c->name);
c->name=0;
EXIT_PIKE_MEMOBJ(c);
|
d47659 | 2013-06-12 | Arne Goedeke | | ba_free(&callable_allocator, c);
}
|
6eff5e | 2013-10-09 | Arne Goedeke | |
|
d47659 | 2013-06-12 | Arne Goedeke | | void count_memory_in_callables(size_t * num, size_t * size) {
ba_count_all(&callable_allocator, num, size);
}
|
3b54e5 | 2014-08-21 | Martin Nilsson | | void free_all_callable_blocks(void) {
|
d47659 | 2013-06-12 | Arne Goedeke | | ba_destroy(&callable_allocator);
}
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | |
|
c39e43 | 2001-08-02 | Fredrik Hübinette (Hubbe) | | int global_callable_flags=0;
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct callable *low_make_callable(c_fun fun,
|
167da2 | 2008-06-18 | Henrik Grubbström (Grubba) | | struct pike_string *name,
struct pike_type *type,
int flags,
optimize_fun optimize,
docode_fun docode)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
dc8d02 | 2014-04-27 | Martin Nilsson | | struct callable *f=ba_alloc(&callable_allocator);
|
d47659 | 2013-06-12 | Arne Goedeke | | #ifdef PIKE_DEBUG
DOUBLELINK(first_callable, f);
#endif
|
938632 | 2011-07-21 | Henrik Grubbström (Grubba) | | INIT_PIKE_MEMOBJ(f, T_STRUCT_CALLABLE);
|
abe64b | 2018-05-19 | Tobias S. Josefowitz | | gc_init_marker(f);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | f->function=fun;
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | f->name=name;
f->type=type;
|
48a624 | 2003-05-31 | Martin Stjernholm | | f->prog=Pike_compiler->new_program;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | f->flags=flags;
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | f->docode=docode;
f->optimize=optimize;
|
c39e43 | 2001-08-02 | Fredrik Hübinette (Hubbe) | | f->internal_flags = global_callable_flags;
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
{
|
167da2 | 2008-06-18 | Henrik Grubbström (Grubba) | | struct pike_type *z = NULL;
|
aed65f | 2022-06-10 | Henrik Grubbström (Grubba) | | struct call_state cs;
|
167da2 | 2008-06-18 | Henrik Grubbström (Grubba) | | add_ref(type);
|
9a08e3 | 2022-06-11 | Henrik Grubbström (Grubba) | | LOW_INIT_CALL_STATE(cs, 1, NULL);
|
aed65f | 2022-06-10 | Henrik Grubbström (Grubba) | | type = check_splice_call(name, type, &cs, mixed_type_string, NULL,
|
167da2 | 2008-06-18 | Henrik Grubbström (Grubba) | | CALL_INHIBIT_WARNINGS);
if (type) {
|
5fab7d | 2022-07-09 | Henrik Grubbström (Grubba) | | z = new_get_return_type(type, &cs, CALL_INHIBIT_WARNINGS);
|
167da2 | 2008-06-18 | Henrik Grubbström (Grubba) | | free_type(type);
}
|
ff8572 | 2021-03-22 | Henrik Grubbström (Grubba) | | f->may_return_void = pike_types_le(z, void_type_string, 0, 0);
|
a1fd45 | 2002-12-12 | Martin Nilsson | | if(!z) Pike_fatal("Function has no valid return type.\n");
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(z);
|
aed65f | 2022-06-10 | Henrik Grubbström (Grubba) | | FREE_CALL_STATE(cs);
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | }
|
d9a93b | 2001-07-01 | Fredrik Hübinette (Hubbe) | | f->runs=0;
|
044c62 | 1999-04-14 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return f;
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct callable *make_callable(c_fun fun,
|
0929a0 | 2002-09-12 | Marcus Comstedt | | const char *name,
const char *type,
|
7e877a | 2003-04-02 | Martin Stjernholm | | int flags,
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | optimize_fun optimize,
docode_fun docode)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | return low_make_callable(fun, make_shared_string(name), parse_type(type),
flags, optimize, docode);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5d1e95 | 2011-11-05 | Martin Nilsson | | PMOD_EXPORT void add_efun2(const char *name,
c_fun fun,
const char *type,
int 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);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(s, T_FUNCTION, FUNCTION_BUILTIN, 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);
}
|
5d1e95 | 2011-11-05 | Martin Nilsson | | PMOD_EXPORT void add_efun(const char *name, c_fun fun, const char *type, int flags)
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | {
|
5d1e95 | 2011-11-05 | Martin Nilsson | | add_efun2(name,fun,type,flags,0,0);
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | | }
|
5d1e95 | 2011-11-05 | Martin Nilsson | | PMOD_EXPORT void quick_add_efun(const char *name, ptrdiff_t name_length,
c_fun fun,
|
74dfe8 | 2012-12-30 | Jonas Walldén | | const char *type, ptrdiff_t UNUSED(type_length),
|
5d1e95 | 2011-11-05 | Martin Nilsson | | int flags,
optimize_fun optimize,
docode_fun docode)
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | {
struct svalue s;
|
369940 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_string *n;
struct pike_type *t;
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | |
|
3866ad | 2004-05-18 | David Gourdelier | | #ifdef PIKE_DEBUG
|
85649e | 2004-01-13 | Martin Nilsson | | if(simple_mapping_string_lookup(builtin_constants, name))
Pike_fatal("%s added as efun more than once.\n", name);
#endif
|
8a2a52 | 2001-03-03 | Henrik Grubbström (Grubba) | | n = make_shared_binary_string(name, name_length);
t = make_pike_type(type);
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | add_ref(n);
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | SET_SVAL(s, T_FUNCTION, FUNCTION_BUILTIN, efun,
|
5d1e95 | 2011-11-05 | Martin Nilsson | | low_make_callable(fun, n, t, flags, optimize, docode));
|
85649e | 2004-01-13 | Martin Nilsson | | mapping_string_insert(builtin_constants, n, &s);
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | free_svalue(&s);
free_string(n);
}
|
7c36d5 | 2014-06-17 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void visit_callable (struct callable *c, int action, void *extra)
|
5e8344 | 2008-05-11 | Martin Stjernholm | | {
|
c42e09 | 2014-06-18 | Henrik Grubbström (Grubba) | | visit_enter(c, T_STRUCT_CALLABLE, extra);
|
8775df | 2015-06-04 | Martin Karlgren | | switch (action & VISIT_MODE_MASK) {
|
5e8344 | 2008-05-11 | Martin Stjernholm | | #ifdef PIKE_DEBUG
default:
Pike_fatal ("Unknown visit action %d.\n", action);
case VISIT_NORMAL:
case VISIT_COMPLEX_ONLY:
break;
#endif
case VISIT_COUNT_BYTES:
mc_counted_bytes += sizeof (struct callable);
break;
}
if (!(action & VISIT_COMPLEX_ONLY)) {
|
7c36d5 | 2014-06-17 | Henrik Grubbström (Grubba) | | visit_type_ref (c->type, REF_TYPE_NORMAL, extra);
visit_string_ref (c->name, REF_TYPE_NORMAL, extra);
|
5e8344 | 2008-05-11 | Martin Stjernholm | | }
|
c42e09 | 2014-06-18 | Henrik Grubbström (Grubba) | | visit_leave(c, T_STRUCT_CALLABLE, extra);
|
5e8344 | 2008-05-11 | Martin Stjernholm | | }
|
d9a93b | 2001-07-01 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
void present_constant_profiling(void)
{
|
d47659 | 2013-06-12 | Arne Goedeke | | struct callable *c;
for (c = first_callable; c; c = c->next) {
fprintf(stderr,"%010ld @E@: %s\n",c->runs, c->name->str);
|
d9a93b | 2001-07-01 | Fredrik Hübinette (Hubbe) | | }
}
#endif
|
d8073b | 2002-01-27 | Martin Stjernholm | | void init_builtin_constants(void)
{
|
8942e6 | 2021-10-25 | Martin Nilsson | | builtin_constants = allocate_mapping(340);
|
d8073b | 2002-01-27 | Martin Stjernholm | | }
|
1c5b34 | 2003-03-26 | Martin Nilsson | | void exit_builtin_constants(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
5b7b06 | 1999-04-08 | Fredrik Hübinette (Hubbe) | | #ifdef DO_PIKE_CLEANUP
|
244ce6 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(builtin_constants)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
244ce6 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | free_mapping(builtin_constants);
builtin_constants=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5b7b06 | 1999-04-08 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|