errors
This commit is contained in:
104
source/cell.c
104
source/cell.c
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "cell.h"
|
#include "cell.h"
|
||||||
#include "cell_internal.h"
|
#include "cell_internal.h"
|
||||||
|
#include "cJSON.h"
|
||||||
|
|
||||||
#define ENGINE "internal/engine.cm"
|
#define ENGINE "internal/engine.cm"
|
||||||
#define CELL_SHOP_DIR ".cell"
|
#define CELL_SHOP_DIR ".cell"
|
||||||
@@ -104,6 +105,35 @@ static char* load_core_file(const char *filename, size_t *out_size) {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int print_json_errors(const char *json) {
|
||||||
|
if (!json) return 0;
|
||||||
|
cJSON *root = cJSON_Parse(json);
|
||||||
|
if (!root) return 0;
|
||||||
|
cJSON *errors = cJSON_GetObjectItemCaseSensitive(root, "errors");
|
||||||
|
if (!cJSON_IsArray(errors) || cJSON_GetArraySize(errors) == 0) {
|
||||||
|
cJSON_Delete(root);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const char *filename = "<unknown>";
|
||||||
|
cJSON *fname = cJSON_GetObjectItemCaseSensitive(root, "filename");
|
||||||
|
if (cJSON_IsString(fname))
|
||||||
|
filename = fname->valuestring;
|
||||||
|
cJSON *e;
|
||||||
|
cJSON_ArrayForEach(e, errors) {
|
||||||
|
const char *msg = cJSON_GetStringValue(
|
||||||
|
cJSON_GetObjectItemCaseSensitive(e, "message"));
|
||||||
|
cJSON *line = cJSON_GetObjectItemCaseSensitive(e, "line");
|
||||||
|
cJSON *col = cJSON_GetObjectItemCaseSensitive(e, "column");
|
||||||
|
if (msg && cJSON_IsNumber(line) && cJSON_IsNumber(col))
|
||||||
|
fprintf(stderr, "%s:%d:%d: error: %s\n",
|
||||||
|
filename, (int)line->valuedouble, (int)col->valuedouble, msg);
|
||||||
|
else if (msg)
|
||||||
|
fprintf(stderr, "%s: error: %s\n", filename, msg);
|
||||||
|
}
|
||||||
|
cJSON_Delete(root);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Get the core path for use by scripts
|
// Get the core path for use by scripts
|
||||||
const char* cell_get_core_path(void) {
|
const char* cell_get_core_path(void) {
|
||||||
return core_path;
|
return core_path;
|
||||||
@@ -385,16 +415,20 @@ int cell_init(int argc, char **argv)
|
|||||||
|
|
||||||
char *json = JS_AST(ctx, script, strlen(script), filename);
|
char *json = JS_AST(ctx, script, strlen(script), filename);
|
||||||
if (json) {
|
if (json) {
|
||||||
|
int has_errors = print_json_errors(json);
|
||||||
printf("%s\n", json);
|
printf("%s\n", json);
|
||||||
free(json);
|
free(json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return has_errors ? 1 : 0;
|
||||||
} else {
|
} else {
|
||||||
printf("Failed to parse AST\n");
|
printf("Failed to parse AST\n");
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_FreeContext(ctx);
|
|
||||||
JS_FreeRuntime(rt);
|
|
||||||
free(allocated_script);
|
|
||||||
return json ? 0 : 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for --tokenize flag to output token array JSON */
|
/* Check for --tokenize flag to output token array JSON */
|
||||||
@@ -442,16 +476,20 @@ int cell_init(int argc, char **argv)
|
|||||||
|
|
||||||
char *json = JS_Tokenize(ctx, script, strlen(script), filename);
|
char *json = JS_Tokenize(ctx, script, strlen(script), filename);
|
||||||
if (json) {
|
if (json) {
|
||||||
|
int has_errors = print_json_errors(json);
|
||||||
printf("%s\n", json);
|
printf("%s\n", json);
|
||||||
free(json);
|
free(json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return has_errors ? 1 : 0;
|
||||||
} else {
|
} else {
|
||||||
printf("Failed to tokenize\n");
|
printf("Failed to tokenize\n");
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_FreeContext(ctx);
|
|
||||||
JS_FreeRuntime(rt);
|
|
||||||
free(allocated_script);
|
|
||||||
return json ? 0 : 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for --mach flag to output machine code JSON */
|
/* Check for --mach flag to output machine code JSON */
|
||||||
@@ -506,10 +544,25 @@ int cell_init(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (print_json_errors(ast_json)) {
|
||||||
|
free(ast_json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
char *mach_json = JS_Mach(ctx, ast_json);
|
char *mach_json = JS_Mach(ctx, ast_json);
|
||||||
free(ast_json);
|
free(ast_json);
|
||||||
|
|
||||||
if (mach_json) {
|
if (mach_json) {
|
||||||
|
if (print_json_errors(mach_json)) {
|
||||||
|
free(mach_json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
printf("%s\n", mach_json);
|
printf("%s\n", mach_json);
|
||||||
free(mach_json);
|
free(mach_json);
|
||||||
} else {
|
} else {
|
||||||
@@ -574,10 +627,25 @@ int cell_init(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (print_json_errors(ast_json)) {
|
||||||
|
free(ast_json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
char *mach_json = JS_Mach(ctx, ast_json);
|
char *mach_json = JS_Mach(ctx, ast_json);
|
||||||
free(ast_json);
|
free(ast_json);
|
||||||
|
|
||||||
if (mach_json) {
|
if (mach_json) {
|
||||||
|
if (print_json_errors(mach_json)) {
|
||||||
|
free(mach_json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
JS_DumpRegisterMach(ctx, mach_json, JS_NULL);
|
JS_DumpRegisterMach(ctx, mach_json, JS_NULL);
|
||||||
free(mach_json);
|
free(mach_json);
|
||||||
} else {
|
} else {
|
||||||
@@ -643,6 +711,14 @@ int cell_init(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (print_json_errors(ast_json)) {
|
||||||
|
free(ast_json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Generate machine code */
|
/* Generate machine code */
|
||||||
char *mach_json = JS_Mach(ctx, ast_json);
|
char *mach_json = JS_Mach(ctx, ast_json);
|
||||||
free(ast_json);
|
free(ast_json);
|
||||||
@@ -655,6 +731,14 @@ int cell_init(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (print_json_errors(mach_json)) {
|
||||||
|
free(mach_json);
|
||||||
|
JS_FreeContext(ctx);
|
||||||
|
JS_FreeRuntime(rt);
|
||||||
|
free(allocated_script);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Execute through register VM */
|
/* Execute through register VM */
|
||||||
JSValue result = JS_IntegrateRegister(ctx, mach_json, JS_NULL);
|
JSValue result = JS_IntegrateRegister(ctx, mach_json, JS_NULL);
|
||||||
free(mach_json);
|
free(mach_json);
|
||||||
|
|||||||
Reference in New Issue
Block a user