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