MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

cleanup builtins

+137 -111
+6
include/modules/builtin.h
··· 1 + #ifndef BUILTIN_H 2 + #define BUILTIN_H 3 + 4 + void init_builtin_module(void); 5 + 6 + #endif
+1 -4
include/modules/server.h
··· 1 1 #ifndef SERVER_H 2 2 #define SERVER_H 3 3 4 - #include "ant.h" 5 - 6 - // Ant.serve(port, handler) 7 - jsval_t js_serve(struct js *js, jsval_t *args, int nargs); 4 + void init_server_module(void); 8 5 9 6 #endif
+1 -1
meson.build
··· 41 41 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 42 42 43 43 version_conf = configuration_data() 44 - version_conf.set('ANT_VERSION', '0.0.5.54') 44 + version_conf.set('ANT_VERSION', '0.0.5.55') 45 45 version_conf.set('ANT_GIT_HASH', git_hash) 46 46 version_conf.set('ANT_BUILD_DATE', build_date) 47 47
+4 -101
src/main.c
··· 3 3 #include <string.h> 4 4 #include <libgen.h> 5 5 #include <limits.h> 6 - #include <signal.h> 7 6 #include <unistd.h> 7 + #include <argtable3.h> 8 8 9 9 #include "ant.h" 10 10 #include "config.h" 11 11 #include "runtime.h" 12 - #include "argtable3.h" 13 12 13 + #include "modules/builtin.h" 14 14 #include "modules/io.h" 15 15 #include "modules/crypto.h" 16 16 #include "modules/server.h" ··· 25 25 26 26 static int module_count = 0; 27 27 static int module_capacity = 0; 28 - 29 - static struct { 30 - struct js *js; 31 - jsval_t handler; 32 - } signal_handlers[32] = {0}; 33 - 34 - static jsval_t js_gc_trigger(struct js *js, jsval_t *args, int nargs) { 35 - (void) args; (void) nargs; 36 - size_t before_brk = js_getbrk(js); 37 - 38 - js_gc(js); 39 - size_t after_brk = js_getbrk(js); 40 - 41 - jsval_t result = js_mkobj(js); 42 - js_set(js, result, "before", js_mknum((double)before_brk)); 43 - js_set(js, result, "after", js_mknum((double)after_brk)); 44 - 45 - return result; 46 - } 47 - 48 - static jsval_t js_alloc(struct js *js, jsval_t *args, int nargs) { 49 - (void) args; (void) nargs; 50 - 51 - size_t total = 0, min_free = 0, cstack = 0; 52 - js_stats(js, &total, &min_free, &cstack); 53 - 54 - jsval_t result = js_mkobj(js); 55 - js_set(js, result, "used", js_mknum((double)total)); 56 - js_set(js, result, "minFree", js_mknum((double)min_free)); 57 - 58 - return result; 59 - } 60 - 61 - static jsval_t js_stats_fn(struct js *js, jsval_t *args, int nargs) { 62 - (void) args; (void) nargs; 63 - 64 - size_t total = 0, min_free = 0, cstack = 0; 65 - js_stats(js, &total, &min_free, &cstack); 66 - 67 - jsval_t result = js_mkobj(js); 68 - js_set(js, result, "used", js_mknum((double)total)); 69 - js_set(js, result, "minFree", js_mknum((double)min_free)); 70 - js_set(js, result, "cstack", js_mknum((double)cstack)); 71 - 72 - return result; 73 - } 74 - 75 - static void general_signal_handler(int signum) { 76 - if (signum >= 0 && signum < 32 && signal_handlers[signum].js != NULL) { 77 - struct js *js = signal_handlers[signum].js; 78 - jsval_t handler = signal_handlers[signum].handler; 79 - 80 - if (js_type(handler) != JS_UNDEF) { 81 - jsval_t sig_num = js_mknum(signum); 82 - jsval_t args[1] = {sig_num}; 83 - js_call(js, handler, args, 1); 84 - } 85 - } 86 - 87 - exit(0); 88 - } 89 - 90 - static jsval_t js_signal(struct js *js, jsval_t *args, int nargs) { 91 - if (nargs < 2) { 92 - fprintf(stderr, "Error: Ant.signal() requires 2 arguments (signal, handler)\n"); 93 - return js_mkundef(); 94 - } 95 - 96 - char *signal_name = js_getstr(js, args[0], NULL); 97 - if (signal_name == NULL) { 98 - return js_mkerr(js, "signal name must be a string"); 99 - } 100 - 101 - int signum = -1; 102 - if (strcmp(signal_name, "SIGINT") == 0 || strcmp(signal_name, "sigint") == 0) { 103 - signum = SIGINT; 104 - } else if (strcmp(signal_name, "SIGTERM") == 0 || strcmp(signal_name, "sigterm") == 0) { 105 - signum = SIGTERM; 106 - } else if (strcmp(signal_name, "SIGHUP") == 0 || strcmp(signal_name, "sighup") == 0) { 107 - signum = SIGHUP; 108 - } else if (strcmp(signal_name, "SIGUSR1") == 0 || strcmp(signal_name, "sigusr1") == 0) { 109 - signum = SIGUSR1; 110 - } else if (strcmp(signal_name, "SIGUSR2") == 0 || strcmp(signal_name, "sigusr2") == 0) { 111 - signum = SIGUSR2; 112 - } else { 113 - return js_mkerr(js, "unsupported signal: %s", signal_name); 114 - } 115 - 116 - signal_handlers[signum].js = js; 117 - signal_handlers[signum].handler = args[1]; 118 - signal(signum, general_signal_handler); 119 - 120 - return js_mkundef(); 121 - } 122 28 123 29 static jsval_t js_require(struct js *js, jsval_t *args, int nargs) { 124 30 if (nargs != 1) return js_mkundef(); ··· 295 201 296 202 struct ant_runtime *rt = ant_runtime_init(js); 297 203 204 + init_builtin_module(); 298 205 init_console_module(); 299 206 init_json_module(); 300 207 init_fetch_module(); 208 + init_server_module(); 301 209 302 210 init_timer_module(js); 303 211 init_crypto_module(js, rt->ant_obj); 304 212 305 - js_set(js, rt->ant_obj, "serve", js_mkfun(js_serve)); 306 213 js_set(js, rt->ant_obj, "require", js_mkfun(js_require)); 307 - js_set(js, rt->ant_obj, "signal", js_mkfun(js_signal)); 308 - js_set(js, rt->ant_obj, "gc", js_mkfun(js_gc_trigger)); 309 - js_set(js, rt->ant_obj, "alloc", js_mkfun(js_alloc)); 310 - js_set(js, rt->ant_obj, "stats", js_mkfun(js_stats_fn)); 311 214 312 215 jsval_t exports_obj = js_mkobj(js); 313 216 js_set(js, rt->ant_obj, "exports", exports_obj);
src/modules/ant.c

