Przeglądaj źródła

fixed some issues with dynobj field indexes

Nicolas Cannasse 2 lat temu
rodzic
commit
bda70cff59
2 zmienionych plików z 2 dodań i 2 usunięć
  1. 1 1
      src/std/fun.c
  2. 1 1
      src/std/types.c

+ 1 - 1
src/std/fun.c

@@ -338,7 +338,7 @@ HL_PRIM void *hl_dyn_call_obj( vdynamic *o, hl_type *ft, int hfield, void **args
 			hl_field_lookup *l = hl_lookup_find(d->lookup,d->nfields, hfield);
 			hl_field_lookup *l = hl_lookup_find(d->lookup,d->nfields, hfield);
 			if( l != NULL && l->t->kind != HFUN )
 			if( l != NULL && l->t->kind != HFUN )
 				hl_error("Field %s is of type %s and cannot be called", hl_field_name(hfield), hl_type_str(l->t));
 				hl_error("Field %s is of type %s and cannot be called", hl_field_name(hfield), hl_type_str(l->t));
-			vclosure *tmp = (vclosure*)d->values[l->field_index];
+			vclosure *tmp = (vclosure*)d->values[l->field_index&HL_DYNOBJ_INDEX_MASK];
 			if( tmp ) {
 			if( tmp ) {
 				vclosure_wrapper w;
 				vclosure_wrapper w;
 				w.cl.t = ft;
 				w.cl.t = ft;

+ 1 - 1
src/std/types.c

@@ -838,7 +838,7 @@ static void compact_write_content( mem_context *ctx, vdynamic *d ) {
 			hl_field_lookup *f = obj->lookup + i;
 			hl_field_lookup *f = obj->lookup + i;
 			int idx = compact_lookup_ref(ctx, hl_is_ptr(f->t) ? (char*)(obj->values + (f->field_index&HL_DYNOBJ_INDEX_MASK)) : (char*)(obj->raw_data + (f->field_index&HL_DYNOBJ_INDEX_MASK)), false);
 			int idx = compact_lookup_ref(ctx, hl_is_ptr(f->t) ? (char*)(obj->values + (f->field_index&HL_DYNOBJ_INDEX_MASK)) : (char*)(obj->raw_data + (f->field_index&HL_DYNOBJ_INDEX_MASK)), false);
 			idx = -idx-1;
 			idx = -idx-1;
-			ctx->remap_target[idx] = hl_is_ptr(f->t) ? values_data + sizeof(void*)*f->field_index : raw_data + (f->field_index&HL_DYNOBJ_INDEX_MASK);
+			ctx->remap_target[idx] = hl_is_ptr(f->t) ? values_data + sizeof(void*)*(f->field_index&HL_DYNOBJ_INDEX_MASK) : raw_data + (f->field_index&HL_DYNOBJ_INDEX_MASK);
 		}
 		}
 		ctx->todos_pos = save_pos;
 		ctx->todos_pos = save_pos;
 		break;
 		break;