]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
executor: prog_delete: deleting builtins properly - unless statically allocated;...
authorWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 17:27:56 +0000 (19:27 +0200)
committerWolfgang Bumiller <wolfgang.linux@bumiller.com>
Fri, 27 Jul 2012 17:27:56 +0000 (19:27 +0200)
exec.c

diff --git a/exec.c b/exec.c
index f13d4da5cac2a37f0b1f6bdd0fa99ec83d2c5439..4a1ad09d8d600786df401b16f822a499173af020 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -22,6 +22,8 @@ MEM_VEC_FUNCTIONS(qc_program,   qc_exec_stack, stack)
 MEM_VEC_FUNCTIONS(qc_program,   size_t, profile)
 MEM_VEC_FUN_RESIZE(qc_program,  size_t, profile)
 
+MEM_VEC_FUNCTIONS(qc_program,   prog_builtin, builtins)
+
 static void loaderror(const char *fmt, ...)
 {
     int     err = errno;
@@ -134,6 +136,11 @@ void prog_delete(qc_program *prog)
     MEM_VECTOR_CLEAR(prog, localstack);
     MEM_VECTOR_CLEAR(prog, stack);
     MEM_VECTOR_CLEAR(prog, profile);
+
+    if (prog->builtins_alloc) {
+        MEM_VECTOR_CLEAR(prog, builtins);
+    }
+    /* otherwise the builtins were statically allocated */
     mem_d(prog);
 }
 
@@ -451,6 +458,19 @@ cleanup:
  */
 
 #if defined(QCVM_EXECUTOR)
+static int qc_print(qc_program *prog)
+{
+    qcany *str = (qcany*)(prog->globals + OFS_PARM0);
+    printf("%s", prog_getstring(prog, str->string));
+    return 0;
+}
+
+static prog_builtin qc_builtins[] = {
+    NULL,
+    &qc_print
+};
+static size_t qc_builtins_count = sizeof(qc_builtins) / sizeof(qc_builtins[0]);
+
 int main(int argc, char **argv)
 {
     size_t      i;
@@ -468,6 +488,10 @@ int main(int argc, char **argv)
         exit(1);
     }
 
+    prog->builtins       = qc_builtins;
+    prog->builtins_count = qc_builtins_count;
+    prog->builtins_alloc = 0;
+
     for (i = 1; i < prog->functions_count; ++i) {
         const char *name = prog_getstring(prog, prog->functions[i].name);
         printf("Found function: %s\n", name);