pike.git / src / constants.c

version» Context lines:

pike.git/src/constants.c:1: - /* - || This file is part of Pike. For copyright information see COPYRIGHT. - || Pike is distributed under GPL, LGPL and MPL. See the file COPYING - || for more information. - */ +     - #include "global.h" - #include "constants.h" - #include "pike_macros.h" - #include "program.h" - #include "pike_types.h" - #include "stralloc.h" - #include "pike_memory.h" - #include "interpret.h" - #include "mapping.h" - #include "pike_error.h" - #include "pike_security.h" - #include "gc.h" -  - #include "block_alloc.h" -  - struct mapping *builtin_constants = 0; -  - #ifdef PIKE_DEBUG - struct callable *first_callable = NULL; - #endif -  - PMOD_EXPORT struct mapping *get_builtin_constants(void) - { -  return builtin_constants; - } -  - void low_add_efun(struct pike_string *name, struct svalue *fun) - { -  struct svalue s; -  -  SET_SVAL(s, T_STRING, 0, string, name); -  -  if(fun) -  { -  mapping_insert(builtin_constants, &s, fun); -  }else{ -  map_delete(builtin_constants, &s); -  } - } -  - void low_add_constant(const char *name, struct svalue *fun) - { -  struct pike_string *p; -  p=make_shared_string(name); -  low_add_efun(p, fun); -  free_string(p); - } -  - 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); - } -  - PMOD_EXPORT void add_global_program(const char *name, struct program *p) - { -  struct svalue s; -  SET_SVAL(s, T_PROGRAM, 0, program, p); -  low_add_constant(name, p?&s:NULL); - } -  - #undef INIT_BLOCK - #define INIT_BLOCK(X) do { \ -  DO_IF_DEBUG (DOUBLELINK (first_callable, X)); \ -  } while (0) -  - #undef EXIT_BLOCK - #define EXIT_BLOCK(X) do { \ -  DO_IF_DEBUG (DOUBLEUNLINK (first_callable, X)); \ -  free_type(X->type); \ -  free_string(X->name); \ -  X->name=0; \ -  EXIT_PIKE_MEMOBJ(X); \ - }while(0) -  - BLOCK_ALLOC_FILL_PAGES(callable,2) -  - int global_callable_flags=0; -  - /* Eats one ref to 'type' and 'name' */ - PMOD_EXPORT struct callable *low_make_callable(c_fun fun, -  struct pike_string *name, -  struct pike_type *type, -  int flags, -  optimize_fun optimize, -  docode_fun docode) - { -  struct callable *f=alloc_callable(); -  INIT_PIKE_MEMOBJ(f, T_STRUCT_CALLABLE); -  f->function=fun; -  f->name=name; -  f->type=type; -  f->prog=Pike_compiler->new_program; -  f->flags=flags; -  f->docode=docode; -  f->optimize=optimize; -  f->internal_flags = global_callable_flags; - #ifdef PIKE_DEBUG -  { -  struct pike_type *z = NULL; -  add_ref(type); -  type = check_splice_call(name, type, 1, mixed_type_string, NULL, -  CALL_INHIBIT_WARNINGS); -  if (type) { -  z = new_get_return_type(type, CALL_INHIBIT_WARNINGS); -  free_type(type); -  } -  f->may_return_void = (z == void_type_string); -  if(!z) Pike_fatal("Function has no valid return type.\n"); -  free_type(z); -  } -  f->runs=0; - #endif -  return f; - } -  - PMOD_EXPORT struct callable *make_callable(c_fun fun, -  const char *name, -  const char *type, -  int flags, -  optimize_fun optimize, -  docode_fun docode) - { -  return low_make_callable(fun, make_shared_string(name), parse_type(type), -  flags, optimize, docode); - } -  - PMOD_EXPORT void add_efun2(const char *name, -  c_fun fun, -  const char *type, -  int flags, -  optimize_fun optimize, -  docode_fun docode) - { -  struct svalue s; -  struct pike_string *n; -  -  n=make_shared_string(name); -  SET_SVAL(s, T_FUNCTION, FUNCTION_BUILTIN, efun, -  make_callable(fun, name, type, flags, optimize, docode)); -  low_add_efun(n, &s); -  free_svalue(&s); -  free_string(n); - } -  - PMOD_EXPORT void add_efun(const char *name, c_fun fun, const char *type, int flags) - { -  add_efun2(name,fun,type,flags,0,0); - } -  - PMOD_EXPORT void quick_add_efun(const char *name, ptrdiff_t name_length, -  c_fun fun, -  const char *type, ptrdiff_t UNUSED(type_length), -  int flags, -  optimize_fun optimize, -  docode_fun docode) - { -  struct svalue s; -  struct pike_string *n; -  struct pike_type *t; -  - #ifdef PIKE_DEBUG -  if(simple_mapping_string_lookup(builtin_constants, name)) -  Pike_fatal("%s added as efun more than once.\n", name); - #endif -  -  n = make_shared_binary_string(name, name_length); -  t = make_pike_type(type); - #ifdef DEBUG -  check_type_string(t); - #endif -  add_ref(n); -  SET_SVAL(s, T_FUNCTION, FUNCTION_BUILTIN, efun, -  low_make_callable(fun, n, t, flags, optimize, docode)); -  mapping_string_insert(builtin_constants, n, &s); -  free_svalue(&s); -  free_string(n); - } -  - PMOD_EXPORT void visit_callable (struct callable *c, int action) - { -  switch (action) { - #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)) { -  visit_type_ref (c->type, REF_TYPE_NORMAL); -  visit_string_ref (c->name, REF_TYPE_NORMAL); -  } -  -  /* Looks like the c->prog isn't refcounted..? */ -  /* visit_program_ref (c->prog, REF_TYPE_NORMAL); */ - } -  - #ifdef PIKE_DEBUG - void present_constant_profiling(void) - { -  struct callable_block *b; -  size_t e; -  for(b=callable_blocks;b;b=b->next) -  { -  for(e=0;e<NELEM(b->x);e++) -  { -  if(b->x[e].name) -  { -  fprintf(stderr,"%010ld @E@: %s\n",b->x[e].runs, b->x[e].name->str); -  } -  } -  } - } - #endif -  - void init_builtin_constants(void) - { -  builtin_constants = allocate_mapping(300); - } -  - void exit_builtin_constants(void) - { - #ifdef DO_PIKE_CLEANUP -  if(builtin_constants) -  { -  free_mapping(builtin_constants); -  builtin_constants=0; -  } - #endif - } +    Newline at end of file removed.