diff --git a/object.c b/object.c index f2c0319..a9002d4 100644 --- a/object.c +++ b/object.c @@ -24,8 +24,11 @@ void *memcheck(void *ptr) return ptr; } +unsigned long long nalloc= 0; + void *xmalloc(size_t n) { + nalloc += n; #if (USE_GC) void *mem= GC_malloc(n); assert(mem); @@ -37,6 +40,7 @@ void *xmalloc(size_t n) void *xrealloc(void *p, size_t n) { + nalloc += n; #if (USE_GC) void *mem= GC_realloc(p, n); assert(mem); @@ -53,6 +57,7 @@ char *xstrdup(char *s) char *mem= GC_malloc_atomic(len + 1); assert(mem); memcpy(mem, s, len + 1); + nalloc += len; #else char *mem= memcheck(strdup(s)); #endif diff --git a/parse.leg b/parse.leg index abb4624..21f7f21 100644 --- a/parse.leg +++ b/parse.leg @@ -1910,6 +1910,12 @@ oop prim_import(oop scope, oop params) return null; } +oop prim_String(oop scope, oop params) +{ + if (!map_hasIntegerKey(params, 0)) return null; + return makeString(printString(get(params, Map, elements)[0].value)); +} + oop prim_scope(oop scope, oop params) { return scope; @@ -1943,6 +1949,7 @@ int main(int argc, char **argv) map_set(globals, intern("clone" ), makeFunction(prim_clone, intern("clone" ), null, null, globals, null)); map_set(globals, intern("import" ), makeFunction(prim_import, intern("import" ), null, null, globals, null)); map_set(globals, intern("microseconds"), makeFunction(prim_microseconds, intern("microseconds"), null, null, globals, null)); + map_set(globals, intern("String" ), makeFunction(prim_String , intern("String" ), null, null, globals, null)); map_set(globals, intern("scope"), makeFunction(prim_scope, intern("scope"), null, null, globals, null)); @@ -1981,6 +1988,8 @@ int main(int argc, char **argv) readEvalPrint(globals, NULL); } + printf("[GC: %lli bytes allocated]\n", nalloc); + return 0; (void)yyAccept;