summaryrefslogtreecommitdiff
path: root/qjsc.c
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-04-12 12:14:37 +0200
committerFabrice Bellard <fabrice@bellard.org>2025-04-12 12:14:37 +0200
commit67b48ae4e6fadb812334b5836aa4a6e6e46d459b (patch)
tree9f612b2fff9b5009323364c9e20384b9eab86982 /qjsc.c
parentc50de13b1573735c57e918f2739428b82dd2481f (diff)
downloadquickjs-67b48ae4e6fadb812334b5836aa4a6e6e46d459b.tar.gz
quickjs-67b48ae4e6fadb812334b5836aa4a6e6e46d459b.zip
- removed the 'use strip' extension
- removed the JS_EVAL_FLAG_STRIP eval flag and replaced it with JS_SetStripInfo() which has simpler semantics. - qjs: added the '-s' and '--strip-source' options - qjsc: added the '-s' and '--keep-source' options
Diffstat (limited to 'qjsc.c')
-rw-r--r--qjsc.c181
1 files changed, 134 insertions, 47 deletions
diff --git a/qjsc.c b/qjsc.c
index de8ebd1..13e6fa5 100644
--- a/qjsc.c
+++ b/qjsc.c
@@ -352,7 +352,9 @@ void help(void)
"-M module_name[,cname] add initialization code for an external C module\n"
"-x byte swapped output\n"
"-p prefix set the prefix of the generated C names\n"
- "-S n set the maximum stack size to 'n' bytes (default=%d)\n",
+ "-S n set the maximum stack size to 'n' bytes (default=%d)\n"
+ "-s strip all the debug info\n"
+ "--keep-source keep the source code\n",
JS_DEFAULT_STACK_SIZE);
#ifdef CONFIG_LTO
{
@@ -471,6 +473,31 @@ static int output_executable(const char *out_filename, const char *cfilename,
}
#endif
+static size_t get_suffixed_size(const char *str)
+{
+ char *p;
+ size_t v;
+ v = (size_t)strtod(str, &p);
+ switch(*p) {
+ case 'G':
+ v <<= 30;
+ break;
+ case 'M':
+ v <<= 20;
+ break;
+ case 'k':
+ case 'K':
+ v <<= 10;
+ break;
+ default:
+ if (*p != '\0') {
+ fprintf(stderr, "qjs: invalid suffix: %s\n", p);
+ exit(1);
+ }
+ break;
+ }
+ return v;
+}
typedef enum {
OUTPUT_C,
@@ -478,9 +505,24 @@ typedef enum {
OUTPUT_EXECUTABLE,
} OutputTypeEnum;
+static const char *get_short_optarg(int *poptind, int opt,
+ const char *arg, int argc, char **argv)
+{
+ const char *optarg;
+ if (*arg) {
+ optarg = arg;
+ } else if (*poptind < argc) {
+ optarg = argv[(*poptind)++];
+ } else {
+ fprintf(stderr, "qjsc: expecting parameter for -%c\n", opt);
+ exit(1);
+ }
+ return optarg;
+}
+
int main(int argc, char **argv)
{
- int c, i, verbose;
+ int i, verbose, strip_flags;
const char *out_filename, *cname;
char cfilename[1024];
FILE *fo;
@@ -499,6 +541,7 @@ int main(int argc, char **argv)
module = -1;
byte_swap = FALSE;
verbose = 0;
+ strip_flags = JS_STRIP_SOURCE;
use_lto = FALSE;
stack_size = 0;
memset(&dynamic_module_list, 0, sizeof(dynamic_module_list));
@@ -507,30 +550,51 @@ int main(int argc, char **argv)
namelist_add(&cmodule_list, "std", "std", 0);
namelist_add(&cmodule_list, "os", "os", 0);
- for(;;) {
- c = getopt(argc, argv, "ho:cN:f:mxevM:p:S:D:");
- if (c == -1)
- break;
- switch(c) {
- case 'h':
- help();
- case 'o':
- out_filename = optarg;
- break;
- case 'c':
- output_type = OUTPUT_C;
- break;
- case 'e':
- output_type = OUTPUT_C_MAIN;
- break;
- case 'N':
- cname = optarg;
+ optind = 1;
+ while (optind < argc && *argv[optind] == '-') {
+ char *arg = argv[optind] + 1;
+ const char *longopt = "";
+ const char *optarg;
+ /* a single - is not an option, it also stops argument scanning */
+ if (!*arg)
break;
- case 'f':
- {
+ optind++;
+ if (*arg == '-') {
+ longopt = arg + 1;
+ arg += strlen(arg);
+ /* -- stops argument scanning */
+ if (!*longopt)
+ break;
+ }
+ for (; *arg || *longopt; longopt = "") {
+ char opt = *arg;
+ if (opt)
+ arg++;
+ if (opt == 'h' || opt == '?' || !strcmp(longopt, "help")) {
+ help();
+ continue;
+ }
+ if (opt == 'o') {
+ out_filename = get_short_optarg(&optind, opt, arg, argc, argv);
+ break;
+ }
+ if (opt == 'c') {
+ output_type = OUTPUT_C;
+ continue;
+ }
+ if (opt == 'e') {
+ output_type = OUTPUT_C_MAIN;
+ continue;
+ }
+ if (opt == 'N') {
+ cname = get_short_optarg(&optind, opt, arg, argc, argv);
+ break;
+ }
+ if (opt == 'f') {
const char *p;
+ optarg = get_short_optarg(&optind, opt, arg, argc, argv);
p = optarg;
- if (!strcmp(optarg, "lto")) {
+ if (!strcmp(p, "lto")) {
use_lto = TRUE;
} else if (strstart(p, "no-", &p)) {
use_lto = TRUE;
@@ -547,16 +611,18 @@ int main(int argc, char **argv)
fprintf(stderr, "unsupported feature: %s\n", optarg);
exit(1);
}
+ break;
}
- break;
- case 'm':
- module = 1;
- break;
- case 'M':
- {
+ if (opt == 'm') {
+ module = 1;
+ continue;
+ }
+ if (opt == 'M') {
char *p;
char path[1024];
char cname[1024];
+
+ optarg = get_short_optarg(&optind, opt, arg, argc, argv);
pstrcpy(path, sizeof(path), optarg);
p = strchr(path, ',');
if (p) {
@@ -566,25 +632,44 @@ int main(int argc, char **argv)
get_c_name(cname, sizeof(cname), path);
}
namelist_add(&cmodule_list, path, cname, 0);
+ break;
}
- break;
- case 'D':
- namelist_add(&dynamic_module_list, optarg, NULL, 0);
- break;
- case 'x':
- byte_swap = TRUE;
- break;
- case 'v':
- verbose++;
- break;
- case 'p':
- c_ident_prefix = optarg;
- break;
- case 'S':
- stack_size = (size_t)strtod(optarg, NULL);
- break;
- default:
- break;
+ if (opt == 'D') {
+ optarg = get_short_optarg(&optind, opt, arg, argc, argv);
+ namelist_add(&dynamic_module_list, optarg, NULL, 0);
+ break;
+ }
+ if (opt == 'x') {
+ byte_swap = 1;
+ continue;
+ }
+ if (opt == 'v') {
+ verbose++;
+ continue;
+ }
+ if (opt == 'p') {
+ c_ident_prefix = get_short_optarg(&optind, opt, arg, argc, argv);
+ break;
+ }
+ if (opt == 'S') {
+ optarg = get_short_optarg(&optind, opt, arg, argc, argv);
+ stack_size = get_suffixed_size(optarg);
+ break;
+ }
+ if (opt == 's') {
+ strip_flags = JS_STRIP_DEBUG;
+ continue;
+ }
+ if (!strcmp(longopt, "keep-source")) {
+ strip_flags = 0;
+ continue;
+ }
+ if (opt) {
+ fprintf(stderr, "qjsc: unknown option '-%c'\n", opt);
+ } else {
+ fprintf(stderr, "qjsc: unknown option '--%s'\n", longopt);
+ }
+ help();
}
}
@@ -620,6 +705,8 @@ int main(int argc, char **argv)
rt = JS_NewRuntime();
ctx = JS_NewContext(rt);
+ JS_SetStripInfo(rt, strip_flags);
+
/* loader for ES6 modules */
JS_SetModuleLoaderFunc(rt, NULL, jsc_module_loader, NULL);