implement callstack overflow
authornishi <nishi@0f02c867-ac3d-714e-8a88-971ba1f6efcf>
Sat, 4 May 2024 15:14:13 +0000 (15:14 +0000)
committernishi <nishi@0f02c867-ac3d-714e-8a88-971ba1f6efcf>
Sat, 4 May 2024 15:14:13 +0000 (15:14 +0000)
git-svn-id: file:///raid/svn-main/nishi-serenade/trunk@106 0f02c867-ac3d-714e-8a88-971ba1f6efcf

GNUmakefile
Makefile
Serenade/interpreter.c
Serenade/main.c
Serenade/run.c
Tool/config.c
Tool/configgen.c

index 9d812d0d6c2f3b669c8a5aae7ae82fc06712260f..47386fdd803ae5f8e073d549ca7fd1654bb986e0 100644 (file)
@@ -22,9 +22,9 @@ ifneq ("$(PLATFORM)", "")
 include "platforms/${PLATFORM}.mk"
 endif
 
-.PHONY: all ./Serenade ./Tool replace format
+.PHONY: all ./Serenade ./Tool/config ./Tool replace format
 
-all: ./Tool ./config.h ./Serenade
+all: ./Tool ./config.h ./Tool/config ./Serenade
 
 ./Tool::
        $(MAKE) -C ./Tool CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" LIBS="$(LIBS)" SUFFIX="$(SUFFIX)"
index 23dcaba896f7b8c4db99baf84048ff85d7a9b9ba..17382349cf516fd3f4d45272e54a63ea8cd53c5b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -17,7 +17,7 @@ PREFIX_SO = lib
 
 .PHONY: all ./Serenade ./Tool/config ./Tool replace format
 
-all: ./Tool ./Tool/config ./config.h ./Serenade
+all: ./Tool ./config.h ./Tool/config ./Serenade
 
 ./Tool::
        $(MAKE) -C ./Tool CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" LIBS="$(LIBS)" SUFFIX="$(SUFFIX)"
index 8853143fc489441ed886292281d3cafd97eb9d7f..15965605a347fc297cc29e84bc409bc4e51a0474 100644 (file)
@@ -175,6 +175,11 @@ struct sn_interpreter* sn_create_interpreter(void) {
        sn->generics[0] = NULL;
        sn->callstack = 0;
 
+       struct sn_generic* callstack_size = malloc(sizeof(struct sn_generic));
+       callstack_size->type = SN_TYPE_DOUBLE;
+       callstack_size->number = CALLSTACK_SIZE;
+       sn_set_variable(sn, "serenade-callstack", callstack_size);
+
        return sn;
 }
 
index 23a9b92e9464b8fe9728aa179e466c9a13f56b01..303ee8e99cb15c2e9b1c63f93238547e041eaef3 100644 (file)
@@ -123,6 +123,7 @@ int main(int argc, char** argv) {
                printf("Compiled in MSC %d\n", _MSC_FULL_VER);
 #endif
                printf("Parser stack size: %d\n", PARSER_STACK_SIZE);
+               printf("Callstack size: %d\n", CALLSTACK_SIZE);
                struct sn_interpreter* sn = sn_create_interpreter();
                sn_stdlib_init(sn);
                sn_module_init(sn);
index fbc6612c123c672a55a55f45a4b24f48873e0359..024718fe5fab24808755efa23e78ff2f01c1525d 100644 (file)
@@ -50,6 +50,22 @@ struct sn_generic* run_code(struct sn_interpreter* sn, int argc, struct sn_gener
        sn->local_variables = malloc(sizeof(struct sn_interpreter_kv*));
        sn->local_variables[0] = NULL;
        sn->callstack++;
+
+       int callstack_size = 4096;
+       if(sn->variables != NULL) {
+               int i;
+               for(i = 0; sn->variables[i] != NULL; i++) {
+                       if(strcmp(sn->variables[i]->key, "serenade-callstack") == 0) {
+                               callstack_size = sn->variables[i]->value->number;
+                               break;
+                       }
+               }
+       }
+
+       if(sn->callstack > callstack_size) {
+               fprintf(stderr, "Callstack overflow.\n");
+               return NULL;
+       }
        for(i = 0; gens[i] != NULL; i++) {
                _sn_run(sn, gens[i]);
        }
index 268a58958e70b0565fe284a1844e02d3fa9656e6..3bd525dbe37511b0cc129b5c15bbcdd74ee94e80 100644 (file)
@@ -12,12 +12,12 @@ int main(int argc, char** argv) {
        }
        char* argv2 = argv[2] == NULL ? "" : argv[2];
        if(strcmp(argv[1], "cflags") == 0) {
-               if(strcmp(argv2, "NetBSD") == 0){
+               if(strcmp(argv2, "NetBSD") == 0) {
                        printf("-I/usr/pkg/include ");
                }
                printf("\n");
        } else if(strcmp(argv[1], "libs") == 0) {
-               if(strcmp(argv2, "NetBSD") == 0){
+               if(strcmp(argv2, "NetBSD") == 0) {
                        printf("-L/usr/pkg/lib -Wl,-R/usr/pkg/lib ");
                }
 #ifdef HAS_FFI_SUPPORT
@@ -27,7 +27,7 @@ int main(int argc, char** argv) {
                printf("-lreadline ");
 #endif
 #if defined(HAS_FFI_SUPPORT) || defined(HAS_BINMODULE_SUPPORT)
-               if(strcmp(argv2, "NetBSD") != 0 && strcmp(argv2, "Windows") == 0){
+               if(strcmp(argv2, "NetBSD") != 0 && strcmp(argv2, "Windows") == 0) {
                        printf("-ldl ");
                }
 #endif
index 240ececaae0a22fccfb8a84cfaaa7773c87651db..fc3b6f65a3bd824c671e53c3e8dd162c82da3f2a 100644 (file)
@@ -59,6 +59,7 @@ int main(int argc, char** argv) {
        bool def = false;
 
        int stack_size = 1024;
+       int callstack_size = 4096;
 
        if(argv[1] != NULL) {
                out = fopen(argv[1], "w");
@@ -79,6 +80,7 @@ int main(int argc, char** argv) {
                        fprintf(out, "#%s %s\n", asks[n * 4 + 1][0] == 'y' ? "define" : "undef", asks[n * 4 + 2]);
                }
                fprintf(out, "#define PARSER_STACK_SIZE %d\n", stack_size);
+               fprintf(out, "#define CALLSTACK_SIZE %d\n", callstack_size);
                fprintf(out, "#define SUPPORT \"");
                for(n = 0; asks[n * 4] != NULL; n++) {
                        if(n > 0) fprintf(out, " ");
@@ -116,6 +118,10 @@ int main(int argc, char** argv) {
        fflush(stderr);
        scanf("%d", &stack_size);
        fprintf(out, "#define PARSER_STACK_SIZE %d\n", stack_size);
+       fprintf(stderr, "[recommended: 4096] Callstack size? ");
+       fflush(stderr);
+       scanf("%d", &callstack_size);
+       fprintf(out, "#define CALLSTACK_SIZE %d\n", callstack_size);
        fprintf(out, "#define SUPPORT \"");
        for(n = 0; asks[n * 4] != NULL; n++) {
                if(n > 0) fprintf(out, " ");