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

Reply via email to