2
0
Эх сурвалжийг харах

use correct alloc method + bugfix in maps hl_higrow

Nicolas Cannasse 9 жил өмнө
parent
commit
37ee19eb25

+ 2 - 2
src/std/buffer.c

@@ -35,7 +35,7 @@ struct hl_buffer {
 };
 };
 
 
 HL_PRIM hl_buffer *hl_alloc_buffer() {
 HL_PRIM hl_buffer *hl_alloc_buffer() {
-	hl_buffer *b = (hl_buffer*)hl_gc_alloc(sizeof(hl_buffer));
+	hl_buffer *b = (hl_buffer*)hl_gc_alloc_raw(sizeof(hl_buffer));
 	b->totlen = 0;
 	b->totlen = 0;
 	b->blen = 16;
 	b->blen = 16;
 	b->data = NULL;
 	b->data = NULL;
@@ -48,7 +48,7 @@ static void buffer_append_new( hl_buffer *b, const uchar *s, int len ) {
 	while( b->totlen >= (b->blen << 2) )
 	while( b->totlen >= (b->blen << 2) )
 		b->blen <<= 1;
 		b->blen <<= 1;
 	size = (len < b->blen)?b->blen:len;
 	size = (len < b->blen)?b->blen:len;
-	it = (stringitem)hl_gc_alloc(sizeof(struct _stringitem));
+	it = (stringitem)hl_gc_alloc_raw(sizeof(struct _stringitem));
 	it->str = (uchar*)hl_gc_alloc_noptr(size<<1);
 	it->str = (uchar*)hl_gc_alloc_noptr(size<<1);
 	memcpy(it->str,s,len<<1);
 	memcpy(it->str,s,len<<1);
 	it->size = size;
 	it->size = size;

+ 3 - 14
src/std/error.c

@@ -41,20 +41,11 @@ static HANDLE stack_process_handle = NULL;
 
 
 HL_PRIM void *hl_fatal_error( const char *msg, const char *file, int line ) {
 HL_PRIM void *hl_fatal_error( const char *msg, const char *file, int line ) {
 	printf("%s(%d) : FATAL ERROR : %s\n",file,line,msg);
 	printf("%s(%d) : FATAL ERROR : %s\n",file,line,msg);
-#ifdef _DEBUG
-	*(int*)NULL = 0;
-#else
-	exit(0);
-#endif
+	hl_debug_break();
+	exit(1);
 	return NULL;
 	return NULL;
 }
 }
 
 
-static void hl_on_uncaught( const uchar *v ) {
-#	ifdef _DEBUG
-//	*(int*)0 = 0;
-#	endif
-}
-
 HL_PRIM void hl_throw( vdynamic *v ) {
 HL_PRIM void hl_throw( vdynamic *v ) {
 	hl_trap_ctx *t = hl_current_trap;
 	hl_trap_ctx *t = hl_current_trap;
 #ifdef _WIN32
 #ifdef _WIN32
@@ -65,7 +56,7 @@ HL_PRIM void hl_throw( vdynamic *v ) {
 #endif
 #endif
 	hl_current_exc = v;
 	hl_current_exc = v;
 	hl_current_trap = t->prev;
 	hl_current_trap = t->prev;
-	if( hl_current_trap == NULL ) hl_on_uncaught((uchar*)v->v.bytes);
+	if( hl_current_trap == NULL ) hl_debug_break();
 	longjmp(t->buf,1);
 	longjmp(t->buf,1);
 }
 }
 
 
@@ -118,7 +109,6 @@ HL_PRIM void hl_error_msg( const uchar *fmt, ... ) {
 	uchar buf[256];
 	uchar buf[256];
 	vdynamic *d;
 	vdynamic *d;
 	int len;
 	int len;
-	if( !hl_current_trap->prev ) hl_on_uncaught(fmt);
 	va_list args;
 	va_list args;
 	va_start(args, fmt);
 	va_start(args, fmt);
 	len = uvsprintf(buf,fmt,args);
 	len = uvsprintf(buf,fmt,args);
@@ -130,7 +120,6 @@ HL_PRIM void hl_error_msg( const uchar *fmt, ... ) {
 
 
 HL_PRIM void hl_fatal_fmt(const char *fmt, ...) {
 HL_PRIM void hl_fatal_fmt(const char *fmt, ...) {
 	char buf[256];
 	char buf[256];
-	if( !hl_current_trap->prev ) hl_on_uncaught(USTR(""));
 	va_list args;
 	va_list args;
 	va_start(args, fmt);
 	va_start(args, fmt);
 	vsprintf(buf,fmt, args);
 	vsprintf(buf,fmt, args);

+ 15 - 16
src/std/maps.c

@@ -47,10 +47,10 @@ struct _hl_bytes_map {
 };
 };
 
 
 HL_PRIM hl_bytes_map *hl_hballoc() {
 HL_PRIM hl_bytes_map *hl_hballoc() {
-	hl_bytes_map *m = (hl_bytes_map*)hl_gc_alloc(sizeof(hl_bytes_map));
+	hl_bytes_map *m = (hl_bytes_map*)hl_gc_alloc_raw(sizeof(hl_bytes_map));
 	m->ncells = H_SIZE_INIT;
 	m->ncells = H_SIZE_INIT;
 	m->nentries = 0;
 	m->nentries = 0;
-	m->cells = (hl_bytes_cell **)hl_gc_alloc(sizeof(hl_bytes_cell*)*m->ncells);
+	m->cells = (hl_bytes_cell **)hl_gc_alloc_raw(sizeof(hl_bytes_cell*)*m->ncells);
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	return m;
 	return m;
 }
 }
@@ -83,7 +83,7 @@ static void hl_hbremap( hl_bytes_map *m, uchar *key, int hash, vdynamic *value,
 	if( c )
 	if( c )
 		*reuse = c->next;
 		*reuse = c->next;
 	else
 	else
-		c = (hl_bytes_cell*)hl_gc_alloc(sizeof(hl_bytes_cell));
+		c = (hl_bytes_cell*)hl_gc_alloc_raw(sizeof(hl_bytes_cell));
 	memset(c,0,sizeof(hl_bytes_cell));
 	memset(c,0,sizeof(hl_bytes_cell));
 	c->strings[0] = key;
 	c->strings[0] = key;
 	c->hashes[0] = hash;
 	c->hashes[0] = hash;
@@ -116,7 +116,7 @@ static bool hl_hbadd( hl_bytes_map *m, uchar *key, vdynamic *value ) {
 		m->nentries++;
 		m->nentries++;
 		return false;
 		return false;
 	}
 	}
-	c = (hl_bytes_cell*)hl_gc_alloc(sizeof(hl_bytes_cell));
+	c = (hl_bytes_cell*)hl_gc_alloc_raw(sizeof(hl_bytes_cell));
 	memset(c,0,sizeof(hl_bytes_cell));
 	memset(c,0,sizeof(hl_bytes_cell));
 	c->strings[0] = key;
 	c->strings[0] = key;
 	c->hashes[0] = hash;
 	c->hashes[0] = hash;
@@ -135,7 +135,7 @@ static void hl_hbgrow( hl_bytes_map *m ) {
 	hl_bytes_cell *reuse = NULL;
 	hl_bytes_cell *reuse = NULL;
 	while( H_PRIMES[i] <= m->ncells ) i++;
 	while( H_PRIMES[i] <= m->ncells ) i++;
 	m->ncells = H_PRIMES[i];
 	m->ncells = H_PRIMES[i];
-	m->cells = (hl_bytes_cell **)hl_gc_alloc(sizeof(hl_bytes_cell*)*m->ncells);
+	m->cells = (hl_bytes_cell **)hl_gc_alloc_raw(sizeof(hl_bytes_cell*)*m->ncells);
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	for(i=0;i<oldsize;i++) {
 	for(i=0;i<oldsize;i++) {
 		hl_bytes_cell *c = old_cells[i];
 		hl_bytes_cell *c = old_cells[i];
@@ -255,10 +255,10 @@ struct _hl_int_map {
 };
 };
 
 
 HL_PRIM hl_int_map *hl_hialloc() {
 HL_PRIM hl_int_map *hl_hialloc() {
-	hl_int_map *m = (hl_int_map*)hl_gc_alloc(sizeof(hl_int_map));
+	hl_int_map *m = (hl_int_map*)hl_gc_alloc_raw(sizeof(hl_int_map));
 	m->ncells = H_SIZE_INIT;
 	m->ncells = H_SIZE_INIT;
 	m->nentries = 0;
 	m->nentries = 0;
-	m->cells = (hl_int_cell **)hl_gc_alloc(sizeof(hl_int_cell*)*m->ncells);
+	m->cells = (hl_int_cell **)hl_gc_alloc_raw(sizeof(hl_int_cell*)*m->ncells);
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	return m;
 	return m;
 }
 }
@@ -289,7 +289,7 @@ static void hl_hiremap( hl_int_map *m, int key, vdynamic *value, hl_int_cell **r
 	if( c )
 	if( c )
 		*reuse = c->next;
 		*reuse = c->next;
 	else
 	else
-		c = (hl_int_cell*)hl_gc_alloc(sizeof(hl_int_cell));
+		c = (hl_int_cell*)hl_gc_alloc_raw(sizeof(hl_int_cell));
 	memset(c,0,sizeof(hl_int_cell));
 	memset(c,0,sizeof(hl_int_cell));
 	c->keys[0] = key;
 	c->keys[0] = key;
 	c->values[0] = value;
 	c->values[0] = value;
@@ -319,7 +319,7 @@ static bool hl_hiadd( hl_int_map *m, int key, vdynamic *value ) {
 		m->nentries++;
 		m->nentries++;
 		return false;
 		return false;
 	}
 	}
-	c = (hl_int_cell*)hl_gc_alloc(sizeof(hl_int_cell));
+	c = (hl_int_cell*)hl_gc_alloc_raw(sizeof(hl_int_cell));
 	memset(c,0,sizeof(hl_int_cell));
 	memset(c,0,sizeof(hl_int_cell));
 	c->keys[0] = key;
 	c->keys[0] = key;
 	c->values[0] = value;
 	c->values[0] = value;
@@ -337,9 +337,8 @@ static void hl_higrow( hl_int_map *m ) {
 	hl_int_cell *reuse = NULL;
 	hl_int_cell *reuse = NULL;
 	while( H_PRIMES[i] <= m->ncells ) i++;
 	while( H_PRIMES[i] <= m->ncells ) i++;
 	m->ncells = H_PRIMES[i];
 	m->ncells = H_PRIMES[i];
-	m->cells = (hl_int_cell **)hl_gc_alloc(sizeof(hl_int_cell*)*m->ncells);
+	m->cells = (hl_int_cell **)hl_gc_alloc_raw(sizeof(hl_int_cell*)*m->ncells);
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	memset(m->cells,0,m->ncells * sizeof(void*));
-	m->nentries = 0;
 	for(i=0;i<oldsize;i++) {
 	for(i=0;i<oldsize;i++) {
 		hl_int_cell *c = old_cells[i];
 		hl_int_cell *c = old_cells[i];
 		while( c ) {
 		while( c ) {
@@ -454,10 +453,10 @@ struct _hl_obj_map {
 };
 };
 
 
 HL_PRIM hl_obj_map *hl_hoalloc() {
 HL_PRIM hl_obj_map *hl_hoalloc() {
-	hl_obj_map *m = (hl_obj_map*)hl_gc_alloc(sizeof(hl_obj_map));
+	hl_obj_map *m = (hl_obj_map*)hl_gc_alloc_raw(sizeof(hl_obj_map));
 	m->ncells = H_SIZE_INIT;
 	m->ncells = H_SIZE_INIT;
 	m->nentries = 0;
 	m->nentries = 0;
-	m->cells = (hl_obj_cell **)hl_gc_alloc(sizeof(hl_obj_cell*)*m->ncells);
+	m->cells = (hl_obj_cell **)hl_gc_alloc_raw(sizeof(hl_obj_cell*)*m->ncells);
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	return m;
 	return m;
 }
 }
@@ -490,7 +489,7 @@ static void hl_horemap( hl_obj_map *m, vdynamic *key, vdynamic *value, hl_obj_ce
 	if( c )
 	if( c )
 		*reuse = c->next;
 		*reuse = c->next;
 	else
 	else
-		c = (hl_obj_cell*)hl_gc_alloc(sizeof(hl_obj_cell));
+		c = (hl_obj_cell*)hl_gc_alloc_raw(sizeof(hl_obj_cell));
 	memset(c,0,sizeof(hl_obj_cell));
 	memset(c,0,sizeof(hl_obj_cell));
 	c->keys[0] = key;
 	c->keys[0] = key;
 	c->values[0] = value;
 	c->values[0] = value;
@@ -521,7 +520,7 @@ static bool hl_hoadd( hl_obj_map *m, vdynamic *key, vdynamic *value ) {
 		m->nentries++;
 		m->nentries++;
 		return false;
 		return false;
 	}
 	}
-	c = (hl_obj_cell*)hl_gc_alloc(sizeof(hl_obj_cell));
+	c = (hl_obj_cell*)hl_gc_alloc_raw(sizeof(hl_obj_cell));
 	memset(c,0,sizeof(hl_obj_cell));
 	memset(c,0,sizeof(hl_obj_cell));
 	c->keys[0] = key;
 	c->keys[0] = key;
 	c->values[0] = value;
 	c->values[0] = value;
@@ -539,7 +538,7 @@ static void hl_hogrow( hl_obj_map *m ) {
 	hl_obj_cell *reuse = NULL;
 	hl_obj_cell *reuse = NULL;
 	while( H_PRIMES[i] <= m->ncells ) i++;
 	while( H_PRIMES[i] <= m->ncells ) i++;
 	m->ncells = H_PRIMES[i];
 	m->ncells = H_PRIMES[i];
-	m->cells = (hl_obj_cell **)hl_gc_alloc(sizeof(hl_obj_cell*)*m->ncells);
+	m->cells = (hl_obj_cell **)hl_gc_alloc_raw(sizeof(hl_obj_cell*)*m->ncells);
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	memset(m->cells,0,m->ncells * sizeof(void*));
 	for(i=0;i<oldsize;i++) {
 	for(i=0;i<oldsize;i++) {
 		hl_obj_cell *c = old_cells[i];
 		hl_obj_cell *c = old_cells[i];

+ 8 - 6
src/std/obj.c

@@ -277,7 +277,7 @@ vdynamic *hl_virtual_make_value( vvirtual *v ) {
 	o->fields_data = (char*)v + hsize;
 	o->fields_data = (char*)v + hsize;
 	o->nfields = nfields;
 	o->nfields = nfields;
 	o->dataSize = v->t->virt->dataSize;
 	o->dataSize = v->t->virt->dataSize;
-	o->dproto = (vdynobj_proto*)hl_gc_alloc(sizeof(vdynobj_proto) + sizeof(hl_field_lookup) * (nfields - 1));
+	o->dproto = (vdynobj_proto*)hl_gc_alloc_noptr(sizeof(vdynobj_proto) + sizeof(hl_field_lookup) * (nfields - 1));
 	o->dproto->t = hlt_dynobj;
 	o->dproto->t = hlt_dynobj;
 	memcpy(&o->dproto->fields,v->t->virt->lookup,nfields * sizeof(hl_field_lookup));
 	memcpy(&o->dproto->fields,v->t->virt->lookup,nfields * sizeof(hl_field_lookup));
 	for(i=0;i<nfields;i++) {
 	for(i=0;i<nfields;i++) {
@@ -359,8 +359,8 @@ static hl_field_lookup *hl_dyn_alloc_field( vdynobj *o, int hfield, hl_type *t )
 	int size = hl_type_size(t);
 	int size = hl_type_size(t);
 	int index;
 	int index;
 	char *oldData = o->fields_data;
 	char *oldData = o->fields_data;
-	char *newData = (char*)hl_gc_alloc(o->dataSize + pad + size);
-	vdynobj_proto *proto = (vdynobj_proto*)hl_gc_alloc(sizeof(vdynobj_proto) + sizeof(hl_field_lookup) * (o->nfields + 1 - 1));
+	char *newData = (char*)hl_gc_alloc_raw(o->dataSize + pad + size);
+	vdynobj_proto *proto = (vdynobj_proto*)hl_gc_alloc_noptr(sizeof(vdynobj_proto) + sizeof(hl_field_lookup) * (o->nfields + 1 - 1));
 	int field_pos = hl_lookup_find_index(&o->dproto->fields, o->nfields, hfield);
 	int field_pos = hl_lookup_find_index(&o->dproto->fields, o->nfields, hfield);
 	hl_field_lookup *f;
 	hl_field_lookup *f;
 	// update data
 	// update data
@@ -373,6 +373,7 @@ static hl_field_lookup *hl_dyn_alloc_field( vdynobj *o, int hfield, hl_type *t )
 	proto->t = o->dproto->t;
 	proto->t = o->dproto->t;
 	memcpy(&proto->fields,&o->dproto->fields,field_pos * sizeof(hl_field_lookup));
 	memcpy(&proto->fields,&o->dproto->fields,field_pos * sizeof(hl_field_lookup));
 	f = (&proto->fields) + field_pos;
 	f = (&proto->fields) + field_pos;
+	if( t->kind == HDYNOBJ ) t = &hlt_dynobj; // can't store gc ptr in fields
 	f->t = t;
 	f->t = t;
 	f->hashed_name = hfield;
 	f->hashed_name = hfield;
 	f->field_index = index;
 	f->field_index = index;
@@ -420,10 +421,11 @@ static void hl_dyn_change_field( vdynobj *o, hl_field_lookup *f, hl_type *t ) {
 		wsize = total_size;
 		wsize = total_size;
 		total_size += hl_pad_size(total_size,t);
 		total_size += hl_pad_size(total_size,t);
 		f->field_index = total_size;
 		f->field_index = total_size;
+		if( t->kind == HDYNOBJ ) t = &hlt_dynobj; // can't store gc ptr in fields
 		f->t = t;
 		f->t = t;
 		total_size += size;
 		total_size += size;
 		if( total_size > o->dataSize ) {
 		if( total_size > o->dataSize ) {
-			newData = (char*)hl_gc_alloc(total_size);
+			newData = (char*)hl_gc_alloc_noptr(total_size);
 			memcpy(newData,o->fields_data,wsize);
 			memcpy(newData,o->fields_data,wsize);
 			o->fields_data = newData;
 			o->fields_data = newData;
 			o->dataSize = total_size;
 			o->dataSize = total_size;
@@ -839,9 +841,9 @@ HL_PRIM vdynamic *hl_obj_copy( vdynamic *obj ) {
 			c->dataSize = o->dataSize;
 			c->dataSize = o->dataSize;
 			c->nfields = o->nfields;
 			c->nfields = o->nfields;
 			c->virtuals = NULL;
 			c->virtuals = NULL;
-			c->dproto = (vdynobj_proto*)hl_gc_alloc(protoSize);
+			c->dproto = (vdynobj_proto*)hl_gc_alloc_noptr(protoSize);
 			memcpy(c->dproto,o->dproto,protoSize);
 			memcpy(c->dproto,o->dproto,protoSize);
-			c->fields_data = (char*)hl_gc_alloc(o->dataSize);
+			c->fields_data = (char*)hl_gc_alloc_noptr(o->dataSize);
 			memcpy(c->fields_data,o->fields_data,o->dataSize);
 			memcpy(c->fields_data,o->fields_data,o->dataSize);
 			return (vdynamic*)c;
 			return (vdynamic*)c;
 		}
 		}

+ 1 - 1
src/std/types.c

@@ -402,7 +402,7 @@ HL_PRIM vdynamic *hl_alloc_enum( hl_type *t, int index, varray *args ) {
 			hasPtr = true;
 			hasPtr = true;
 			break;
 			break;
 		}
 		}
-	e = (venum*)(hasPtr ? hl_gc_alloc(c->size) : hl_gc_alloc_noptr(c->size));
+	e = (venum*)(hasPtr ? hl_gc_alloc_raw(c->size) : hl_gc_alloc_noptr(c->size));
 	e->index = index;
 	e->index = index;
 	for(i=0;i<c->nparams;i++)
 	for(i=0;i<c->nparams;i++)
 		hl_write_dyn((char*)e+c->offsets[i],c->params[i],hl_aptr(args,vdynamic*)[i]);
 		hl_write_dyn((char*)e+c->offsets[i],c->params[i],hl_aptr(args,vdynamic*)[i]);