cb22561995-10-11Fredrik Hübinette (Hubbe) /*\
06983f1996-09-22Fredrik Hübinette (Hubbe) ||| This file a part of Pike, and is copyright by Fredrik Hubinette ||| Pike is distributed as GPL (General Public License)
cb22561995-10-11Fredrik Hübinette (Hubbe) ||| See the files COPYING and DISCLAIMER for more information. \*/
24ddc71998-03-28Henrik Grubbström (Grubba)  /*
e83eb92001-03-22Fredrik Hübinette (Hubbe)  * $Id: svalue.h,v 1.82 2001/03/23 03:14:41 hubbe Exp $
24ddc71998-03-28Henrik Grubbström (Grubba)  */
5267b71995-08-09Fredrik Hübinette (Hubbe) #ifndef SVALUE_H #define SVALUE_H
bed9601997-05-19Fredrik Hübinette (Hubbe) #include "global.h"
5267b71995-08-09Fredrik Hübinette (Hubbe) 
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #ifndef STRUCT_ARRAY_DECLARED #define STRUCT_ARRAY_DECLARED
5267b71995-08-09Fredrik Hübinette (Hubbe) struct array;
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #endif #ifndef STRUCT_MAPPING_DECLARED #define STRUCT_MAPPING_DECLARED
5267b71995-08-09Fredrik Hübinette (Hubbe) struct mapping;
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #endif #ifndef STRUCT_MULTISET_DECLARED #define STRUCT_MULTISET_DECLARED
06983f1996-09-22Fredrik Hübinette (Hubbe) struct multiset;
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #endif #ifndef STRUCT_OBJECT_DECLARED #define STRUCT_OBJECT_DECLARED
5267b71995-08-09Fredrik Hübinette (Hubbe) struct object;
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #endif #ifndef STRUCT_PROGRAM_DECLARED #define STRUCT_PROGRAM_DECLARED
5267b71995-08-09Fredrik Hübinette (Hubbe) struct program;
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #endif #ifndef STRUCT_PIKE_STRING_DECLARED #define STRUCT_PIKE_STRING_DECLARED
06983f1996-09-22Fredrik Hübinette (Hubbe) struct pike_string;
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #endif #ifndef STRUCT_CALLABLE_DECLARED #define STRUCT_CALLABLE_DECLARED
5267b71995-08-09Fredrik Hübinette (Hubbe) struct callable;
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #endif
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct processing { struct processing *next; void *pointer_a, *pointer_b; };
e83eb92001-03-22Fredrik Hübinette (Hubbe) struct ref_dummy { INT32 refs; };
5267b71995-08-09Fredrik Hübinette (Hubbe) union anything { struct callable *efun; struct array *array; struct mapping *mapping;
06983f1996-09-22Fredrik Hübinette (Hubbe)  struct multiset *multiset;
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct object *object; struct program *program;
06983f1996-09-22Fredrik Hübinette (Hubbe)  struct pike_string *string;
d68a072001-02-20Henrik Grubbström (Grubba)  struct pike_type *type;
b032b92000-08-10Henrik Grubbström (Grubba)  INT32 *refs;
e83eb92001-03-22Fredrik Hübinette (Hubbe)  struct ref_dummy *dummy;
8a222b1998-02-27Fredrik Hübinette (Hubbe)  INT_TYPE integer;
5267b71995-08-09Fredrik Hübinette (Hubbe)  FLOAT_TYPE float_number; struct svalue *lval; /* only used on stack */ union anything *short_lval; /* only used on stack */ };
dfa5b31996-12-05Fredrik Hübinette (Hubbe) #ifndef STRUCT_SVALUE_DECLARED #define STRUCT_SVALUE_DECLARED #endif
5267b71995-08-09Fredrik Hübinette (Hubbe) struct svalue {
39e0bd1996-06-09Fredrik Hübinette (Hubbe)  unsigned INT16 type;
bdb5091996-09-25Fredrik Hübinette (Hubbe)  unsigned INT16 subtype;
5267b71995-08-09Fredrik Hübinette (Hubbe)  union anything u; };
0542ef1999-11-17Fredrik Hübinette (Hubbe) #define PIKE_T_ARRAY 0 #define PIKE_T_MAPPING 1 #define PIKE_T_MULTISET 2 #define PIKE_T_OBJECT 3 #define PIKE_T_FUNCTION 4 #define PIKE_T_PROGRAM 5 #define PIKE_T_STRING 6
02964b2001-03-03Henrik Grubbström (Grubba) #define PIKE_T_TYPE 7
5a59441999-12-11Henrik Grubbström (Grubba) #define PIKE_T_INT 8 #define PIKE_T_FLOAT 9
5267b71995-08-09Fredrik Hübinette (Hubbe) 
5bd05e1999-11-23Henrik Grubbström (Grubba) #define PIKE_T_ZERO 14 /* Can return 0, but nothing else */ #define T_UNFINISHED 15 /* Reserved for the garbage-collector */ #define T_VOID 16 /* Can't return any value */ #define T_MANY 17
3c04e81997-03-13Fredrik Hübinette (Hubbe) 
ce88d62001-03-19Henrik Grubbström (Grubba) #define PIKE_T_RING 240
f62c412001-03-05Henrik Grubbström (Grubba) #define PIKE_T_NAME 241 /* Only supported in USE_PIKE_TYPE-mode. */
d026152000-09-04Martin Stjernholm #define T_MAPPING_DATA 242
538e811999-12-10Henrik Grubbström (Grubba) #define PIKE_T_SCOPE 243 /* Not supported yet */ #define PIKE_T_TUPLE 244 /* Not supported yet */
9e52381998-03-01Fredrik Hübinette (Hubbe) #define T_ASSIGN 245
39e0bd1996-06-09Fredrik Hübinette (Hubbe) #define T_DELETED 246
04966d2000-10-03Fredrik Hübinette (Hubbe) #define PIKE_T_UNKNOWN 247
fe25591999-12-19Henrik Grubbström (Grubba) #define T_SHORT_LVALUE 248 #define T_LVALUE 249 #define T_ARRAY_LVALUE 250
2cd8ca2000-07-28Fredrik Hübinette (Hubbe) #define PIKE_T_MIXED 251
fe25591999-12-19Henrik Grubbström (Grubba) #define T_NOT 253 #define T_AND 254 #define T_OR 255
5267b71995-08-09Fredrik Hübinette (Hubbe) 
54db6c1999-03-27Henrik Grubbström (Grubba) 
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #define tArr(VAL) "\000" VAL #define tArray tArr(tMix) #define tMap(IND,VAL) "\001" IND VAL #define tMapping tMap(tMix,tMix) #define tSet(IND) "\002" IND #define tMultiset tSet(tMix) #define tObj "\003\000\000\000\000\000"
efa5fa1999-08-06Fredrik Hübinette (Hubbe)  #define tFuncV(ARGS,REST,RET) MagictFuncV(RET,REST,ARGS) #define tFunc(ARGS,RET) MagictFunc(RET,ARGS)
538e811999-12-10Henrik Grubbström (Grubba) #define tTuple(T1,T2) "\364" T1 T2 #define tTriple(T1,T2,T3) tTuple(T1, tTuple(T2, T3)) #define tQuad(T1,T2,T3,T4) tTriple(tTuple(T1, T2), T3, T4)
efa5fa1999-08-06Fredrik Hübinette (Hubbe) /* These two magic funcions are used to make MSVC++ work * even if 'ARGS' is empty. */ #define MagictFuncV(RET,REST,ARGS) "\004" ARGS "\021" REST RET #define MagictFunc(RET,ARGS) tFuncV(ARGS "", tVoid, RET)
3123ab2000-01-03Martin Stjernholm #define tFunction tFuncV("" ,tOr(tZero,tVoid),tOr(tMix,tVoid))
e64f5a1999-06-19Fredrik Hübinette (Hubbe) #define tNone ""
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #define tPrg "\005" #define tProgram "\005" #define tStr "\006" #define tString "\006"
54f8ac2001-03-17Henrik Grubbström (Grubba) #define tType(T) "\007" T
5a59441999-12-11Henrik Grubbström (Grubba) #define tInt "\010\200\000\000\000\177\377\377\377" #define tInt0 "\010\000\000\000\000\000\000\000\000" #define tInt1 "\010\000\000\000\001\000\000\000\001"
c3965a2000-04-19Henrik Grubbström (Grubba) #define tInt2 "\010\000\000\000\002\000\000\000\002"
5a59441999-12-11Henrik Grubbström (Grubba) #define tInt01 "\010\000\000\000\000\000\000\000\001"
69dfee1999-12-14Martin Stjernholm #define tInt02 "\010\000\000\000\000\000\000\000\002" #define tInt03 "\010\000\000\000\000\000\000\000\003" #define tInt04 "\010\000\000\000\000\000\000\000\004" #define tInt05 "\010\000\000\000\000\000\000\000\005"
e456092000-08-29Martin Stjernholm #define tInt06 "\010\000\000\000\000\000\000\000\006"
5a59441999-12-11Henrik Grubbström (Grubba) #define tIntPos "\010\000\000\000\000\177\377\377\377"
c3965a2000-04-19Henrik Grubbström (Grubba) #define tInt1Plus "\010\000\000\000\001\177\377\377\377" #define tInt2Plus "\010\000\000\000\002\177\377\377\377"
5a59441999-12-11Henrik Grubbström (Grubba) #define tByte "\010\000\000\000\000\000\000\000\377"
fe25591999-12-19Henrik Grubbström (Grubba) #define tFlt "\011" #define tFloat "\011"
45ee5d1999-02-10Fredrik Hübinette (Hubbe) 
5bd05e1999-11-23Henrik Grubbström (Grubba) #define tZero "\016"
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #define tVoid "\020" #define tVar(X) #X #define tSetvar(X,Y) "\365" #X Y
538e811999-12-10Henrik Grubbström (Grubba) #define tScope(X,T) "\363" #X Y
fe25591999-12-19Henrik Grubbström (Grubba) #define tNot(X) "\375" X #define tAnd(X,Y) "\376" X Y #define tOr(X,Y) "\377" X Y
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #define tOr3(X,Y,Z) tOr(X,tOr(Y,Z)) #define tOr4(X,Y,Z,A) tOr(X,tOr(Y,tOr(Z,A))) #define tOr5(X,Y,Z,A,B) tOr(X,tOr(Y,tOr(Z,tOr(A,B)))) #define tOr6(X,Y,Z,A,B,C) tOr(X,tOr(Y,tOr(Z,tOr(A,tOr(B,C))))) #define tOr7(X,Y,Z,A,B,C,D) tOr(X,tOr(Y,tOr(Z,tOr(A,tOr(B,tOr(C,D))))))
b93cd71999-07-27Mirar (Pontus Hagland) #define tOr8(A,B,C,D,E,F,G,H) tOr(A,tOr7(B,C,D,E,F,G,H))
9f0d2e2000-09-26Henrik Wallin #define tOr9(A,B,C,D,E,F,G,H,I) tOr(A,tOr8(B,C,D,E,F,G,H,I))
fe25591999-12-19Henrik Grubbström (Grubba) #define tMix "\373" #define tMixed "\373"
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #define tComplex tOr6(tArray,tMapping,tMultiset,tObj,tFunction,tProgram)
b93cd71999-07-27Mirar (Pontus Hagland) #define tStringIndicable tOr5(tMapping,tObj,tFunction,tProgram,tMultiset)
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #define tRef tOr(tString,tComplex) #define tIfnot(X,Y) tAnd(tNot(X),Y)
be07701999-11-25Martin Stjernholm #define tAny tOr(tVoid,tMix)
45ee5d1999-02-10Fredrik Hübinette (Hubbe) 
1f21332000-07-28Fredrik Hübinette (Hubbe) #define tSimpleCallable tOr3(tArray,tFunction,tObj) #define tCallable tOr3(tArr(tSimpleCallable),tFunction,tObj)
0542ef1999-11-17Fredrik Hübinette (Hubbe) #define BIT_ARRAY (1<<PIKE_T_ARRAY) #define BIT_MAPPING (1<<PIKE_T_MAPPING) #define BIT_MULTISET (1<<PIKE_T_MULTISET) #define BIT_OBJECT (1<<PIKE_T_OBJECT) #define BIT_FUNCTION (1<<PIKE_T_FUNCTION) #define BIT_PROGRAM (1<<PIKE_T_PROGRAM) #define BIT_STRING (1<<PIKE_T_STRING)
538e811999-12-10Henrik Grubbström (Grubba) #define BIT_TYPE (1<<PIKE_T_TYPE)
0542ef1999-11-17Fredrik Hübinette (Hubbe) #define BIT_INT (1<<PIKE_T_INT) #define BIT_FLOAT (1<<PIKE_T_FLOAT)
5267b71995-08-09Fredrik Hübinette (Hubbe) 
5bd05e1999-11-23Henrik Grubbström (Grubba) #define BIT_ZERO (1<<PIKE_T_ZERO)
3c04e81997-03-13Fredrik Hübinette (Hubbe) /* Used to signify that this array might not be finished yet */
4eb50a1996-05-16Fredrik Hübinette (Hubbe) /* garbage collect uses this */
5bd05e1999-11-23Henrik Grubbström (Grubba) #define BIT_UNFINISHED (1 << T_UNFINISHED)
4eb50a1996-05-16Fredrik Hübinette (Hubbe) 
3c04e81997-03-13Fredrik Hübinette (Hubbe) /* This is only used in typechecking to signify that this * argument may be omitted. */
5bd05e1999-11-23Henrik Grubbström (Grubba) #define BIT_VOID (1 << T_VOID)
3c04e81997-03-13Fredrik Hübinette (Hubbe)  /* This is used in typechecking to signify that the rest of the * arguments has to be of this type. */ #define BIT_MANY (1 << T_MANY)
5267b71995-08-09Fredrik Hübinette (Hubbe) #define BIT_NOTHING 0
4eb50a1996-05-16Fredrik Hübinette (Hubbe) #define BIT_MIXED 0x7fff
538e811999-12-10Henrik Grubbström (Grubba) #define BIT_BASIC (BIT_INT|BIT_FLOAT|BIT_STRING|BIT_TYPE)
5756661996-09-23Fredrik Hübinette (Hubbe) #define BIT_COMPLEX (BIT_ARRAY|BIT_MULTISET|BIT_OBJECT|BIT_PROGRAM|BIT_MAPPING|BIT_FUNCTION)
898bb91999-06-07Fredrik Hübinette (Hubbe) #define BIT_CALLABLE (BIT_FUNCTION|BIT_PROGRAM|BIT_ARRAY|BIT_OBJECT)
624d091996-02-24Fredrik Hübinette (Hubbe) 
7e97c31999-01-21Fredrik Hübinette (Hubbe) /* Max type which contains svalues */
0542ef1999-11-17Fredrik Hübinette (Hubbe) #define MAX_COMPLEX PIKE_T_PROGRAM
5267b71995-08-09Fredrik Hübinette (Hubbe) /* Max type with ref count */
538e811999-12-10Henrik Grubbström (Grubba) #define MAX_REF_TYPE PIKE_T_TYPE
5267b71995-08-09Fredrik Hübinette (Hubbe) /* Max type handled by svalue primitives */
5a59441999-12-11Henrik Grubbström (Grubba) #define MAX_TYPE PIKE_T_FLOAT
5267b71995-08-09Fredrik Hübinette (Hubbe)  #define NUMBER_NUMBER 0 #define NUMBER_UNDEFINED 1 #define NUMBER_DESTRUCTED 2
bdb5091996-09-25Fredrik Hübinette (Hubbe) #define FUNCTION_BUILTIN USHRT_MAX
bce86c1996-02-25Fredrik Hübinette (Hubbe) #define is_gt(a,b) is_lt(b,a)
0542ef1999-11-17Fredrik Hübinette (Hubbe) #define IS_ZERO(X) ((X)->type==PIKE_T_INT?(X)->u.integer==0:(1<<(X)->type)&(BIT_OBJECT|BIT_FUNCTION)?!svalue_is_true(X):0)
5267b71995-08-09Fredrik Hübinette (Hubbe) 
0542ef1999-11-17Fredrik Hübinette (Hubbe) #define IS_UNDEFINED(X) ((X)->type==PIKE_T_INT&&!(X)->u.integer&&(X)->subtype==1)
3495fe1997-02-06Fredrik Hübinette (Hubbe) 
d026152000-09-04Martin Stjernholm #define IS_DESTRUCTED(X) \ (((X)->type == PIKE_T_OBJECT || (X)->type==PIKE_T_FUNCTION) && !(X)->u.object->prog)
5267b71995-08-09Fredrik Hübinette (Hubbe) #define check_destructed(S) \ do{ \ struct svalue *_s=(S); \
d026152000-09-04Martin Stjernholm  if(IS_DESTRUCTED(_s)) { \
5267b71995-08-09Fredrik Hübinette (Hubbe)  free_object(_s->u.object); \
0542ef1999-11-17Fredrik Hübinette (Hubbe)  _s->type = PIKE_T_INT; \
5267b71995-08-09Fredrik Hübinette (Hubbe)  _s->subtype = NUMBER_DESTRUCTED ; \ _s->u.integer = 0; \ } \ }while(0)
453f4c1996-08-12Fredrik Hübinette (Hubbe) /* var MUST be a variable!!! */ #define safe_check_destructed(var) do{ \
0542ef1999-11-17Fredrik Hübinette (Hubbe)  if((var->type == PIKE_T_OBJECT || var->type==PIKE_T_FUNCTION) && !var->u.object->prog) \
453f4c1996-08-12Fredrik Hübinette (Hubbe)  var=&dest_ob_zero; \ }while(0)
5267b71995-08-09Fredrik Hübinette (Hubbe) #define check_short_destructed(U,T) \ do{ \ union anything *_u=(U); \ if(( (1<<(T)) & (BIT_OBJECT | BIT_FUNCTION) ) && \ _u->object && !_u->object->prog) { \ free_object(_u->object); \ _u->object = 0; \ } \ }while(0)
e83eb92001-03-22Fredrik Hübinette (Hubbe)  #ifdef PIKE_RUN_UNLOCKED #define add_ref(X) pike_atomic_add_ref(&(X)->refs) #define sub_ref(X) pike_atomic_sub_ref(&(X)->refs) #else #define add_ref(X) (X)->refs++ #define sub_ref(X) (X)->refs-- #endif
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
fb42db2000-12-13Fredrik Hübinette (Hubbe) PMOD_EXPORT extern void describe(void *); /* defined in gc.c */
a4a1722000-12-05Per Hedbor #define check_type(T) if(T > MAX_TYPE && T!=T_LVALUE && T!=T_SHORT_LVALUE && T!=T_VOID && T!=T_DELETED && T!=T_ARRAY_LVALUE) fatal("Type error: %d\n",T)
a4033e2000-04-14Fredrik Hübinette (Hubbe) 
433d5d2000-06-16Fredrik Hübinette (Hubbe) #define check_svalue(S) debug_check_svalue(dmalloc_check_svalue(S,DMALLOC_LOCATION()))
e2d9e62000-06-10Martin Stjernholm 
a4033e2000-04-14Fredrik Hübinette (Hubbe) #define check_refs(S) do {\
0d3fd42000-04-17Martin Stjernholm  if((S)->type <= MAX_REF_TYPE && (!(S)->u.refs || (S)->u.refs[0] < 0)) { \
a4033e2000-04-14Fredrik Hübinette (Hubbe)  describe((S)->u.refs); \ fatal("Svalue to object without references.\n"); \ } }while(0) #define check_refs2(S,T) do { \
0d3fd42000-04-17Martin Stjernholm if((T) <= MAX_REF_TYPE && (S)->refs && (S)->refs[0] <= 0) {\
a4033e2000-04-14Fredrik Hübinette (Hubbe)  describe((S)->refs); \ fatal("(short) Svalue to object without references.\n"); \ } }while(0)
5267b71995-08-09Fredrik Hübinette (Hubbe) 
8c83371998-04-16Fredrik Hübinette (Hubbe) #ifdef DEBUG_MALLOC
ead2052000-06-16Fredrik Hübinette (Hubbe) static inline struct svalue *dmalloc_check_svalue(struct svalue *s, char *l) { debug_malloc_update_location(s,l);
433d5d2000-06-16Fredrik Hübinette (Hubbe) #if 0
ead2052000-06-16Fredrik Hübinette (Hubbe)  if(s->type <= MAX_REF_TYPE) debug_malloc_update_location(s->u.refs,l);
433d5d2000-06-16Fredrik Hübinette (Hubbe) #endif
ead2052000-06-16Fredrik Hübinette (Hubbe)  return s; }
433d5d2000-06-16Fredrik Hübinette (Hubbe) static inline union anything *dmalloc_check_union(union anything *u,int type, char * l)
ead2052000-06-16Fredrik Hübinette (Hubbe) { debug_malloc_update_location(u,l);
433d5d2000-06-16Fredrik Hübinette (Hubbe) #if 0
ead2052000-06-16Fredrik Hübinette (Hubbe)  if(type <= MAX_REF_TYPE) debug_malloc_update_location(u->refs,l);
433d5d2000-06-16Fredrik Hübinette (Hubbe) #endif
ead2052000-06-16Fredrik Hübinette (Hubbe)  return u; }
e83eb92001-03-22Fredrik Hübinette (Hubbe) #undef add_ref #undef sub_ref #ifdef PIKE_RUN_UNLOCKED #define add_ref(X) pike_atomic_add_ref((INT32 *)debug_malloc_pass( &((X)->refs))) #define sub_ref(X) pike_atomic_sub_ref((INT32 *)debug_malloc_pass( &((X)->refs))) #else
8c83371998-04-16Fredrik Hübinette (Hubbe) #define add_ref(X) ((INT32 *)debug_malloc_pass( &((X)->refs)))[0]++
e83eb92001-03-22Fredrik Hübinette (Hubbe) #define sub_ref(X) ((INT32 *)debug_malloc_pass( &((X)->refs)))[0]-- #endif
8c83371998-04-16Fredrik Hübinette (Hubbe) #else
ead2052000-06-16Fredrik Hübinette (Hubbe) #define dmalloc_check_svalue(S,L) (S) #define dmalloc_check_union(U,T,L) (U)
8c83371998-04-16Fredrik Hübinette (Hubbe) 
e83eb92001-03-22Fredrik Hübinette (Hubbe) #endif
8c83371998-04-16Fredrik Hübinette (Hubbe) 
5267b71995-08-09Fredrik Hübinette (Hubbe) #else
e2d9e62000-06-10Martin Stjernholm #define check_svalue(S)
5267b71995-08-09Fredrik Hübinette (Hubbe) #define check_type(T) #define check_refs(S) #define check_refs2(S,T)
ce6ab02000-07-04Martin Stjernholm #define dmalloc_check_svalue(S,L) (S) #define dmalloc_check_union(U,T,L) (U)
e83eb92001-03-22Fredrik Hübinette (Hubbe) 
5267b71995-08-09Fredrik Hübinette (Hubbe)  #endif
711b072001-03-08Fredrik Hübinette (Hubbe) #define swap_svalues(X,Y) do { struct svalue *_a=(X),*_b=(Y),_tmp; _tmp=*_a; *_a=*_b; *_b=_tmp; }while(0)
1e4e5f2000-04-07Fredrik Hübinette (Hubbe) #define free_svalue(X) do { struct svalue *_s=(X); check_type(_s->type); check_refs(_s); if(_s->type<=MAX_REF_TYPE) { debug_malloc_touch(_s->u.refs); if(--*(_s->u.refs) <=0) { really_free_svalue(_s); } DO_IF_DMALLOC(_s->u.refs=(void *)-1;) }}while(0) #define free_short_svalue(X,T) do { union anything *_s=(X); TYPE_T _t=(T); check_type(_t); check_refs2(_s,_t); if(_t<=MAX_REF_TYPE && _s->refs) if(--*(_s->refs) <= 0) { really_free_short_svalue(_s,_t); } DO_IF_DMALLOC(_s->refs=(void *)-1;) }while(0)
e83eb92001-03-22Fredrik Hübinette (Hubbe) #define add_ref_svalue(X) do { struct svalue *_tmp=(X); check_type(_tmp->type); check_refs(_tmp); if(_tmp->type <= MAX_REF_TYPE) { add_ref(_tmp->u.dummy); } }while(0) #define assign_svalue_no_free(X,Y) do { struct svalue _tmp, *_to=(X), *_from=(Y); check_type(_from->type); check_refs(_from); *_to=_tmp=*_from; if(_tmp.type <= MAX_REF_TYPE) { add_ref(_tmp.u.dummy); } }while(0)
ecc6012000-08-22Henrik Grubbström (Grubba) #define assign_svalue(X,Y) do { struct svalue *_to2=(X), *_from2=(Y); if (_to2 != _from2) { free_svalue(_to2); assign_svalue_no_free(_to2, _from2); } }while(0)
d3d1721997-01-31Fredrik Hübinette (Hubbe) 
453f4c1996-08-12Fredrik Hübinette (Hubbe) extern struct svalue dest_ob_zero;
5267b71995-08-09Fredrik Hübinette (Hubbe) 
07ae471998-04-23Fredrik Hübinette (Hubbe) #ifdef DEBUG_MALLOC
20f7a02000-03-20Fredrik Hübinette (Hubbe) #define free_svalues(X,Y,Z) debug_free_svalues((X),(Y),(Z), DMALLOC_LOCATION())
07ae471998-04-23Fredrik Hübinette (Hubbe) #else #define free_svalues(X,Y,Z) debug_free_svalues((X),(Y),(Z)) #endif
5267b71995-08-09Fredrik Hübinette (Hubbe) /* Prototypes begin here */
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void really_free_short_svalue(union anything *s, TYPE_T type); PMOD_EXPORT void really_free_svalue(struct svalue *s); PMOD_EXPORT void do_free_svalue(struct svalue *s); PMOD_EXPORT void debug_free_svalues(struct svalue *s, size_t num, INT32 type_hint DMALLOC_LINE_ARGS); PMOD_EXPORT void assign_svalues_no_free(struct svalue *to,
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct svalue *from,
19c79c2000-06-29Henrik Grubbström (Grubba)  size_t num,
fc76951996-02-17Fredrik Hübinette (Hubbe)  INT32 type_hint);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void assign_svalues(struct svalue *to,
99946c1996-02-17Fredrik Hübinette (Hubbe)  struct svalue *from,
19c79c2000-06-29Henrik Grubbström (Grubba)  size_t num,
99946c1996-02-17Fredrik Hübinette (Hubbe)  TYPE_FIELD types);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void assign_to_short_svalue(union anything *u,
5267b71995-08-09Fredrik Hübinette (Hubbe)  TYPE_T type, struct svalue *s);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void assign_to_short_svalue_no_free(union anything *u,
fc76951996-02-17Fredrik Hübinette (Hubbe)  TYPE_T type, struct svalue *s);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void assign_from_short_svalue_no_free(struct svalue *s,
569d5e1998-09-18Fredrik Hübinette (Hubbe)  union anything *u, TYPE_T type);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void assign_short_svalue_no_free(union anything *to,
5267b71995-08-09Fredrik Hübinette (Hubbe)  union anything *from, TYPE_T type);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT void assign_short_svalue(union anything *to,
5267b71995-08-09Fredrik Hübinette (Hubbe)  union anything *from, TYPE_T type);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT unsigned INT32 hash_svalue(struct svalue *s); PMOD_EXPORT int svalue_is_true(struct svalue *s); PMOD_EXPORT int is_identical(struct svalue *a, struct svalue *b); PMOD_EXPORT int is_eq(struct svalue *a, struct svalue *b); PMOD_EXPORT int low_is_equal(struct svalue *a,
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct svalue *b, struct processing *p);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT int low_short_is_equal(const union anything *a,
5267b71995-08-09Fredrik Hübinette (Hubbe)  const union anything *b, TYPE_T type, struct processing *p);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT int is_equal(struct svalue *a,struct svalue *b); PMOD_EXPORT int is_lt(struct svalue *a,struct svalue *b); PMOD_EXPORT void describe_svalue(struct svalue *s,int indent,struct processing *p); PMOD_EXPORT void print_svalue (FILE *out, struct svalue *s); PMOD_EXPORT void clear_svalues(struct svalue *s, ptrdiff_t num); PMOD_EXPORT void clear_svalues_undefined(struct svalue *s, ptrdiff_t num); PMOD_EXPORT void copy_svalues_recursively_no_free(struct svalue *to,
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct svalue *from,
19c79c2000-06-29Henrik Grubbström (Grubba)  size_t num,
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct processing *p);
569d5e1998-09-18Fredrik Hübinette (Hubbe) void check_short_svalue(union anything *u, TYPE_T type);
e2d9e62000-06-10Martin Stjernholm void debug_check_svalue(struct svalue *s);
d6896c2000-12-16Marcus Comstedt PMOD_EXPORT void real_gc_xmark_svalues(struct svalue *s, ptrdiff_t num); PMOD_EXPORT void real_gc_check_svalues(struct svalue *s, size_t num);
c4ccb82000-07-04Martin Stjernholm void gc_check_weak_svalues(struct svalue *s, size_t num);
d6896c2000-12-16Marcus Comstedt PMOD_EXPORT void real_gc_check_short_svalue(union anything *u, TYPE_T type);
e2d9e62000-06-10Martin Stjernholm void gc_check_weak_short_svalue(union anything *u, TYPE_T type);
d6896c2000-12-16Marcus Comstedt PMOD_EXPORT TYPE_FIELD real_gc_mark_svalues(struct svalue *s, size_t num);
19c79c2000-06-29Henrik Grubbström (Grubba) TYPE_FIELD gc_mark_weak_svalues(struct svalue *s, size_t num);
1f21332000-07-28Fredrik Hübinette (Hubbe) int real_gc_mark_short_svalue(union anything *u, TYPE_T type);
e2d9e62000-06-10Martin Stjernholm int gc_mark_weak_short_svalue(union anything *u, TYPE_T type);
d6896c2000-12-16Marcus Comstedt PMOD_EXPORT TYPE_FIELD real_gc_cycle_check_svalues(struct svalue *s, size_t num);
19c79c2000-06-29Henrik Grubbström (Grubba) TYPE_FIELD gc_cycle_check_weak_svalues(struct svalue *s, size_t num);
d6896c2000-12-16Marcus Comstedt PMOD_EXPORT int real_gc_cycle_check_short_svalue(union anything *u, TYPE_T type);
e2d9e62000-06-10Martin Stjernholm int gc_cycle_check_weak_short_svalue(union anything *u, TYPE_T type);
7972742000-12-14Martin Stjernholm void real_gc_free_svalue(struct svalue *s); void real_gc_free_short_svalue(union anything *u, TYPE_T type);
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT INT32 pike_sizeof(struct svalue *s);
5267b71995-08-09Fredrik Hübinette (Hubbe) /* Prototypes end here */
433d5d2000-06-16Fredrik Hübinette (Hubbe) #define gc_xmark_svalues(S,N) real_gc_xmark_svalues(dmalloc_check_svalue(S,DMALLOC_LOCATION()),N) #define gc_check_svalues(S,N) real_gc_check_svalues(dmalloc_check_svalue(S,DMALLOC_LOCATION()),N) #define gc_check_short_svalue(U,T) real_gc_check_short_svalue(dmalloc_check_union((U),(T),DMALLOC_LOCATION()),T) #define gc_mark_svalues(S,N) real_gc_mark_svalues(dmalloc_check_svalue((S),DMALLOC_LOCATION()),N) #define gc_mark_short_svalue(U,T) real_gc_mark_short_svalue(dmalloc_check_union((U),(T),DMALLOC_LOCATION()),T) #define gc_cycle_check_svalues(S,N) real_gc_cycle_check_svalues(dmalloc_check_svalue(S,DMALLOC_LOCATION()),N) #define gc_cycle_check_short_svalue(U,T) real_gc_cycle_check_short_svalue(dmalloc_check_union((U),(T),DMALLOC_LOCATION()),(T))
7972742000-12-14Martin Stjernholm #define gc_free_svalue(S) real_gc_free_svalue(dmalloc_check_svalue(S,DMALLOC_LOCATION())) #define gc_free_short_svalue(U,T) real_gc_free_short_svalue(dmalloc_check_union((U),(T),DMALLOC_LOCATION()),(T))
103dc02000-04-12Henrik Grubbström (Grubba) 
0542ef1999-11-17Fredrik Hübinette (Hubbe) #ifndef NO_PIKE_SHORTHAND #define T_ARRAY PIKE_T_ARRAY #define T_MAPPING PIKE_T_MAPPING #define T_MULTISET PIKE_T_MULTISET #define T_OBJECT PIKE_T_OBJECT #define T_FUNCTION PIKE_T_FUNCTION #define T_PROGRAM PIKE_T_PROGRAM #define T_STRING PIKE_T_STRING
538e811999-12-10Henrik Grubbström (Grubba) #define T_TYPE PIKE_T_TYPE
0542ef1999-11-17Fredrik Hübinette (Hubbe) #define T_FLOAT PIKE_T_FLOAT #define T_INT PIKE_T_INT
5bd05e1999-11-23Henrik Grubbström (Grubba) #define T_ZERO PIKE_T_ZERO
538e811999-12-10Henrik Grubbström (Grubba) #define T_TUPLE PIKE_T_TUPLE #define T_SCOPE PIKE_T_SCOPE
2cd8ca2000-07-28Fredrik Hübinette (Hubbe) #define T_MIXED PIKE_T_MIXED
0542ef1999-11-17Fredrik Hübinette (Hubbe) 
538e811999-12-10Henrik Grubbström (Grubba) #endif /* !NO_PIKE_SHORTHAND */
0542ef1999-11-17Fredrik Hübinette (Hubbe) 
538e811999-12-10Henrik Grubbström (Grubba)  #endif /* !SVALUE_H */