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:   27-May-2012 21:18:38
  Branch: rpm-5_4                          Handle: 2012052719183700

  Modified files:           (Branch: rpm-5_4)
    rpm/js                  Makefile.am ngsr.c

  Log:
    - ngsr: mimic GPSEE gsr sufficiently well to re-use GPSEE "make check"
    tests.

  Summary:
    Revision    Changes     Path
    1.44.2.3    +52 -1      rpm/js/Makefile.am
    1.8.2.1     +117 -12    rpm/js/ngsr.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/js/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.44.2.2 -r1.44.2.3 Makefile.am
  --- rpm/js/Makefile.am        24 Sep 2011 19:36:11 -0000      1.44.2.2
  +++ rpm/js/Makefile.am        27 May 2012 19:18:37 -0000      1.44.2.3
  @@ -20,6 +20,7 @@
        -I$(top_srcdir)/rpmdb \
        -I$(top_srcdir)/rpmio \
        -I$(top_srcdir)/misc \
  +     @WITH_BEECRYPT_CPPFLAGS@ \
        @WITH_DB_CPPFLAGS@ \
        @WITH_FILE_CPPFLAGS@ \
        @WITH_MOZJS185_CPPFLAGS@ \
  @@ -313,7 +314,57 @@
   lint:
        $(LINT) $(DEFS) $(INCLUDES) $(librpmjs_la_sources)
   
  -check-local: ngsr
  +vg = $(abs_top_builddir)/libtool --mode=execute \
  +     valgrind -v --tool=memcheck \
  +     --leak-check=full --show-reachable=yes --track-origins=yes \
  +     --suppressions="$(abs_top_builddir)/js/.gsr_suppress" \
  +     --gen-suppressions=all
  +
  +gsr =                $(abs_top_builddir)/js/ngsr -ddddddC
  +
  +check-gsr: ngsr
  +     @echo "=== $@ ==="
  +     -$(vg) $(gsr) -c 'print("yadda-yadda")'
  +
  +check-vg:
  +     make -C ../gpsee gsr='$(vg) $(gsr)' check
  +
  +gpsee_tests_dir =    ../gpsee/tests
  +check-binary:        ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/binary" gsr='$(vg) $(gsr)' check
  +check-crashers:      ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/crashers" gsr='$(vg) $(gsr)' check
  +check-error_reporting: ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/error_reporting" gsr='$(vg) $(gsr)' check
  +check-gffi:  ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/gffi" gsr='$(vg) $(gsr)' check
  +check-gpsee-core: ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/gpsee-core" gsr='$(vg) $(gsr)' check
  +check-jit:   ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/jit" gsr='$(vg) $(gsr)' check
  +check-modules:       ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/modules" gsr='$(vg) $(gsr)' check
  +check-net:   ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/net" gsr='$(vg) $(gsr)' check
  +check-shellalike: ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/shellalike" gsr='$(vg) $(gsr)' check
  +check-system:        ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/system" gsr='$(vg) $(gsr)' check
  +check-warnings:      ngsr
  +     @echo "=== $@ ==="
  +     make -C "$(gpsee_tests_dir)/system" gsr='$(vg) $(gsr)' check
  +
  +check-local: check-gsr
   
   .PHONY:      lcov-reset      # run lcov from scratch, always
   lcov-reset:
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/js/ngsr.c
  ============================================================================
  $ cvs diff -u -r1.8 -r1.8.2.1 ngsr.c
  --- rpm/js/ngsr.c     12 Sep 2010 21:23:30 -0000      1.8
  +++ rpm/js/ngsr.c     27 May 2012 19:18:37 -0000      1.8.2.1
  @@ -24,6 +24,7 @@
   static const char * Icode;   /* String with JavaScript program in it */
   static const char * Ifn;     /* Filename with JavaScript program in it */
   static int verbosity;                /* 0 = no debug, bigger = more debug */
  +static int gcZeal;
   
   /*==============================================================*/
   
  @@ -51,6 +52,12 @@
        js->flags |= RPMJS_FLAGS_SKIPSHEBANG;
        Ifn = xstrdup(arg);
        break;
  +    case 'z':
  +        gcZeal++;
  +        break;
  +    case 'd':
  +        rpmIncreaseVerbosity();
  +        break;
       default:
        fprintf(stderr, _("%s: Unknown option -%c\n"), __progname, opt->val);
        poptPrintUsage(con, stderr, 0);
  @@ -75,6 +82,10 @@
           N_("Display this help"), NULL },
     { "noexec", 'n', POPT_BIT_SET,     &_rpmjs.flags, RPMJS_FLAGS_NOEXEC,
        N_("Engine will load and parse, but not run, the script"), NULL },
  +  { NULL, 'z', 0, NULL, (int)'z',
  +     N_("Increase GC Zealousness"), NULL},
  +  { NULL, 'd', 0, NULL, (int)'d',
  +     N_("Provide more detailed output"), NULL},
   
     POPT_TABLEEND
   };
  @@ -87,10 +98,10 @@
           rpmjsArgCallback, 0, NULL, NULL },
   /*@=type@*/
   
  -  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, _gsrOptionsTable, 0,
  + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, _gsrOptionsTable, 0,
           N_("Command options:"), NULL },
   
  -  { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmjsIPoptTable, 0,
  + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmjsIPoptTable, 0,
           N_("JS interpreter options:"), NULL },
   
    { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioAllPoptTable, 0,
  @@ -103,11 +114,52 @@
   
   static struct poptOption *optionsTable = &_optionsTable[0];
   /*==============================================================*/
  +static int _gsrExitCode(rpmjs js)
  +{
  +    gpsee_interpreter_t *I = js->I;
  +    const char *reason = NULL;
  +    int ec = 1;
   
  -int main(int argc, char *argv[])
  +    if (I->grt->exitType & et_successMask) {
  +     ec = I->grt->exitCode;
  +     goto exit;
  +    }
  +
  +    switch (I->grt->exitType) {
  +    case et_successMask:
  +    case et_errorMask:
  +    case et_requested:
  +    case et_finished:
  +    case et_dummy:
  +    default:
  +     reason = N_("impossible");
  +     GPSEE_NOT_REACHED(reason);
  +     break;
  +    case et_execFailure:
  +     reason = N_("execFailure - probable native module error, returning 
JS_FALSE without setting exception");
  +     break;
  +    case et_compileFailure:
  +     reason = N_("script could not be compiled");
  +     break;
  +    case et_unknown:
  +     reason = N_("unknown - probable native module error, returning JS_FALSE 
without setting exception");
  +     break;
  +    case et_exception:
  +     reason = NULL;
  +     goto exit;
  +     /*@notreached@*/ break;
  +    }
  +
  +    rpmlog(RPMLOG_NOTICE, _("Unexpected interpreter shutdown: %s(%m)"), 
reason);
  +
  +exit:
  +    return ec;
  +}
  +
  +static int _main(int argc, char *argv[])
   {
       poptContext optCon;
  -    rpmjs js;
  +    rpmjs js = NULL;
       char *const * Iargv = NULL;      /* Becomes arguments array in JS 
program */
       const char * result = NULL;
       int ac = 0;
  @@ -165,6 +217,20 @@
       if (gpsee_verbosity(0) < verbosity)
        gpsee_setVerbosity(verbosity);
   
  +    /* XXX set from macro? */
  +#ifdef       REFERENCE
  +#ifdef JSFEATURE_GC_ZEAL
  +    if (JS_HasFeature(JSFEATURE_GC_ZEAL) == JS_TRUE)
  +     JS_SetGCZeal(I->cx, gcZeal);
  +#else
  +# ifdef JS_GC_ZEAL
  +    JS_SetGCZeal(I->cx, gcZeal);
  +# else
  +#  warning JS_SetGCZeal not available when building with this version of 
SpiderMonkey (try a debug build?)
  +# endif
  +#endif
  +#endif       /* REFERENCE */
  +
       /* Run JavaScript specified with -c */
       if (Icode) {
        const char * result = NULL;
  @@ -198,6 +264,7 @@
            if (!gpsee_compileScript(I->cx, preloadfn,
                        NULL, NULL, &script, I->realm->globalObject, &scrobj))
            {
  +             I->grt->exitType = et_compileFailure;
                rpmlog(RPMLOG_EMERG,
                          "%s: Unable to compile preload script '%s'\n",
                          __progname, preloadfn);
  @@ -211,8 +278,10 @@
   
            if (!F_ISSET(js->flags, NOEXEC)) {
                JS_AddNamedObjectRoot(I->cx, &scrobj, "preload_scrobj");
  +             I->grt->exitType = et_execFailure;
                if (JS_ExecuteScript(I->cx, I->realm->globalObject, script, &v) 
== JS_FALSE)
  -             {
  +                 I->grt->exitType = et_finished;
  +             else {
                    if (JS_IsExceptionPending(I->cx))
                        I->grt->exitType = et_exception;
                    JS_ReportPendingException(I->cx);
  @@ -231,25 +300,48 @@
       JS_SetOptions(I->cx, JS_GetOptions(I->cx) | 
JSOPTION_DONT_REPORT_UNCAUGHT);
   
       if (Ifn == NULL) {
  -     ec = Icode ? 0 : 1;
  +     if (Icode == NULL)
  +         goto finish;        /* XXX gsr does usage() here */
  +
  +     if (I->grt->exitType == et_unknown)
  +         I->grt->exitType = et_finished;
        goto finish;
       }
   
       /* Run (pre-compiled) JavaScript specified with -f */
       if (ac != 0)     /* XXX FIXME */
  -         js->flags |= RPMJS_FLAGS_SKIPSHEBANG;
  +     js->flags |= RPMJS_FLAGS_SKIPSHEBANG;
   
       ret = rpmjsRunFile(js, Ifn, Iargv, &result);
       switch (ret) {
       default:
  -     rpmlog(RPMLOG_NOTICE, "%s: Unable to open' script '%s'! (%s)\n",
  +    {        int code = gpsee_getExceptionExitCode(I->cx);
  +     if (code >= 0) {        /** e.g. throw 6 */
  +assert(I->grt->exitType == et_requested);
  +assert(I->grt->exitCode == code);
  +         I->grt->exitType = et_requested;
  +         I->grt->exitCode = code;
  +     } else
  +     if (JS_IsExceptionPending(I->cx)) {
  +assert(I->grt->exitType == et_exception);
  +         I->grt->exitType = et_exception;
  +         gpsee_reportUncaughtException(I->cx, JSVAL_NULL,
  +                                        (gpsee_verbosity(0) >= 
GSR_FORCE_STACK_DUMP_VERBOSITY) ||
  +                                        ((gpsee_verbosity(0) >= 
GPSEE_ERROR_OUTPUT_VERBOSITY) && isatty(STDERR_FILENO)));
  +     } else {
  +assert(I->grt->exitType == et_execFailure);
  +         I->grt->exitType = et_execFailure;
  +         rpmlog(RPMLOG_NOTICE, "%s: Unable to open' script '%s'! (%s)\n",
                      __progname, Ifn, result);
  +     }
        result = _free(result);
  -     ec = ((int)ret < 0 ? -ret : ret);
  -     break;
  +    }        break;
       case RPMRC_OK:
  +#ifdef       NOTYET          /* XXX FIXME */
  +assert(I->grt->exitType == et_finished);
  +#endif
  +     I->grt->exitType = et_finished;
        /* XXX print result? */
  -     ec = ret;
        break;
       }
   
  @@ -257,9 +349,13 @@
   #ifdef GPSEE_DEBUGGER
       gpsee_finiDebugger(jsdc);
   #endif
  -    js = rpmjsFree(js);
  +
  +    /* XXX Map the exit code identically to gsr. */
  +    ec = _gsrExitCode(js);
   
   exit:
  +    js = rpmjsFree(js);
  +
       Icode = _free(Icode);
       Ifn = _free(Ifn);
   
  @@ -268,6 +364,13 @@
       return ec;
   }
   
  +int main(int argc, char *argv[])
  +{
  +  int ec = PR_Initialize(_main, argc, argv, 0);
  +  (void) PR_Cleanup();
  +  return ec;
  +}
  +
   #ifdef GPSEE_DEBUGGER
   /**
    *  Entry point for native-debugger debugging. Set this function as a break 
point
  @@ -279,3 +382,5 @@
       return;
   }
   #endif
  +
  +
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to