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)"
.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)"
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;
}
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);
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]);
}
}
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
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
bool def = false;
int stack_size = 1024;
+ int callstack_size = 4096;
if(argv[1] != NULL) {
out = fopen(argv[1], "w");
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, " ");
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, " ");