summaryrefslogtreecommitdiff
path: root/testsuite/tests/rts/ipe/ipe_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/rts/ipe/ipe_lib.c')
-rw-r--r--testsuite/tests/rts/ipe/ipe_lib.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/testsuite/tests/rts/ipe/ipe_lib.c b/testsuite/tests/rts/ipe/ipe_lib.c
new file mode 100644
index 0000000000..37bb20c738
--- /dev/null
+++ b/testsuite/tests/rts/ipe/ipe_lib.c
@@ -0,0 +1,78 @@
+#include "Rts.h"
+#include "rts/IPE.h"
+#include <string.h>
+#include "ipe_lib.h"
+
+void init_string_table(StringTable *st) {
+ st->size = 128;
+ st->n = 0;
+ st->buffer = malloc(st->size);
+}
+
+uint32_t add_string(StringTable *st, const char *s) {
+ const size_t len = strlen(s);
+ const uint32_t n = st->n;
+ if (st->n + len + 1 > st->size) {
+ const size_t new_size = 2*st->size + len;
+ st->buffer = realloc(st->buffer, new_size);
+ st->size = new_size;
+ }
+
+ memcpy(&st->buffer[st->n], s, len);
+ st->n += len;
+ st->buffer[st->n] = '\0';
+ st->n += 1;
+ return n;
+}
+
+IpeBufferEntry makeAnyProvEntry(Capability *cap, StringTable *st, HaskellObj closure, int i) {
+ IpeBufferEntry provEnt;
+ provEnt.info = get_itbl(closure);
+
+ unsigned int tableNameLength = strlen("table_name_") + 3 /* digits */ + 1 /* null character */;
+ char *tableName = malloc(sizeof(char) * tableNameLength);
+ snprintf(tableName, tableNameLength, "table_name_%03i", i);
+ provEnt.table_name = add_string(st, tableName);
+
+ unsigned int closureDescLength = strlen("closure_desc_") + 3 /* digits */ + 1 /* null character */;
+ char *closureDesc = malloc(sizeof(char) * closureDescLength);
+ snprintf(closureDesc, closureDescLength, "closure_desc_%03i", i);
+ provEnt.closure_desc = add_string(st, closureDesc);
+
+ unsigned int tyDescLength = strlen("ty_desc_") + 3 /* digits */ + 1 /* null character */;
+ char *tyDesc = malloc(sizeof(char) * tyDescLength);
+ snprintf(tyDesc, tyDescLength, "ty_desc_%03i", i);
+ provEnt.ty_desc = add_string(st, tyDesc);
+
+ unsigned int labelLength = strlen("label_") + 3 /* digits */ + 1 /* null character */;
+ char *label = malloc(sizeof(char) * labelLength);
+ snprintf(label, labelLength, "label_%03i", i);
+ provEnt.label = add_string(st, label);
+
+ unsigned int moduleLength = strlen("module_") + 3 /* digits */ + 1 /* null character */;
+ char *module = malloc(sizeof(char) * moduleLength);
+ snprintf(module, moduleLength, "module_%03i", i);
+ provEnt.module_name = add_string(st, module);
+
+ unsigned int srcLocLength = strlen("srcloc_") + 3 /* digits */ + 1 /* null character */;
+ char *srcLoc = malloc(sizeof(char) * srcLocLength);
+ snprintf(srcLoc, srcLocLength, "srcloc_%03i", i);
+ provEnt.srcloc = add_string(st, srcLoc);
+
+ return provEnt;
+}
+
+IpeBufferListNode *makeAnyProvEntries(Capability *cap, int start, int end) {
+ const int n = end - start;
+ IpeBufferListNode *node = malloc(sizeof(IpeBufferListNode) + n * sizeof(IpeBufferEntry));
+ StringTable st;
+ init_string_table(&st);
+ for (int i=start; i < end; i++) {
+ HaskellObj closure = rts_mkInt(cap, 42);
+ node->entries[i] = makeAnyProvEntry(cap, &st, closure, i);
+ }
+ node->next = NULL;
+ node->count = n;
+ node->string_table = st.buffer;
+ return node;
+}