RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 10-Jul-2017 16:22:00 Branch: rpm-5_4 Handle: 2017071014215900 Modified files: (Branch: rpm-5_4) rpm/rpmio rpmjss.cpp rpmjss.h Log: - rpmjss: parse options/arguments. Summary: Revision Changes Path 1.1.2.2 +534 -163 rpm/rpmio/rpmjss.cpp 1.1.2.6 +5 -5 rpm/rpmio/rpmjss.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/rpmjss.cpp ============================================================================ $ cvs diff -u -r1.1.2.1 -r1.1.2.2 rpmjss.cpp --- rpm/rpmio/rpmjss.cpp 10 Jul 2017 09:42:51 -0000 1.1.2.1 +++ rpm/rpmio/rpmjss.cpp 10 Jul 2017 14:21:59 -0000 1.1.2.2 @@ -366,8 +366,10 @@ // Start the engine. if (rpmjss_nopens++ == 0) { - MaybeOverrideOutFileFromEnv("JS_STDERR", stderr, &gErrFile); - MaybeOverrideOutFileFromEnv("JS_STDOUT", stdout, &gOutFile); + if (gErrFile == NULL) + MaybeOverrideOutFileFromEnv("JS_STDERR", stderr, &gErrFile); + if (gOutFile == NULL) + MaybeOverrideOutFileFromEnv("JS_STDOUT", stdout, &gOutFile); #ifdef JS_CODEGEN_X86 if (!(jss->xf & XF_FPU)) @@ -411,6 +413,7 @@ JSRuntime * rt = JS_NewRuntime(_maxbytes, nurseryBytes); assert(rt); +assert(I->rt == NULL); I->rt = rt; #ifdef DYING @@ -462,6 +465,7 @@ JSContext * cx = NewContext(rt); assert(cx); +assert(I->cx == NULL); I->cx = cx; #ifdef DYING JS_SetContextPrivate(cx, (void *)jss); @@ -494,6 +498,7 @@ options.setVersion(JSVERSION_DEFAULT); glob = NewGlobalObject(cx, options, _principals); assert(glob); +assert(I->global == NULL); I->global = glob; JSAutoCompartment ac(cx, glob); @@ -568,323 +573,365 @@ static struct JSIO_s _mozjs45 = { mozFini, mozInit, mozRun }; JSIO_t mozjs45 = &_mozjs45; +#ifdef DYING /*==============================================================*/ struct rpmjss_s _jss; rpmjss jss = &_jss; +#endif /*==============================================================*/ -struct poptOption rpmjssIPoptTable[] = { +static rpmjssFlags rpmjssFlagsDefault = (rpmjssFlags) ( + RPMJSS_FLAGS_RELIMIT | + RPMJSS_FLAGS_JIT | + RPMJSS_FLAGS_STRICT | + 0 +); + +static rpmjssIonFlags rpmjssIonFlagsDefault = (rpmjssIonFlags) ( + ION_SCALAR_REPLACEMENT | + ION_GVN | + ION_LICM | + ION_EDGECASE_ANALYSIS | + ION_RANGE_ANALYSIS | + ION_INLINING | + ION_OSR | + ION_LIMIT_SCRIPT_SIZE | + ION_OFFTHREAD_COMPILE | + 0 +); + +static rpmjssXFlags rpmjssXFlagsDefault = (rpmjssXFlags) ( + XF_BASELINE | + XF_ION | + XF_ASMJS | + XF_NATIVE_REGEXP | + XF_UNBOXED_OBJECTS | + XF_CACHE_PER_PROCESS | + XF_FPU | + XF_SSE3 | + XF_SSE4 | + XF_THREADS | + XF_GGC | + XF_CGC | + XF_INCREMENTAL_GC | + 0 +); + +/*==============================================================*/ +static rpmRC +rpmjssInitPopt(rpmjss jss, int ac, char * const* av) +{ + + struct poptOption rpmjssIPoptTable[] = { { "allow", '\0', POPT_BIT_SET, - &_jss.flags, RPMJSS_FLAGS_ALLOW, + &jss->flags, RPMJSS_FLAGS_ALLOW, N_("Allow (read-only) access to caller's environment"), NULL }, { "cache", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.flags, RPMJSS_FLAGS_NOCACHE, + &jss->flags, RPMJSS_FLAGS_NOCACHE, N_("Disables compiler caching via JSScript XDR serialization"), NULL }, { "loadrc", '\0', POPT_BIT_SET, - &_jss.flags, RPMJSS_FLAGS_LOADRC, + &jss->flags, RPMJSS_FLAGS_LOADRC, N_("Load RC file for interpreter based on script filename."), NULL }, { "warn", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.flags, RPMJSS_FLAGS_NOWARN, + &jss->flags, RPMJSS_FLAGS_NOWARN, N_("Do not report warnings"), NULL }, { "relimit", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.flags, RPMJSS_FLAGS_RELIMIT, + &jss->flags, RPMJSS_FLAGS_RELIMIT, N_("Do not limit regexps to n^3 levels of backtracking"), NULL }, { "jit", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.flags, RPMJSS_FLAGS_JIT, + &jss->flags, RPMJSS_FLAGS_JIT, N_("Disable nanojit"), NULL }, { "strict", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.flags, RPMJSS_FLAGS_STRICT, + &jss->flags, RPMJSS_FLAGS_STRICT, N_("Disable Strict mode"), NULL }, { "utf8", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.flags, RPMJSS_FLAGS_NOUTF8, + &jss->flags, RPMJSS_FLAGS_NOUTF8, N_("Disable UTF-8 C string processing"), NULL }, { "xml", '\0', POPT_BIT_SET, - &_jss.flags, RPMJSS_FLAGS_XML, + &jss->flags, RPMJSS_FLAGS_XML, N_("Parse <!-- comments --> as E4X tokens"), NULL }, { "anonfunfix", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, - &_jss.flags, RPMJSS_FLAGS_ANONFUNFIX, + &jss->flags, RPMJSS_FLAGS_ANONFUNFIX, N_("Parse //@line number [\"filename\"] for XUL"), NULL }, { "atline", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, - &_jss.flags, RPMJSS_FLAGS_ATLINE, + &jss->flags, RPMJSS_FLAGS_ATLINE, N_("Parse //@line number [\"filename\"] for XUL"), NULL }, { "werror", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, - &_jss.flags, RPMJSS_FLAGS_WERROR, + &jss->flags, RPMJSS_FLAGS_WERROR, N_("Convert warnings to errors"), NULL }, - POPT_TABLEEND -}; - -struct poptOption rpmjssIonPoptTable[] = { + POPT_TABLEEND + }; + struct poptOption rpmjssIonPoptTable[] = { #ifdef NOTYET { "ion-shared-stubs", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_SHARED_STUBS, + &jss->ionf, ION_SHARED_STUBS, N_("Use shared stubs (default: off)"), NULL }, { "ion-scalar-replacement", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_SCALAR_REPLACEMENT, + &jss->ionf, ION_SCALAR_REPLACEMENT, N_("Scalar replacement (default: on)"), NULL }, { "ion-gvn", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_GVN, + &jss->ionf, ION_GVN, N_("Global value numbering (default: on)"), NULL }, { "ion-licm", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_LICM, + &jss->ionf, ION_LICM, N_("Loop invariant code motion (default: on)"), NULL }, { "ion-edgecase-analysis", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_EDGECASE_ANALYSIS, + &jss->ionf, ION_EDGECASE_ANALYSIS, N_("Find edge cases where Ion can avoid bailouts (default: off)"), NULL }, { "ion-pgo", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_PGO, + &jss->ionf, ION_PGO, N_("Profile guided optimization (default: off)"), NULL }, { "ion-range-analysis", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_RANGE_ANALYSIS, + &jss->ionf, ION_RANGE_ANALYSIS, N_("Range analysis (default: on)"), NULL }, { "ion-sincos", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_SINCOS, + &jss->ionf, ION_SINCOS, N_("Replace sin(x)/cos(x) to sincos(x) (default: on)"), NULL }, { "ion-sink", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_SINK, + &jss->ionf, ION_SINK, N_("Sink code motion (default: off)"), NULL }, { "ion-loop-unrolling", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_LOOP_UNROLLING, + &jss->ionf, ION_LOOP_UNROLLING, N_("Loop unrolling (default: off)"), NULL }, { "ion-instruction-reordering", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_INSTRUCTION_REORDERING, + &jss->ionf, ION_INSTRUCTION_REORDERING, N_("Instruction reordering (default: off)"), NULL }, #else { "ion-shared-stubs", '\0', POPT_ARG_STRING, - &_jss.ion_shared_stubs, 0, + &jss->ion_shared_stubs, 0, N_("Use shared stubs (default: off)"), NULL }, { "ion-scalar-replacement", '\0', POPT_ARG_STRING, - &_jss.ion_scalar_replacement, 0, + &jss->ion_scalar_replacement, 0, N_("Scalar replacement (default: on)"), NULL }, { "ion-gvn", '\0', POPT_ARG_STRING, - &_jss.ion_gvn, 0, + &jss->ion_gvn, 0, N_("Global value numbering (default: on)"), NULL }, { "ion-licm", '\0', POPT_ARG_STRING, - &_jss.ion_licm, 0, + &jss->ion_licm, 0, N_("Loop invariant code motion (default: on)"), NULL }, { "ion-edgecase-analysis", '\0', POPT_ARG_STRING, - &_jss.ion_edgecase_analysis, 0, + &jss->ion_edgecase_analysis, 0, N_("Find edge cases where Ion can avoid bailouts (default: off)"), NULL }, { "ion-pgo", '\0', POPT_ARG_STRING, - &_jss.ion_pgo, 0, + &jss->ion_pgo, 0, N_("Profile guided optimization (default: off)"), NULL }, { "ion-range-analysis", '\0', POPT_ARG_STRING, - &_jss.ion_range_analysis, 0, + &jss->ion_range_analysis, 0, N_("Range analysis (default: on)"), NULL }, { "ion-sincos", '\0', POPT_ARG_STRING, - &_jss.ion_sincos, 0, + &jss->ion_sincos, 0, N_("Replace sin(x)/cos(x) to sincos(x) (default: on)"), NULL }, { "ion-sink", '\0', POPT_ARG_STRING, - &_jss.ion_sink, 0, + &jss->ion_sink, 0, N_("Sink code motion (default: off)"), NULL }, { "ion-loop-unrolling", '\0', POPT_ARG_STRING, - &_jss.ion_loop_unrolling, 0, + &jss->ion_loop_unrolling, 0, N_("Loop unrolling (default: off)"), NULL }, { "ion-instruction-reordering", '\0', POPT_ARG_STRING, - &_jss.ion_instruction_reordering, 0, + &jss->ion_instruction_reordering, 0, N_("Instruction reordering (default: off)"), NULL }, #endif { "ion-check-range-analysis", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_CHECK_RANGE_ANALYSIS, + &jss->ionf, ION_CHECK_RANGE_ANALYSIS, N_("Range analysis checking (default: off)"), NULL }, { "ion-extra-checks", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_EXTRA_CHECKS, + &jss->ionf, ION_EXTRA_CHECKS, N_("Perform extra dynamic validation checks (default: off)"), NULL }, #ifdef NOTYET { "ion-inlining", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_INLINING, + &jss->ionf, ION_INLINING, N_("Inline methods where possible (default: on)"), NULL }, { "ion-osr", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_OSR, + &jss->ionf, ION_OSR, N_("On-Stack Replacement(default: on)"), NULL }, { "ion-limit-script-size", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_LIMIT_SCRIPT_SIZE, + &jss->ionf, ION_LIMIT_SCRIPT_SIZE, N_("Don't compile large scripts(default: on)"), NULL }, #else { "ion-inlining", '\0', POPT_ARG_STRING, - &_jss.ion_inlining, 0, + &jss->ion_inlining, 0, N_("Inline methods where possible (default: on)"), NULL }, { "ion-osr", '\0', POPT_ARG_STRING, - &_jss.ion_osr, 0, + &jss->ion_osr, 0, N_("On-Stack Replacement(default: on)"), NULL }, { "ion-limit-script-size", '\0', POPT_ARG_STRING, - &_jss.ion_limit_script_size, 0, + &jss->ion_limit_script_size, 0, N_("Don't compile large scripts(default: on)"), NULL }, #endif { "ion-warmup-threshold", '\0', POPT_ARG_INT, - &_jss.ion_warmup_threshold, 0, + &jss->ion_warmup_threshold, 0, N_("Wait COUNT calls/iterations before compiling"), N_("COUNT") }, { "ion-regalloc", '\0', POPT_ARG_STRING, - &_jss.ion_regalloc, 0, + &jss->ion_regalloc, 0, N_("Specify Ion register allocation MODE"), N_("MODE") }, { "ion-eager", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_EAGER, + &jss->ionf, ION_EAGER, N_("Always ion-compile methods (default: on)"), NULL }, #ifdef NOTYET { "ion-offthread-compile", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.ionf, ION_OFFTHREAD_COMPILE, + &jss->ionf, ION_OFFTHREAD_COMPILE, N_("Compile scripts off thread (default: on)"), NULL }, #else { "ion-offthread-compile", '\0', POPT_ARG_STRING, - &_jss.ion_offthread_compile, 0, + &jss->ion_offthread_compile, 0, N_("Compile scripts off thread (default: on)"), NULL }, #endif - POPT_TABLEEND -}; - -struct poptOption rpmjssOptionsTable[] = { - { "file", 'f', POPT_ARG_STRING, &_jss.Ifile, 0, + POPT_TABLEEND + }; + struct poptOption rpmjssOptionsTable[] = { + { "file", 'f', POPT_ARG_STRING, &jss->Ifile, 0, N_("File PATH to run"), N_("PATH") }, - { "module", 'm', POPT_ARG_STRING, &_jss.Imodule, 0, + { "module", 'm', POPT_ARG_STRING, &jss->Imodule, 0, N_("Module PATH to run"), N_("PATH") }, - { "execute", 'e', POPT_ARG_STRING, &_jss.Icode, 0, + { "execute", 'e', POPT_ARG_STRING, &jss->Icode, 0, N_("Inline CODE to run"), N_("CODE") }, - { "shell", 'i', POPT_BIT_SET, &_jss.xf, XF_INTERACTIVE, + { "shell", 'i', POPT_BIT_SET, &jss->xf, XF_INTERACTIVE, N_("Enter prompt after running code"), NULL }, - { "compileonly", 'c', POPT_BIT_SET, &_jss.xf, XF_COMPILE_ONLY, + { "compileonly", 'c', POPT_BIT_SET, &jss->xf, XF_COMPILE_ONLY, N_("Only compile, don't run (syntax checking mode)"), NULL }, /* XXX collision on -w? */ - { "warnings", 'w', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &_jss.xf, XF_WARNINGS, + { "warnings", 'w', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &jss->xf, XF_WARNINGS, N_("Emit warnings"), NULL }, - { "strict", 's', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &_jss.xf, XF_STRICT, + { "strict", 's', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &jss->xf, XF_STRICT, N_("Check strictness"), NULL }, - { "dump-bytecode", 'D', POPT_BIT_SET, &_jss.xf, XF_DUMP_BYTECODE, + { "dump-bytecode", 'D', POPT_BIT_SET, &jss->xf, XF_DUMP_BYTECODE, N_("Dump bytecode with exec count for all scripts"), NULL }, - { "print-timing", 'b', POPT_BIT_SET, &_jss.xf, XF_PRINT_TIMING, + { "print-timing", 'b', POPT_BIT_SET, &jss->xf, XF_PRINT_TIMING, N_("Dump bytecode with exec count for all scripts"), NULL }, - { "js-cache", '\0', POPT_ARG_STRING, &_jss.cachedir, 0, + { "js-cache", '\0', POPT_ARG_STRING, &jss->cachedir, 0, N_("Enable JS caching in DIR"), N_("DIR") }, { "js-cache-per-process",'\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_CACHE_PER_PROCESS, + &jss->xf, XF_CACHE_PER_PROCESS, N_("Deactivate per-process caching"), NULL }, - { "code-coverage", '\0', POPT_BIT_SET, &_jss.xf, XF_CODE_COVERAGE, + { "code-coverage", '\0', POPT_BIT_SET, &jss->xf, XF_CODE_COVERAGE, N_("Enable code coverage insturmentation"), NULL }, { "ion", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_ION, + &jss->xf, XF_ION, N_("Disable IonMonkey"), NULL }, { "asmjs", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_ASMJS, + &jss->xf, XF_ASMJS, N_("Disable asm.js compilation"), NULL }, { "native-regexp", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_NATIVE_REGEXP, + &jss->xf, XF_NATIVE_REGEXP, N_("Disable native regexp compilation"), NULL }, { "unboxed-objects", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_UNBOXED_OBJECTS, + &jss->xf, XF_UNBOXED_OBJECTS, N_("Disable creating unboxed plain objects"), NULL }, { "unboxed-arrays", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_UNBOXED_ARRAYS, + &jss->xf, XF_UNBOXED_ARRAYS, N_("Allow creating unboxed arrays"), NULL }, - { "print-alloc", 'O', POPT_BIT_SET, &_jss.xf, XF_PRINT_ALLOC, + { "print-alloc", 'O', POPT_BIT_SET, &jss->xf, XF_PRINT_ALLOC, N_("Print no. of allocatsions at exit"), NULL }, - { "script", '\0', POPT_ARG_STRING, &_jss.script_path, 0, + { "script", '\0', POPT_ARG_STRING, &jss->script_path, 0, N_("Script PATH to run"), N_("PATH") }, - { "scriptArgs", '\0', POPT_ARG_STRING, &_jss.script_args, 0, + { "scriptArgs", '\0', POPT_ARG_STRING, &jss->script_args, 0, N_("Script args to bind as |scriptArgs| in global"), N_("XXX") }, - { "thread-count", '\0', POPT_ARG_INT, &_jss.thread_count, 0, + { "thread-count", '\0', POPT_ARG_INT, &jss->thread_count, 0, N_("Use COUNT auxiliary threads"), N_("COUNT") }, { "baseline", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_BASELINE, + &jss->xf, XF_BASELINE, N_("Enable baseline compiler (default: on)"), NULL }, { "baseline-eager", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_BASELINE_EAGER, + &jss->xf, XF_BASELINE_EAGER, N_("Always baseline-compile methods"), NULL }, { "baseline-warmup-threshold", '\0', POPT_ARG_INT, - &_jss.baseline_warmup_threshold, 0, + &jss->baseline_warmup_threshold, 0, N_("Wait COUNT calls/iterations before baseline-compiling"), N_("COUNT") }, { "non-writable-jitcode", '\0', POPT_BIT_SET, - &_jss.xf, XF_NONWRITABLE_JITCODE, + &jss->xf, XF_NONWRITABLE_JITCODE, N_("Allocate JIT code as non-writable memory"), NULL }, #ifdef JS_CODEGEN_X86 { "fpu", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_FPU, + &jss->xf, XF_FPU, N_("Assume CPU has a FPU"), NULL }, #endif { "sse3", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_SSE3, + &jss->xf, XF_SSE3, N_("Assume CPU has SSE3 instructions"), NULL }, { "sse4", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_SSE4, + &jss->xf, XF_SSE4, N_("Assume CPU has SSE4 instructions"), NULL }, { "avx", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_AVX, + &jss->xf, XF_AVX, N_("Assume CPU has AVX instructions"), NULL }, { "enable-avx", '\0', POPT_BIT_SET, - &_jss.xf, XF_AVX, + &jss->xf, XF_AVX, N_("Assume CPU has AVX instructions"), NULL }, { "fuzzing-safe", '\0', POPT_BIT_SET, - &_jss.xf, XF_FUZZING_SAFE, + &jss->xf, XF_FUZZING_SAFE, N_("Don't expose unsafe functions (when fuzzing)"), NULL }, { "disable-oom-functions", '\0', POPT_BIT_SET, - &_jss.xf, XF_DISABLE_OOM, + &jss->xf, XF_DISABLE_OOM, N_("Disable functions that trigger OOM"), NULL }, { "threads", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_THREADS, + &jss->xf, XF_THREADS, N_("Disable helper threads"), NULL }, #ifdef DEBUG { "dump-entrained-variables", '\0', POPT_BIT_SET, - &_jss.xf, XF_DISABLE_OOM, + &jss->xf, XF_DISABLE_OOM, N_("Print variables entrained by inner functions"), NULL }, #endif { "ggc", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_GGC, + &jss->xf, XF_GGC, N_("Disable Generational GC"), NULL }, { "cgc", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_CGC, + &jss->xf, XF_CGC, N_("Disable Compacting GC"), NULL }, { "incremental-gc", '\0', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, - &_jss.xf, XF_INCREMENTAL_GC, + &jss->xf, XF_INCREMENTAL_GC, N_("Disable Incremental GC"), NULL }, - { "available-memory", '\0', POPT_ARG_INT, &_jss.available_memory, 0, + { "available-memory", '\0', POPT_ARG_INT, &jss->available_memory, 0, N_("Select GC settings based on SIZE-MB"), N_("SIZE-MB") }, #if defined(JS_CODEGEN_ARM) - { "arm-hwcap", '\0', POPT_ARG_STRING, &_jss.arm_hwcap, 0, + { "arm-hwcap", '\0', POPT_ARG_STRING, &jss->arm_hwcap, 0, N_("Specify ARM code generation FEATURES"), N_("FEATURES") }, - { "arm-asm-nop-fill", '\0', POPT_ARG_INT, &_jss.arm_asm_nop_fill, 0, + { "arm-asm-nop-fill", '\0', POPT_ARG_INT, &jss->arm_asm_nop_fill, 0, N_("Insert N NOP instructions in pool"), N_("N") }, - { "asm-pool-max-offset", '\0', POPT_ARG_INT, &_jss.asm_pool_max_offset, 0, + { "asm-pool-max-offset", '\0', POPT_ARG_INT, &jss->asm_pool_max_offset, 0, N_("Max PC-relative OFFSET in pool"), N_("OFFSET") }, #endif #if defined(JS_SIMULATOR_ARM) { "arm-sim-icache-checks", '\0', POPT_BIT_SET, - &_jss.xf, XF_ARM_SIM_ICACHE_CHECKS, + &jss->xf, XF_ARM_SIM_ICACHE_CHECKS, N_("(ARM) Enable icache flush checks"), NULL }, - { "arm-sim-stop-at", '\0', POPT_ARG_INT, &_jss.arm_sim_stop_at, 0, + { "arm-sim-stop-at", '\0', POPT_ARG_INT, &jss->arm_sim_stop_at, 0, N_("(ARM) Stop simulator after N instructions"), N_("N") }, #endif #if defined(JS_SIMULATOR_MIPS32) || defined(JS_SIMULATOR_MIPS64) { "mips-sim-icache-checks", '\0', POPT_BIT_SET, - &_jss.xf, XF_MIPS_SIM_ICACHE_CHECKS, + &jss->xf, XF_MIPS_SIM_ICACHE_CHECKS, N_("(MIPS) Enable icache flush checks"), NULL }, - { "mips-sim-stop-at", '\0', POPT_ARG_INT, &_jss.mips_sim_stop_at, 0, + { "mips-sim-stop-at", '\0', POPT_ARG_INT, &jss->mips_sim_stop_at, 0, N_("(MIPS) Stop simulator after N instructions"), N_("N") }, #endif - { "nursery-size", '\0', POPT_ARG_INT, &_jss.nursery_size, 0, + { "nursery-size", '\0', POPT_ARG_INT, &jss->nursery_size, 0, N_("Set nursery SIZE-MB"), N_("SIZE-MB") }, #ifdef JS_GC_ZEAL - { "gc-zeal", '\0', POPT_ARG_STRING, &_jss.gc_zeal, 0, + { "gc-zeal", '\0', POPT_ARG_STRING, &jss->gc_zeal, 0, N_("Set GC zeal to LEVEL"), N_("LEVEL") }, #endif - { "module-load-path", '\0', POPT_ARG_STRING, &_jss.moduledir, 0, + { "module-load-path", '\0', POPT_ARG_STRING, &jss->moduledir, 0, N_("Load modules from DIR"), N_("DIR") }, { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmjssIPoptTable, 0, @@ -896,87 +943,411 @@ { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioAllPoptTable, 0, N_("Common options for all rpmio executables:"), NULL }, - POPT_AUTOALIAS - POPT_AUTOHELP - POPT_TABLEEND -}; + POPT_AUTOHELP -static rpmjssFlags _flagsDefault = (rpmjssFlags) ( - RPMJSS_FLAGS_RELIMIT | - RPMJSS_FLAGS_JIT | - RPMJSS_FLAGS_STRICT | - 0 -); + { NULL, (char)-1, POPT_ARG_INCLUDE_TABLE, NULL, 0, + "\ +Usage: js [options] [[script] scriptArgs*]\n\ +\n\ + The SpiderMonkey shell provides a command line interface to the \n\ + JavaScript engine. Code and file options provided via the command \n\ + line are run left to right. If provided, the optional script argument \n\ + is run after all options have been processed. Just-In-Time \n\ + compilation modes may be enabled via command line options.\n\ +\n\ +Version: JavaScript-C45.9.0\n\ +\n\ +Arguments:\n\ + script A script to execute (after all options)\n\ + scriptArgs String arguments to bind as |scriptArgs| in the shell's global\n\ +\n\ +Options:\n\ + -f --file=PATH File path to run\n\ + -m --module=PATH Module path to run\n\ + -e --execute=CODE Inline code to run\n\ + -i --shell Enter prompt after running code\n\ + -c --compileonly Only compile, don't run (syntax checking \n\ + mode)\n\ + -w --warnings Emit warnings\n\ + -W --nowarnings Don't emit warnings\n\ + -s --strict Check strictness\n\ + -D --dump-bytecode Dump bytecode with exec count for all \n\ + scripts\n\ + -b --print-timing Print sub-ms runtime for each file that's \n\ + run\n\ + --js-cache=[path] Enable the JS cache by specifying the path \n\ + of the directory to use to hold cache \n\ + files\n\ + --no-js-cache-per-process Deactivates cache per process. Otherwise, \n\ + generate a separate cachesub-directory for \n\ + this process inside the cache \n\ + directoryspecified by --js-cache. This \n\ + cache directory will be removedwhen the js \n\ + shell exits. This is useful for running \n\ + tests inparallel.\n\ + --code-coverage Enable code coverage instrumentation.\n\ + --thread-count=COUNT Use COUNT auxiliary threads (default: # of \n\ + cores - 1)\n\ + --ion Enable IonMonkey (default)\n\ + --no-ion Disable IonMonkey\n\ + --no-asmjs Disable asm.js compilation\n\ + --no-native-regexp Disable native regexp compilation\n\ + --no-unboxed-objects Disable creating unboxed plain objects\n\ + --unboxed-arrays Allow creating unboxed arrays\n\ + --ion-shared-stubs=on/off Use shared stubs (default: off, on to \n\ + enable)\n\ + --ion-scalar-replacement=on/off Scalar Replacement (default: on, off to \n\ + disable)\n\ + --ion-gvn=[mode] Specify Ion global value numbering:\n\ + off: disable GVN\n\ + on: enable GVN (default)\n\ + \n\ + --ion-licm=on/off Loop invariant code motion (default: on, \n\ + off to disable)\n\ + --ion-edgecase-analysis=on/off Find edge cases where Ion can avoid \n\ + bailouts (default: on, off to disable)\n\ + --ion-pgo=on/off Profile guided optimization (default: off, \n\ + on to enable)\n\ + --ion-range-analysis=on/off Range analysis (default: on, off to \n\ + disable)\n\ + --ion-sincos=on/off Replace sin(x)/cos(x) to sincos(x) \n\ + (default: off, on to enable)\n\ + --ion-sink=on/off Sink code motion (default: off, on to \n\ + enable)\n\ + --ion-loop-unrolling=on/off Loop unrolling (default: off, on to \n\ + enable)\n\ + --ion-instruction-reordering=on/off Instruction reordering (default: off, on \n\ + to enable)\n\ + --ion-check-range-analysis Range analysis checking\n\ + --ion-extra-checks Perform extra dynamic validation checks\n\ + --ion-inlining=on/off Inline methods where possible (default: \n\ + on, off to disable)\n\ + --ion-osr=on/off On-Stack Replacement (default: on, off to \n\ + disable)\n\ + --ion-limit-script-size=on/off Don't compile very large scripts (default: \n\ + on, off to disable)\n\ + --ion-warmup-threshold=COUNT Wait for COUNT calls or iterations before \n\ + compiling (default: 1000)\n\ + --ion-regalloc=[mode] Specify Ion register allocation:\n\ + backtracking: Priority based \n\ + backtracking register allocation (default)\n\ + testbed: Backtracking allocator with \n\ + experimental features\n\ + stupid: Simple block local register \n\ + allocation\n\ + --ion-eager Always ion-compile methods (implies \n\ + --baseline-eager)\n\ + --ion-offthread-compile=on/off Compile scripts off thread (default: on)\n\ + --ion-parallel-compile=on/off --ion-parallel compile is deprecated. Use \n\ + --ion-offthread-compile.\n\ + --baseline Enable baseline compiler (default)\n\ + --no-baseline Disable baseline compiler\n\ + --baseline-eager Always baseline-compile methods\n\ + --baseline-warmup-threshold=COUNT Wait for COUNT calls or iterations before \n\ + baseline-compiling (default: 10)\n\ + --non-writable-jitcode Allocate JIT code as non-writable memory.\n\ + --no-fpu Pretend CPU does not support \n\ + floating-point operations to test JIT \n\ + codegen (no-op on platforms other than \n\ + x86).\n\ + --no-sse3 Pretend CPU does not support SSE3 \n\ + instructions and above to test JIT codegen \n\ + (no-op on platforms other than x86 and \n\ + x64).\n\ + --no-sse4 Pretend CPU does not support SSE4 \n\ + instructionsto test JIT codegen (no-op on \n\ + platforms other than x86 and x64).\n\ + --enable-avx AVX is disabled by default. Enable AVX. \n\ + (no-op on platforms other than x86 and \n\ + x64).\n\ + --no-avx No-op. AVX is currently disabled by \n\ + default.\n\ + --fuzzing-safe Don't expose functions that aren't safe \n\ + for fuzzers to call\n\ + --disable-oom-functions Disable functions that cause artificial \n\ + OOMs\n\ + --no-threads Disable helper threads\n\ + --no-ggc Disable Generational GC\n\ + --no-cgc Disable Compacting GC\n\ + --no-incremental-gc Disable Incremental GC\n\ + --available-memory=SIZE Select GC settings based on available \n\ + memory (MB)\n\ + --nursery-size=SIZE-MB Set the maximum nursery size in MB\n\ + --module-load-path=DIR Set directory to load modules from\n\ +", NULL }, + + POPT_TABLEEND + }; + + static int _popt_context_flags = 0; /* XXX POPT_CONTEXT_POSIXMEHARDER */ + poptContext con = NULL; + int r; + rpmRC rc = RPMRC_FAIL; /* assume failure */ + int xx; + + /* Parse JSShell options. */ + con = poptGetContext(av[0], ac, (const char **)av, + rpmjssOptionsTable, _popt_context_flags); + if (ac > 1) + while ((xx = poptGetNextOpt(con)) > 0) + switch (xx) { + default: + fprintf(stderr, _("%s: option table misconfigured (%d)\n"), + __FUNCTION__, xx); + goto exit; + break; + } -static rpmjssIonFlags _ionfDefault = (rpmjssIonFlags) ( - ION_SCALAR_REPLACEMENT | - ION_GVN | - ION_LICM | - ION_EDGECASE_ANALYSIS | - ION_RANGE_ANALYSIS | - ION_INLINING | - ION_OSR | - ION_LIMIT_SCRIPT_SIZE | - ION_OFFTHREAD_COMPILE | - 0 -); + jss->av = NULL; + r = argvAppend(&jss->av, poptGetArgs(con)); + jss->ac = argvCount(jss->av); -static rpmjssXFlags _xfDefault = (rpmjssXFlags) ( - XF_BASELINE | - XF_ION | - XF_ASMJS | - XF_NATIVE_REGEXP | - XF_UNBOXED_OBJECTS | - XF_CACHE_PER_PROCESS | - XF_FPU | - XF_SSE3 | - XF_SSE4 | - XF_THREADS | - XF_GGC | - XF_CGC | - XF_INCREMENTAL_GC | - 0 -); +#ifdef NOTYET + jss->nsubcmds = argvCount(jss->subcmds); + jss->njobs = 0; + int ncmdfiles = argvCount(jss->cmdfiles); + + /* Use av[0] as pattern if no -e/-f commands. */ + if (jss->nsubcmds == 0 && ncmdfiles == 0 && jss->ac >= 2) { + xx = argvAdd(&jss->subcmds, jss->av[0]); + jss->nsubcmds++; + for (int i = 1; i < jss->ac; i++) + jss->av[i-1] = jss->av[i]; + jss->av[--jss->ac] = NULL; + } + + /* Append commands from files. */ + if (jss->cmdfiles) + for (int i = 0; i < ncmdfiles; i++) { + const char * fn = jss->cmdfiles[i]; + FD_t ifd = Fopen(fn, "r.fpio"); + if (ifd == NULL || Ferror(ifd)) { + fprintf(stderr, _("Fopen(%s, \"r.fpio\") failed\n"), fn); + goto exit; + } + xx = argvFgets(&jss->subcmds, ifd, 0); + xx = Fclose(ifd); + ifd = NULL; + } + + /* Check usage */ + if (jss->nsubcmds == 0) { + poptPrintUsage(con, stderr, 0); + goto exit; + } +#endif + rc = RPMRC_OK; + +exit: + if (con) + con = poptFreeContext(con); + +SPEW("<-- %s(%p,%p[%d]) rc %d\n", __FUNCTION__, jss, av, ac, rc); + return rc; +} + +static rpmRC rpmjssSetup(rpmjss jss, int ac, char ** av, unsigned flags) +{ + rpmRC rc; + + /* Set expected JSShell defaults. */ + jss->flags = rpmjssFlagsDefault; + jss->thread_count = -1; + jss->ion_warmup_threshold = -1; + jss->baseline_warmup_threshold = -1; + jss->ion_warmup_threshold = -1; + jss->available_memory = 0; + jss->arm_asm_nop_fill = 0; + jss->asm_pool_max_offset = 1024; + jss->arm_sim_stop_at = -1; + jss->mips_sim_stop_at = -1; + jss->nursery_size = 16; + jss->ionf = rpmjssIonFlagsDefault; + jss->xf = rpmjssXFlagsDefault; + + /* Parse JSShell options. */ + rc = rpmjssInitPopt(jss, ac, (char *const *)av); + if (rc) + goto exit; + +#ifdef NOTYET + /* Compile the job(s) */ + rc = rpmjssCompile(jss); + if (rc) + goto exit; + + /* Use stdin if no arguments supplied. */ + if (jss->ac == 0) { + xx = argvAdd(&jss->av, "-"); + jss->ac++; + } +#endif + + rc = RPMRC_OK; + +exit: +SPEW("<-- %s(%p,%p[%d],0x%x) rc %d\n", __FUNCTION__, jss, av, ac, flags, rc); + return rc; +} /*==============================================================*/ +static char * rpmjssDbug(void *_jss, char *b, size_t nb) +{ + rpmjss jss = (rpmjss) _jss; + size_t len = strlen(b); + char * be = b + len; + + if (jss) { + int colorize = isatty(fileno(stderr)); +#define ANSI_BRIGHT_BLUE "\x1b[34;1m" +#define ANSI_RESET "\x1b[0m" + *be++ = '\n'; + if (colorize) be = stpcpy(be, ANSI_BRIGHT_BLUE); + be += sprintf(be, "========================== jss(%p)\n", jss); +#define PRINT(_fmt, _foo) \ + { be += sprintf(be, "%25s: %"#_fmt"\n", #_foo, jss->_foo); } +#define XPRINT(_fmt, _foo) if (jss->_foo) PRINT(_fmt, _foo) + + PRINT(x, flags); + + XPRINT(s, Ifile); + XPRINT(s, Imodule); + XPRINT(s, Icode); + XPRINT(s, cachedir); + XPRINT(s, moduledir); + + XPRINT(s, script_path); + XPRINT(s, script_args); + + XPRINT(s, ion_shared_stubs); + XPRINT(s, ion_scalar_replacement); + XPRINT(s, ion_gvn); + XPRINT(s, ion_licm); + XPRINT(s, ion_edgecase_analysis); + XPRINT(s, ion_pgo); + XPRINT(s, ion_range_analysis); + XPRINT(s, ion_sincos); + XPRINT(s, ion_sink); + XPRINT(s, ion_loop_unrolling); + XPRINT(s, ion_instruction_reordering); + XPRINT(s, ion_inlining); + XPRINT(s, ion_osr); + XPRINT(s, ion_limit_script_size); + XPRINT(s, ion_offthread_compile); + XPRINT(s, ion_regalloc); + PRINT(d, ion_warmup_threshold); + + PRINT(x, ionf); + PRINT(x, xf); + + PRINT(d, thread_count); + PRINT(d, baseline_warmup_threshold); + + PRINT(u, available_memory); + PRINT(u, nursery_size); + +#if defined(JS_CODEGEN_ARM) + XPRINT(s, arm_hwcap); + PRINT(u, arm_asm_nop_fill); + PRINT(u, asm_pool_max_offset); +#endif + +#if defined(JS_SIMULATOR_ARM) + PRINT(u, arm_sim_stop_at); +#endif +#if defined(JS_SIMULATOR_MIPS32) || defined(JS_SIMULATOR_MIPS64) + PRINT(u, mips_sim_stop_at); +#endif + +#ifdef JS_GC_ZEAL + XPRINT(s, gc_zeal); +#endif + +#undef XPRINT +#undef PRINT + be--; + if (colorize) be = stpcpy(be, ANSI_RESET); + *be = '\0'; + } + return b; +}; + +static void rpmjssInit(void *_jss) +{ + rpmjss jss = (rpmjss) _jss; + + /* Set expected JSShell defaults. */ + jss->flags = rpmjssFlagsDefault; + jss->thread_count = -1; + jss->ion_warmup_threshold = -1; + jss->baseline_warmup_threshold = -1; + jss->ion_warmup_threshold = -1; + jss->available_memory = 0; + jss->arm_asm_nop_fill = 0; + jss->asm_pool_max_offset = 1024; + jss->arm_sim_stop_at = -1; + jss->mips_sim_stop_at = -1; + jss->nursery_size = 16; + jss->ionf = rpmjssIonFlagsDefault; + jss->xf = rpmjssXFlagsDefault; +} + static void rpmjssFini(void * _jss) { rpmjss jss = (rpmjss) _jss; + jss->av = argvFree(jss->av); + mozFini(jss); + jss->I = NULL; } -#define rpmjssDbug NULL -#define rpmjssInit NULL RPMIOPOOL_INTERP_MODULE(jss) +#ifdef NOTYET +static const char * _rpmjssI_init = "\ +print('_rpmjssI_init');\n\ +version();\n\ +"; +#endif + rpmjss rpmjssNew(char ** av, uint32_t flags) { + static const char * _av[] = { (char *) "rpmjss", NULL }; + int ac = argvCount((ARGV_t)av); + int initialize (!(flags & 0x80000000) || _rpmjssI == NULL); +SPEW("==> %s(%p[%u], 0x%x)\n", __FUNCTION__, av, ac, flags); rpmjss jss = #ifdef NOTYET - (flags & 0x80000000) ? rpmjsI() : + (flags & 0x80000000) ? rpmjssI() : #endif rpmjssGetPool(_rpmjssPool); - jss->flags = _flagsDefault; - jss->thread_count = -1; - jss->ion_warmup_threshold = -1; - jss->baseline_warmup_threshold = -1; - jss->ion_warmup_threshold = -1; - jss->available_memory = 0; - jss->arm_asm_nop_fill = 0; - jss->asm_pool_max_offset = 1024; - jss->arm_sim_stop_at = -1; - jss->mips_sim_stop_at = -1; - jss->nursery_size = 16; - jss->ionf = _ionfDefault; - jss->xf = _xfDefault; + if (av == NULL) av = (char **) _av; + + /* Parse JSShell options. */ + if (initialize) { + rpmRC rc = rpmjssSetup(jss, ac, av, flags); + (void)rc; + + /* Initialize JSShell interpreter. */ + JSI_t I = (JSI_t) mozInit(jss); + jss->I = I; - /* XXX parse arguments */ +#ifdef NOTYET + /* XXX TODO: rpmjssInfo() spewage on first open. */ + + static const char _jssI_init[] = "%{?_jssI_init}"; + const char * s = rpmExpand(_rpmjssI_init, _jssI_init, NULL); +SPEW("==========\n%s\n==========\n", s); + + /* XXX TODO: plant argv in the JSShell interpreter */ - JSI_t I = (JSI_t) mozInit(jss); - jss->I = I; + (void) rpmjssRun(jss, s, NULL); + s = _free(s); +#endif + } return rpmjssLink(jss); } @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmjss.h ============================================================================ $ cvs diff -u -r1.1.2.5 -r1.1.2.6 rpmjss.h --- rpm/rpmio/rpmjss.h 10 Jul 2017 09:38:54 -0000 1.1.2.5 +++ rpm/rpmio/rpmjss.h 10 Jul 2017 14:21:59 -0000 1.1.2.6 @@ -14,10 +14,6 @@ extern rpmjss _rpmjssI; -extern uint32_t _rpmjss_options; - -extern int _rpmjss_zeal; - #if defined(_RPMJSS_INTERNAL) /** * Interpreter flags. @@ -122,7 +118,11 @@ struct rpmjss_s { struct rpmioItem_s _item; /*!< usage mutex and pool identifier. */ - uint32_t flags; /*!< JSOPTION_FOO in 0xffff bits */ + + rpmjssFlags flags; /*!< JSOPTION_FOO in 0xffff bits */ + ARGV_t av; + int ac; + JSIO_t jsio; void * I; /*!< JS interpreter {rt, cx, globalObj} */ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org