This is a binary file and will not be displayed.

+116
src/modules/builtin.c
··· 1 + #include <stdlib.h> 2 + #include <stdio.h> 3 + #include <signal.h> 4 + #include <string.h> 5 + 6 + #include "ant.h" 7 + #include "runtime.h" 8 + #include "modules/builtin.h" 9 + 10 + static struct { 11 + struct js *js; 12 + jsval_t handler; 13 + } signal_handlers[32] = {0}; 14 + 15 + static void general_signal_handler(int signum) { 16 + if (signum >= 0 && signum < 32 && signal_handlers[signum].js != NULL) { 17 + struct js *js = signal_handlers[signum].js; 18 + jsval_t handler = signal_handlers[signum].handler; 19 + 20 + if (js_type(handler) != JS_UNDEF) { 21 + jsval_t sig_num = js_mknum(signum); 22 + jsval_t args[1] = {sig_num}; 23 + js_call(js, handler, args, 1); 24 + } 25 + } 26 + 27 + exit(0); 28 + } 29 + 30 + // Ant.signal(signal, handler) 31 + static jsval_t js_signal(struct js *js, jsval_t *args, int nargs) { 32 + if (nargs < 2) { 33 + fprintf(stderr, "Error: Ant.signal() requires 2 arguments (signal, handler)\n"); 34 + return js_mkundef(); 35 + } 36 + 37 + char *signal_name = js_getstr(js, args[0], NULL); 38 + if (signal_name == NULL) { 39 + return js_mkerr(js, "signal name must be a string"); 40 + } 41 + 42 + int signum = -1; 43 + if (strcmp(signal_name, "SIGINT") == 0 || strcmp(signal_name, "sigint") == 0) { 44 + signum = SIGINT; 45 + } else if (strcmp(signal_name, "SIGTERM") == 0 || strcmp(signal_name, "sigterm") == 0) { 46 + signum = SIGTERM; 47 + } else if (strcmp(signal_name, "SIGHUP") == 0 || strcmp(signal_name, "sighup") == 0) { 48 + signum = SIGHUP; 49 + } else if (strcmp(signal_name, "SIGUSR1") == 0 || strcmp(signal_name, "sigusr1") == 0) { 50 + signum = SIGUSR1; 51 + } else if (strcmp(signal_name, "SIGUSR2") == 0 || strcmp(signal_name, "sigusr2") == 0) { 52 + signum = SIGUSR2; 53 + } else { 54 + return js_mkerr(js, "unsupported signal: %s", signal_name); 55 + } 56 + 57 + signal_handlers[signum].js = js; 58 + signal_handlers[signum].handler = args[1]; 59 + signal(signum, general_signal_handler); 60 + 61 + return js_mkundef(); 62 + } 63 + 64 + // Ant.gc() 65 + static jsval_t js_gc_trigger(struct js *js, jsval_t *args, int nargs) { 66 + (void) args; (void) nargs; 67 + size_t before_brk = js_getbrk(js); 68 + 69 + js_gc(js); 70 + size_t after_brk = js_getbrk(js); 71 + 72 + jsval_t result = js_mkobj(js); 73 + js_set(js, result, "before", js_mknum((double)before_brk)); 74 + js_set(js, result, "after", js_mknum((double)after_brk)); 75 + 76 + return result; 77 + } 78 + 79 + // Ant.alloc() 80 + static jsval_t js_alloc(struct js *js, jsval_t *args, int nargs) { 81 + (void) args; (void) nargs; 82 + 83 + size_t total = 0, min_free = 0, cstack = 0; 84 + js_stats(js, &total, &min_free, &cstack); 85 + 86 + jsval_t result = js_mkobj(js); 87 + js_set(js, result, "used", js_mknum((double)total)); 88 + js_set(js, result, "minFree", js_mknum((double)min_free)); 89 + 90 + return result; 91 + } 92 + 93 + // Ant.stats() 94 + static jsval_t js_stats_fn(struct js *js, jsval_t *args, int nargs) { 95 + (void) args; (void) nargs; 96 + 97 + size_t total = 0, min_free = 0, cstack = 0; 98 + js_stats(js, &total, &min_free, &cstack); 99 + 100 + jsval_t result = js_mkobj(js); 101 + js_set(js, result, "used", js_mknum((double)total)); 102 + js_set(js, result, "minFree", js_mknum((double)min_free)); 103 + js_set(js, result, "cstack", js_mknum((double)cstack)); 104 + 105 + return result; 106 + } 107 + 108 + void init_builtin_module() { 109 + struct js *js = rt->js; 110 + jsval_t ant_obj = rt->ant_obj; 111 + 112 + js_set(js, ant_obj, "gc", js_mkfun(js_gc_trigger)); 113 + js_set(js, ant_obj, "alloc", js_mkfun(js_alloc)); 114 + js_set(js, ant_obj, "stats", js_mkfun(js_stats_fn)); 115 + js_set(js, rt->ant_obj, "signal", js_mkfun(js_signal)); 116 + }
+9 -5
src/modules/server.c
··· 2 2 #include <stdlib.h> 3 3 #include <string.h> 4 4 #include <signal.h> 5 + #include <mongoose.h> 5 6 6 - #include "mongoose.h" 7 + #include "ant.h" 8 + #include "runtime.h" 7 9 #include "modules/server.h" 8 10 #include "modules/timer.h" 9 11 #include "modules/json.h" 10 - #include "ant.h" 11 12 12 13 typedef struct { 13 14 int status; ··· 210 211 211 212 if (res_ctx.sent) { 212 213 char headers[256]; 213 - snprintf(headers, sizeof(headers), "Content-Type: %s\r\n", 214 - res_ctx.content_type ? res_ctx.content_type : "text/plain"); 214 + snprintf(headers, sizeof(headers), "Content-Type: %s\r\n", res_ctx.content_type ? res_ctx.content_type : "text/plain"); 215 215 mg_http_reply(c, res_ctx.status, headers, "%s", res_ctx.body ? res_ctx.body : ""); 216 216 return; 217 217 } 218 218 } 219 219 220 - // If we get here, no response was sent 221 220 if (js_type(result) == JS_ERR) { 222 221 fprintf(stderr, "Handler error: %s\n", js_str(server->js, result)); 223 222 mg_http_reply(c, 500, "Content-Type: text/plain\r\n", "Internal Server Error"); ··· 227 226 } 228 227 } 229 228 229 + // Ant.serve(port, handler) 230 230 jsval_t js_serve(struct js *js, jsval_t *args, int nargs) { 231 231 if (nargs < 1) { 232 232 fprintf(stderr, "Error: Ant.serve() requires at least 1 argument (port)\n"); ··· 273 273 274 274 return js_mknum(1); 275 275 } 276 + 277 + void init_server_module() { 278 + js_set(rt->js, rt->ant_obj, "serve", js_mkfun(js_serve)); 279 + }