فهرست منبع

allocate as no_ptr objects with pure data

Nicolas Cannasse 8 سال پیش
والد
کامیت
a340bd33cb
3فایلهای تغییر یافته به همراه14 افزوده شده و 1 حذف شده
  1. 11 1
      src/alloc.c
  2. 1 0
      src/hl.h
  3. 2 0
      src/std/obj.c

+ 11 - 1
src/alloc.c

@@ -932,7 +932,7 @@ vdynamic *hl_alloc_obj( hl_type *t ) {
 	if( rt == NULL || rt->methods == NULL ) rt = hl_get_obj_proto(t);
 	size = rt->size;
 	if( size & (HL_WSIZE-1) ) size += HL_WSIZE - (size & (HL_WSIZE-1));
-	o = (vobj*)hl_gc_alloc(size);
+	o = (vobj*)hl_gc_alloc_gen(size, rt->hasPtr ? MEM_KIND_DYNAMIC : MEM_KIND_NOPTR);
 	MZERO(o,size);
 	o->t = t;
 	return (vdynamic*)o;
@@ -1033,6 +1033,16 @@ HL_API void hl_gc_dump_memory( const char *filename ) {
 		fdump_d(stack_head,size*sizeof(void*));
 	}
 	// types
+#	define fdump_t(t)	fdump_i(t.kind); fdump_p(&t);
+	fdump_t(hlt_i32);
+	fdump_t(hlt_f32);
+	fdump_t(hlt_f64);
+	fdump_t(hlt_dyn);
+	fdump_t(hlt_array);
+	fdump_t(hlt_bytes);
+	fdump_t(hlt_dynobj);
+	fdump_t(hlt_bool);
+	fdump_i(-1);
 	if( gc_types_dump ) gc_types_dump(fdump_d);
 	fclose(fdump);
 	fdump = NULL;

+ 1 - 0
src/hl.h

@@ -376,6 +376,7 @@ struct hl_runtime_obj {
 	int nproto;
 	int size;
 	int nmethods;
+	bool hasPtr;
 	void **methods;
 	int *fields_indexes;
 	hl_runtime_obj *parent;

+ 2 - 0
src/std/obj.c

@@ -152,6 +152,7 @@ HL_PRIM hl_runtime_obj *hl_get_obj_rt( hl_type *ot ) {
 	t->nfields = o->nfields + (p ? p->nfields : 0);
 	t->nproto = p ? p->nproto : 0;
 	t->nlookup = o->nfields;
+	t->hasPtr = p ? p->hasPtr : false;
 
 	if( !p )
 		t->nlookup += o->nproto;
@@ -189,6 +190,7 @@ HL_PRIM hl_runtime_obj *hl_get_obj_rt( hl_type *ot ) {
 		else
 			t->nlookup--;
 		size += hl_type_size(ft);
+		if( !t->hasPtr && hl_is_ptr(ft) ) t->hasPtr = true;
 	}
 	t->size = size;
 	t->nmethods = p ? p->nmethods : o->nproto;