From 99946cb8c71a6ce769d928dc2a0f396151f11365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Sat, 17 Feb 1996 16:55:54 +0100 Subject: [PATCH] Completed removing compact arrays Rev: src/array.c:1.5 Rev: src/array.h:1.3 Rev: src/builtin_efuns.c:1.8 Rev: src/call_out.c:1.2 Rev: src/interpret.c:1.6 Rev: src/list.c:1.2 Rev: src/lpc_types.c:1.2 Rev: src/main.c:1.2 Rev: src/mapping.c:1.2 Rev: src/modules/files/efuns.c:1.3 Rev: src/modules/regexp/glue.c:1.2 Rev: src/object.c:1.4 Rev: src/svalue.c:1.5 Rev: src/svalue.h:1.3 --- src/array.c | 57 +++++++++---------- src/array.h | 15 +++-- src/builtin_efuns.c | 113 +++++++++++++++----------------------- src/call_out.c | 9 +-- src/interpret.c | 2 +- src/list.c | 2 +- src/lpc_types.c | 29 +--------- src/main.c | 15 +++-- src/mapping.c | 8 +-- src/modules/files/efuns.c | 24 ++++---- src/modules/regexp/glue.c | 2 +- src/object.c | 7 ++- src/svalue.c | 13 +++-- src/svalue.h | 5 +- 14 files changed, 133 insertions(+), 168 deletions(-) diff --git a/src/array.c b/src/array.c index 41101879f8..46e51f1d2b 100644 --- a/src/array.c +++ b/src/array.c @@ -40,7 +40,7 @@ struct array *allocate_array_no_init(INT32 size,INT32 extra_space) { struct array *v; - if(size == 0 && type == T_MIXED) + if(size == 0) { empty_array.refs++; return &empty_array; @@ -309,7 +309,7 @@ struct array *array_shrink(struct array *v,INT32 size) free_array(v); return a; }else{ - free_svalues(ITEM(v) + size, v->size - size); + free_svalues(ITEM(v) + size, v->size - size, v->type_field); v->size=size; return v; } @@ -486,16 +486,6 @@ INT32 array_find_destructed_object(struct array *v) return -1; } - -static short_cmpfun current_short_cmpfun; -static union anything *current_short_array_p; - -static int internal_short_cmpfun(INT32 *a,INT32 *b) -{ - return current_short_cmpfun(current_short_array_p + *a, - current_short_array_p + *b); -} - static struct svalue *current_array_p; static cmpfun current_cmpfun; @@ -617,12 +607,12 @@ static INT32 low_lookup(struct array *v, INT32 set_lookup(struct array *a, struct svalue *s) { /* face it, it's not there */ - if( (((2 << s->type) -1) & s->type_field) == 0) + if( (((2 << s->type) -1) & a->type_field) == 0) return -1; /* face it, it's not there */ - if( ((BIT_MIXED << s->type) & BIT_MIXED & s->type_field) == 0) - return ~v->size; + if( ((BIT_MIXED << s->type) & BIT_MIXED & a->type_field) == 0) + return ~a->size; return low_lookup(a,s,set_svalue_cmpfun); } @@ -630,12 +620,12 @@ INT32 set_lookup(struct array *a, struct svalue *s) INT32 switch_lookup(struct array *a, struct svalue *s) { /* face it, it's not there */ - if( (((2 << s->type) -1) & s->type_field) == 0) + if( (((2 << s->type) -1) & a->type_field) == 0) return -1; /* face it, it's not there */ - if( ((BIT_MIXED << s->type) & BIT_MIXED & s->type_field) == 0) - return ~v->size; + if( ((BIT_MIXED << s->type) & BIT_MIXED & a->type_field) == 0) + return ~a->size; return low_lookup(a,s,switch_svalue_cmpfun); } @@ -785,7 +775,7 @@ struct array *array_zip(struct array *a, struct array *b,INT32 *zipper) size=zipper[0]; zipper++; - ret=allocate_array_no_init(size,0, T_MIXED); + ret=allocate_array_no_init(size,0); for(e=0; e<size; e++) { if(*zipper >= 0) @@ -803,6 +793,9 @@ struct array *add_arrays(struct svalue *argp, INT32 args) INT32 e, size; struct array *v; + for(size=e=0;e<args;e++) + size+=argp[e].u.array->size; + if(args && argp[0].u.array->refs==1) { e=argp[0].u.array->size; @@ -971,7 +964,7 @@ struct array *and_arrays(struct array *a, struct array *b) { return merge_array_without_order(a, b, OP_AND); }else{ - return allocate_array_no_init(0,0,T_MIXED); + return allocate_array_no_init(0,0); } } @@ -986,7 +979,6 @@ int check_that_array_is_constant(struct array *a) node *make_node_from_array(struct array *a) { struct svalue s; - char *str; INT32 e; array_fix_type_field(a); @@ -1031,7 +1023,7 @@ void push_array_items(struct array *a) free_array(a); return; }else{ - assign_svalues_no_free(sp, ITEM(a), a->size); + assign_svalues_no_free(sp, ITEM(a), a->size, a->type_field); } sp += a->size; free_array(a); @@ -1120,10 +1112,13 @@ struct array *explode(struct lpc_string *str, if(!del->len) { - ret=allocate_array_no_init(str->len,0,T_STRING); + ret=allocate_array_no_init(str->len,0); ret->type_field |= 1<<T_STRING; for(e=0;e<str->len;e++) - SHORT_ITEM(ret)[e].string=make_shared_binary_string(str->str+e,1); + { + ITEM(ret)[e].type=T_STRING; + ITEM(ret)[e].u.string=make_shared_binary_string(str->str+e,1); + } }else{ s=str->str; @@ -1136,17 +1131,19 @@ struct array *explode(struct lpc_string *str, e++; } - ret=allocate_array_no_init(e+1,0,T_STRING); + ret=allocate_array_no_init(e+1,0); ret->type_field |= 1<<T_STRING; s=str->str; for(d=0;d<e;d++) { tmp=MEMMEM((char *)(del->str), del->len, (char *)s, end-s); - SHORT_ITEM(ret)[d].string=make_shared_binary_string(s,tmp-s); + ITEM(ret)[d].type=T_STRING; + ITEM(ret)[d].u.string=make_shared_binary_string(s,tmp-s); s=tmp+del->len; } - SHORT_ITEM(ret)[d].string=make_shared_binary_string(s,end-s); + ITEM(ret)[d].type=T_STRING; + ITEM(ret)[d].u.string=make_shared_binary_string(s,end-s); } return ret; } @@ -1218,11 +1215,11 @@ void apply_array(struct array *a, INT32 args) argp=sp-args; for(e=0;e<a->size;e++) { - assign_svalues_no_free(sp,argp,args); + assign_svalues_no_free(sp,argp,args,BIT_MIXED); sp+=args; apply_svalue(ITEM(a)+e,args); } - ret=aggregate_array(a->size,T_MIXED); + ret=aggregate_array(a->size); pop_n_elems(args); push_array(ret); } @@ -1267,7 +1264,7 @@ void array_gc_clear_mark() } while (a != & empty_array); } -void array_gc_mark(array *a) +void array_gc_mark(struct array *a) { INT e; if(a->flags & ARRAY_FLAG_MARK) return; diff --git a/src/array.h b/src/array.h index 4d4687072c..34f74e4baa 100644 --- a/src/array.h +++ b/src/array.h @@ -54,8 +54,8 @@ typedef short_cmpfun (*cmpfun_getter)(TYPE_T); /* Prototypes begin here */ -struct array *allocate_array_no_init(INT32 size,INT32 extra_space,TYPE_T type); -struct array *allocate_array(INT32 size,TYPE_T type); +struct array *allocate_array_no_init(INT32 size,INT32 extra_space); +struct array *allocate_array(INT32 size); void really_free_array(struct array *v); void array_index_no_free(struct svalue *s,struct array *v,INT32 index); void array_index(struct svalue *s,struct array *v,INT32 index); @@ -72,7 +72,7 @@ struct array *slice_array(struct array *v,INT32 start,INT32 end); struct array *copy_array(struct array *v); void check_array_for_destruct(struct array *v); INT32 array_find_destructed_object(struct array *v); -INT32 *get_order(struct array *v, cmpfun fun,cmpfun_getter backfun); +INT32 *get_order(struct array *v, cmpfun fun); INT32 *get_set_order(struct array *a); INT32 *get_switch_order(struct array *a); INT32 set_lookup(struct array *a, struct svalue *s); @@ -107,7 +107,7 @@ void describe_index(struct array *a, struct processing *p, int indent); void describe_array(struct array *a,struct processing *p,int indent); -struct array *aggregate_array(INT32 args, TYPE_T type); +struct array *aggregate_array(INT32 args); struct array *explode(struct lpc_string *str, struct lpc_string *del); struct lpc_string *implode(struct array *a,struct lpc_string *del); @@ -117,7 +117,12 @@ struct array *reverse_array(struct array *a); void array_replace(struct array *a, struct svalue *from, struct svalue *to); -void check_all_arrays(); +void array_gc_clear_mark(); +void array_gc_mark(struct array *a); +void array_gc_sweep(); +void array_gc_sweep2(); +void check_array(struct array *a, int pass); +void check_all_arrays(int pass); /* Prototypes end here */ diff --git a/src/builtin_efuns.c b/src/builtin_efuns.c index 90507b5a82..28120bf6e9 100644 --- a/src/builtin_efuns.c +++ b/src/builtin_efuns.c @@ -47,7 +47,7 @@ void f_aggregate(INT32 args) if(args < 0) fatal("Negative args to f_aggregate()\n"); #endif - a=aggregate_array(args,T_MIXED); + a=aggregate_array(args); push_array(a); /* beware, macro */ } @@ -290,7 +290,7 @@ void f_backtrace(INT32 args) for(f=fp;f;f=f->parent_frame) frames++; sp->type=T_ARRAY; - sp->u.array=a=allocate_array_no_init(frames,0,T_ARRAY); + sp->u.array=a=allocate_array_no_init(frames,0); sp++; for(f=fp;f;f=f->parent_frame) @@ -301,7 +301,8 @@ void f_backtrace(INT32 args) if(f->current_object && f->current_object->prog) { - SHORT_ITEM(a)[frames].array=i=allocate_array_no_init(3,0,T_MIXED); + ITEM(a)[frames].u.array=i=allocate_array_no_init(3,0); + ITEM(a)[frames].type=T_ARRAY; ITEM(i)[2].type=T_FUNCTION; ITEM(i)[2].subtype=f->fun; ITEM(i)[2].u.object=f->current_object; @@ -328,7 +329,8 @@ void f_backtrace(INT32 args) ITEM(i)[0].type=T_INT; } }else{ - SHORT_ITEM(a)[frames].refs=0; + ITEM(a)[frames].type=T_INT; + ITEM(a)[frames].u.integer=0; } } } @@ -562,7 +564,6 @@ void f_all_efuns(INT32 args) void f_allocate(INT32 args) { - TYPE_T t; INT32 size; if(args < 1) @@ -571,25 +572,12 @@ void f_allocate(INT32 args) if(sp[-args].type!=T_INT) error("Bad argument 1 to allocate.\n"); - if(args > 1) - { - struct lpc_string *s; - if(sp[1-args].type != T_STRING) - error("Bad argument 2 to allocate.\n"); - - s=sp[1-args].u.string; - s=parse_type(s->str); - t=compile_type_to_runtime_type(s); - free_string(s); - }else{ - t=T_MIXED; - } size=sp[-args].u.integer; if(size < 0) error("Allocate on negative number.\n"); pop_n_elems(args); - push_array( allocate_array(size, t) ); + push_array( allocate_array(size) ); } void f_sizeof(INT32 args) @@ -632,14 +620,21 @@ void f_sizeof(INT32 args) void f_rusage(INT32 args) { - INT32 *rus; + INT32 *rus,e; struct array *v; pop_n_elems(args); rus=low_rusage(); if(!rus) error("System rusage information not available.\n"); - v=allocate_array_no_init(29,0,T_INT); - MEMCPY((char *)SHORT_ITEM(v),(char *)rus,sizeof(INT32)*29); + v=allocate_array_no_init(29,0); + + for(e=0;e<29;e++) + { + ITEM(v)[e].type=T_INT; + ITEM(v)[e].subtype=NUMBER_NUMBER; + ITEM(v)[e].u.integer=rus[e]; + } + sp->u.array=v; sp->type=T_ARRAY; sp++; @@ -798,9 +793,13 @@ void f_indices(INT32 args) size=sp[-args].u.array->size; qjump: - a=allocate_array_no_init(size,0,T_INT); + a=allocate_array_no_init(size,0); while(--size>=0) - SHORT_ITEM(a)[size].integer=size; + { + ITEM(a)[size].type=T_INT; + ITEM(a)[size].subtype=NUMBER_NUMBER; + ITEM(a)[size].u.integer=size; + } break; case T_MAPPING: @@ -834,9 +833,13 @@ void f_values(INT32 args) { case T_STRING: size=sp[-args].u.string->len; - a=allocate_array_no_init(size,0,T_INT); + a=allocate_array_no_init(size,0); while(--size>=0) - SHORT_ITEM(a)[size].integer=EXTRACT_UCHAR(sp[-args].u.string->str+size); + { + ITEM(a)[size].type=T_INT; + ITEM(a)[size].subtype=NUMBER_NUMBER; + ITEM(a)[size].u.integer=EXTRACT_UCHAR(sp[-args].u.string->str+size); + } break; case T_ARRAY: @@ -849,9 +852,13 @@ void f_values(INT32 args) case T_LIST: size=sp[-args].u.list->ind->size; - a=allocate_array_no_init(size,0,T_INT); - while(size>0) - SHORT_ITEM(a)[--size].integer=1; + a=allocate_array_no_init(size,0); + while(--size>=0) + { + ITEM(a)[size].type=T_INT; + ITEM(a)[size].subtype=NUMBER_NUMBER; + ITEM(a)[size].u.integer=1; + } break; case T_OBJECT: @@ -990,50 +997,18 @@ struct lpc_string * replace_many(struct lpc_string *str, v=(struct tupel *)xalloc(sizeof(struct tupel)*from->size); - if(from->array_type == T_MIXED) - { - for(e=0;e<from->size;e++) - { - if(ITEM(from)[e].type != T_STRING) - error("Replace: from array not string *\n"); - v[e].ind=ITEM(from)[e].u.string; - } - } - else if(from->array_type == T_STRING) - { - for(e=0;e<from->size;e++) - { - if(!SHORT_ITEM(from)[e].string) - error("Replace: from array not string *\n"); - v[e].ind=SHORT_ITEM(from)[e].string; - } - } - else + for(e=0;e<from->size;e++) { - error("Replace: from array is not string *\n"); + if(ITEM(from)[e].type != T_STRING) + error("Replace: from array not string *\n"); + v[e].ind=ITEM(from)[e].u.string; } - if(to->array_type == T_MIXED) - { - for(e=0;e<to->size;e++) - { - if(ITEM(to)[e].type != T_STRING) - error("Replace: to array not string *\n"); - v[e].val=ITEM(to)[e].u.string; - } - } - else if(to->array_type == T_STRING) - { - for(e=0;e<to->size;e++) - { - if(!SHORT_ITEM(to)[e].string) - error("Replace: to array not string *\n"); - v[e].val=SHORT_ITEM(to)[e].string; - } - } - else + for(e=0;e<to->size;e++) { - error("Replace: to array is not string *\n"); + if(ITEM(to)[e].type != T_STRING) + error("Replace: to array not string *\n"); + v[e].val=ITEM(to)[e].u.string; } fsort((char *)v,from->size,sizeof(struct tupel),(fsortfun)replace_sortfun); diff --git a/src/call_out.c b/src/call_out.c index da5c6fd47f..cfda6cc071 100644 --- a/src/call_out.c +++ b/src/call_out.c @@ -246,11 +246,11 @@ struct array *get_all_call_outs() struct array *ret; verify_call_outs(); - ret=allocate_array_no_init(num_pending_calls,0,T_ARRAY); + ret=allocate_array_no_init(num_pending_calls,0); for(e=0;e<num_pending_calls;e++) { struct array *v; - v=allocate_array_no_init(pending_calls[e]->args->size+2, 0, T_MIXED); + v=allocate_array_no_init(pending_calls[e]->args->size+2, 0); ITEM(v)[0].type=T_INT; ITEM(v)[0].subtype=NUMBER_NUMBER; ITEM(v)[0].u.integer=pending_calls[e]->time-current_time; @@ -265,9 +265,10 @@ struct array *get_all_call_outs() ITEM(v)[1].u.integer=0; } - assign_svalues_no_free(ITEM(v)+2,ITEM(pending_calls[e]->args),pending_calls[e]->args->size); + assign_svalues_no_free(ITEM(v)+2,ITEM(pending_calls[e]->args),pending_calls[e]->args->size,BIT_MIXED); - SHORT_ITEM(ret)[e].array=v; + ITEM(ret)[e].type=T_ARRAY; + ITEM(ret)[e].u.array=v; } return ret; } diff --git a/src/interpret.c b/src/interpret.c index d1a9cb69be..ce61e6db18 100644 --- a/src/interpret.c +++ b/src/interpret.c @@ -196,7 +196,7 @@ void pop_n_elems(INT32 x) if(x < 0) fatal("Popping negative number of args....\n"); #endif - free_svalues(sp-x,x); + free_svalues(sp-x,x,BIT_MIXED); sp-=x; } diff --git a/src/list.c b/src/list.c index 439b89c0c1..c2a968482e 100644 --- a/src/list.c +++ b/src/list.c @@ -136,7 +136,7 @@ struct list *add_lists(struct svalue *argp,INT32 args) switch(args) { case 0: - ret=allocate_list(allocate_array_no_init(0,0,T_MIXED)); + ret=allocate_list(allocate_array_no_init(0,0)); break; case 1: diff --git a/src/lpc_types.c b/src/lpc_types.c index 3a2aa02d6f..4cf28ef120 100644 --- a/src/lpc_types.c +++ b/src/lpc_types.c @@ -744,34 +744,7 @@ struct lpc_string *check_call(struct lpc_string *args, void check_array_type(struct array *a) { - int t; - t=my_log2(a->array_type); - if( ( 1 << t ) == a->array_type ) - { - switch(t) - { - case T_ARRAY: - push_type(T_MIXED); - push_type(T_ARRAY); - break; - - case T_LIST: - push_type(T_MIXED); - push_type(T_LIST); - break; - - case T_MAPPING: - push_type(T_MIXED); - push_type(T_MIXED); - push_type(T_MAPPING); - break; - - default: - push_type(t); - } - }else{ - push_type(T_MIXED); - } + push_type(T_MIXED); } struct lpc_string *get_type_of_svalue(struct svalue *s) diff --git a/src/main.c b/src/main.c index 3afa0c7152..a5c0b77ef3 100644 --- a/src/main.c +++ b/src/main.c @@ -158,15 +158,22 @@ void main(int argc, char **argv, char **env) call_and_free_callback_list(& post_master_callbacks); init_modules_programs(); - a=allocate_array_no_init(argc-e,0,T_STRING); + a=allocate_array_no_init(argc-e,0); for(num=0;e<argc;e++) - SHORT_ITEM(a)[num++].string=make_shared_string(argv[e]); + { + ITEM(a)[num].u.string=make_shared_string(argv[e]); + ITEM(a)[num].type=T_STRING; + num++; + } push_array(a); for(num=0;env[num];num++); - a=allocate_array_no_init(num,0,T_STRING); + a=allocate_array_no_init(num,0); for(num=0;env[num];num++) - SHORT_ITEM(a)[num].string=make_shared_string(env[num]); + { + ITEM(a)[num].u.string=make_shared_string(env[num]); + ITEM(a)[num].type=T_STRING; + } push_array(a); if(SETJMP(back)) diff --git a/src/mapping.c b/src/mapping.c index f41b731ae1..de252f7fbf 100644 --- a/src/mapping.c +++ b/src/mapping.c @@ -219,8 +219,8 @@ struct mapping *add_mappings(struct svalue *argp,INT32 args) switch(args) { case 0: - ret=allocate_mapping(allocate_array_no_init(0,0,T_MIXED), - allocate_array_no_init(0,0,T_MIXED)); + ret=allocate_mapping(allocate_array_no_init(0,0), + allocate_array_no_init(0,0)); break; case 1: @@ -334,8 +334,8 @@ void f_aggregate_mapping(INT32 args) if(args & 1) error("Uneven number of arguments to aggregage_mapping.\n"); - ind=allocate_array_no_init(args/2,0,T_MIXED); - val=allocate_array_no_init(args/2,0,T_MIXED); + ind=allocate_array_no_init(args/2,0); + val=allocate_array_no_init(args/2,0); s=sp-args; for(e=0;e<args/2;e++) diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c index b0a07205d0..b2172ad6c4 100644 --- a/src/modules/files/efuns.c +++ b/src/modules/files/efuns.c @@ -41,20 +41,20 @@ struct array *encode_stat(struct stat *s) { struct array *a; - a=allocate_array_no_init(7,0,T_INT); - SHORT_ITEM(a)[0].integer=s->st_mode; + a=allocate_array(7); + ITEM(a)[0].u.integer=s->st_mode; switch(S_IFMT & s->st_mode) { - case S_IFREG: SHORT_ITEM(a)[1].integer=s->st_size; break; - case S_IFDIR: SHORT_ITEM(a)[1].integer=-2; break; - case S_IFLNK: SHORT_ITEM(a)[1].integer=-3; break; - default: SHORT_ITEM(a)[1].integer=-4; break; + case S_IFREG: ITEM(a)[1].u.integer=s->st_size; break; + case S_IFDIR: ITEM(a)[1].u.integer=-2; break; + case S_IFLNK: ITEM(a)[1].u.integer=-3; break; + default: ITEM(a)[1].u.integer=-4; break; } - SHORT_ITEM(a)[2].integer=s->st_atime; - SHORT_ITEM(a)[3].integer=s->st_mtime; - SHORT_ITEM(a)[4].integer=s->st_ctime; - SHORT_ITEM(a)[5].integer=s->st_uid; - SHORT_ITEM(a)[6].integer=s->st_gid; + ITEM(a)[2].u.integer=s->st_atime; + ITEM(a)[3].u.integer=s->st_mtime; + ITEM(a)[4].u.integer=s->st_ctime; + ITEM(a)[5].u.integer=s->st_uid; + ITEM(a)[6].u.integer=s->st_gid; return a; } @@ -170,7 +170,7 @@ void f_get_dir(INT32 args) push_string(make_shared_binary_string(d->d_name,NAMLEN(d))); } closedir(dir); - a=aggregate_array(sp-save_sp, T_STRING); + a=aggregate_array(sp-save_sp); } pop_n_elems(args); diff --git a/src/modules/regexp/glue.c b/src/modules/regexp/glue.c index f378f797ba..4a728f2102 100644 --- a/src/modules/regexp/glue.c +++ b/src/modules/regexp/glue.c @@ -84,7 +84,7 @@ static void regexp_split(INT32 args) } } if(j<i-1) pop_n_elems(i-j-1); - push_array(aggregate_array(j,T_STRING)); + push_array(aggregate_array(j)); free_string(s); }else{ pop_n_elems(args); diff --git a/src/object.c b/src/object.c index 44883029ea..d0a2784a3a 100644 --- a/src/object.c +++ b/src/object.c @@ -655,11 +655,12 @@ struct array *object_indices(struct object *o) if(!p) error("indices() on destructed object.\n"); - a=allocate_array_no_init(p->num_identifier_indexes,0, T_STRING); + a=allocate_array_no_init(p->num_identifier_indexes,0); for(e=0;e<(int)p->num_identifier_indexes;e++) { - copy_shared_string(SHORT_ITEM(a)[e].string, + copy_shared_string(ITEM(a)[e].u.string, ID_FROM_INT(p,p->identifier_index[e])->name); + ITEM(a)[e].type=T_STRING; } return a; } @@ -674,7 +675,7 @@ struct array *object_values(struct object *o) if(!p) error("values() on destructed object.\n"); - a=allocate_array_no_init(p->num_identifier_indexes,0, T_MIXED); + a=allocate_array_no_init(p->num_identifier_indexes,0); for(e=0;e<(int)p->num_identifier_indexes;e++) { low_object_index(ITEM(a)+e, o, p->identifier_index[e]); diff --git a/src/svalue.c b/src/svalue.c index a9dd15e646..04af973f0b 100644 --- a/src/svalue.c +++ b/src/svalue.c @@ -168,7 +168,7 @@ void free_svalues(struct svalue *s,INT32 num, INT32 type_hint) really_free_object(s->u.object); } } - return + return; #undef DOTYPE default: @@ -194,7 +194,7 @@ void assign_svalues_no_free(struct svalue *to, { if((type_hint & ~(BIT_INT | BIT_FLOAT))==0) { - MEMCPY((char *)to, (char *)from, sizeof(svalue) * num); + MEMCPY((char *)to, (char *)from, sizeof(struct svalue) * num); return; } @@ -219,10 +219,13 @@ void assign_svalue(struct svalue *to, struct svalue *from) assign_svalue_no_free(to,from); } -void assign_svalues(struct svalue *to, struct svalue *from, INT32 num) +void assign_svalues(struct svalue *to, + struct svalue *from, + INT32 num, + TYPE_FIELD types) { - free_svalues(to,num); - assign_svalues_no_free(to,from,num); + free_svalues(to,num,BIT_MIXED); + assign_svalues_no_free(to,from,num,types); } void assign_to_short_svalue(union anything *u, diff --git a/src/svalue.h b/src/svalue.h index 290d10307d..0978075478 100644 --- a/src/svalue.h +++ b/src/svalue.h @@ -132,7 +132,10 @@ void assign_svalues_no_free(struct svalue *to, INT32 num, INT32 type_hint); void assign_svalue(struct svalue *to, struct svalue *from); -void assign_svalues(struct svalue *to, struct svalue *from, INT32 num); +void assign_svalues(struct svalue *to, + struct svalue *from, + INT32 num, + TYPE_FIELD types); void assign_to_short_svalue(union anything *u, TYPE_T type, struct svalue *s); -- GitLab