int main(int argc, char ** argv) { GAP_Initialize(argc, argv, environ, 0L, 0L); CollectBags(0, 1); // full GC test_eval("g:=FreeGroup(2);"); test_eval("a:=g.1;"); test_eval("b:=g.2;"); test_eval("lis:=[a^2, a^2, b*a];"); test_eval("h:=g/lis;"); /* TODO: use unique temporary filename to avoid a race */ test_eval("SaveWorkspace(\"/tmp/libgap.ws\");\n"); printf("# done\n"); return 0; }
UInt ResizeBag(Bag bag, UInt new_size) { UInt type; /* type of the bag */ UInt flags; UInt old_size; /* old size of the bag */ Bag * src; /* source in copying */ UInt alloc_size; /* check the size */ #ifdef TREMBLE_HEAP CollectBags(0, 0); #endif BagHeader * header = BAG_HEADER(bag); /* get type and old size of the bag */ type = header->type; flags = header->flags; old_size = header->size; #ifdef COUNT_BAGS /* update the statistics */ InfoBags[type].sizeLive += new_size - old_size; InfoBags[type].sizeAll += new_size - old_size; #endif SizeAllBags += new_size - old_size; #ifndef DISABLE_GC alloc_size = GC_size(header); /* An alternative implementation would be to compare * new_size <= alloc_size in the following test in order * to avoid reallocations for alternating contractions * and expansions. However, typed allocation in the Boehm * GC stores layout information in the last word of a memory * block and we may accidentally overwrite this information, * because GC_size() includes that extraneous word when * returning the size of a memory block. * * This is technically a bug in GC_size(), but until and * unless there is an upstream fix, we'll do it the safe * way. */ if (new_size <= old_size && sizeof(BagHeader) + new_size >= alloc_size * 3 / 4) { #else if (new_size <= old_size) { #endif /* DISABLE_GC */ /* change the size word */ header->size = new_size; } /* if the bag is enlarged */ else { alloc_size = sizeof(BagHeader) + new_size; if (new_size == 0) alloc_size++; #ifndef DISABLE_GC header = AllocateBagMemory(TabMarkTypeBags[type], type, alloc_size); #else header = calloc(1, alloc_size); #endif header->type = type; header->flags = flags; header->size = new_size; // copy data and update the masterpointer src = PTR_BAG(bag); memcpy(DATA(header), src, old_size < new_size ? old_size : new_size); SET_PTR_BAG(bag, DATA(header)); } /* return success */ return 1; } /***************************************************************************** ** The following functions are not required respectively supported, so empty ** implementations are provided ** */ void InitGlobalBag(Bag * addr, const Char * cookie) { } void SwapMasterPoint(Bag bag1, Bag bag2) { Obj * ptr1 = PTR_BAG(bag1); Obj * ptr2 = PTR_BAG(bag2); SET_PTR_BAG(bag1, ptr2); SET_PTR_BAG(bag2, ptr1); }