RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmio/ rpmjs.c rpmjs.h

From: Jeff Johnson <jbj@rpm5.org>
Date: Sun 12 Sep 2010 - 23:26:48 CEST
Message-Id: <20100912212648.70F62C11A3@rpm5.org>
  RPM Package Manager, CVS Repository
  /cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   12-Sep-2010 23:26:48
  Branch: HEAD                             Handle: 2010091221264701

  Modified files:
    rpm                     CHANGES
    rpm/rpmio               rpmjs.c rpmjs.h

  Log:
    - rpmjs: resecusitate sufficiently to use with jx/ngsr.c. more todo++.

  Summary:
    Revision    Changes     Path
    1.3441      +1  -0      rpm/CHANGES
    1.35        +137 -63    rpm/rpmio/rpmjs.c
    1.10        +6  -0      rpm/rpmio/rpmjs.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3440 -r1.3441 CHANGES
  --- rpm/CHANGES	10 Sep 2010 17:39:16 -0000	1.3440
  +++ rpm/CHANGES	12 Sep 2010 21:26:47 -0000	1.3441
  @@ -1,4 +1,5 @@
   5.3.3 -> 5.4a1:
  +    - jbj: rpmjs: resecusitate sufficiently to use with jx/ngsr.c. more todo++.
       - eveith: Fix ruby include paths
       - rpm.org: git-v1:339f31face44d877c3a6e2fc780e740e7e236eae.
       - jbj: rpmrepo: refactor the methods that don't need/use a header.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmjs.c
  ============================================================================
  $ cvs diff -u -r1.34 -r1.35 rpmjs.c
  --- rpm/rpmio/rpmjs.c	8 Mar 2010 22:24:07 -0000	1.34
  +++ rpm/rpmio/rpmjs.c	12 Sep 2010 21:26:48 -0000	1.35
  @@ -45,23 +45,19 @@
   extern char ** environ;
   #endif
   
  -#ifdef	WITH_JS
  -
  +#if defined(WITH_GPSEE)
   #define	XP_UNIX	1
   #include "jsprf.h"
   #include "jsapi.h"
   
  -#if defined(WITH_GPSEE)
   #include <gpsee.h>
   typedef	gpsee_interpreter_t * JSI_t;
  -#endif
  -
   #define	_RPMJS_OPTIONS	\
       (JSOPTION_STRICT | JSOPTION_RELIMIT | JSOPTION_ANONFUNFIX | JSOPTION_JIT)
  -#else
  +#else	/* WITH_GPSEE */
   typedef void * JSI_t;
   #define	_RPMJS_OPTIONS	0
  -#endif
  +#endif	/* WITH_GPSEE */
   
   #define _RPMJS_INTERNAL
   #include "rpmjs.h"
  @@ -82,34 +78,34 @@
   /*@unchecked@*/
   int _rpmjs_zeal = 2;
   
  -struct rpmjs_s _rpmgsr;
  +struct rpmjs_s _rpmjs;
   
   struct poptOption rpmjsIPoptTable[] = {
  -  { "allow", 'a', POPT_BIT_SET,		&_rpmgsr.flags, RPMJS_FLAGS_ALLOW,
  +  { "allow", 'a', POPT_BIT_SET,		&_rpmjs.flags, RPMJS_FLAGS_ALLOW,
           N_("Allow (read-only) access to caller's environmen"), NULL },
  -  { "nocache", 'C', POPT_BIT_SET,	&_rpmgsr.flags, RPMJS_FLAGS_NOCACHE,
  +  { "nocache", 'C', POPT_BIT_SET,	&_rpmjs.flags, RPMJS_FLAGS_NOCACHE,
           N_("Disables compiler caching via JSScript XDR serialization"), NULL },
  -  { "loadrc", 'R', POPT_BIT_SET,	&_rpmgsr.flags, RPMJS_FLAGS_LOADRC,
  +  { "loadrc", 'R', POPT_BIT_SET,	&_rpmjs.flags, RPMJS_FLAGS_LOADRC,
           N_("Load RC file for interpreter based on script filename."), NULL },
  -  { "nowarn", 'W', POPT_BIT_SET,	&_rpmgsr.flags, RPMJS_FLAGS_NOWARN,
  +  { "nowarn", 'W', POPT_BIT_SET,	&_rpmjs.flags, RPMJS_FLAGS_NOWARN,
           N_("Do not report warnings"), NULL },
   
  -  { "norelimit", 'e', POPT_BIT_CLR,	&_rpmgsr.flags, RPMJS_FLAGS_RELIMIT,
  +  { "norelimit", 'e', POPT_BIT_CLR,	&_rpmjs.flags, RPMJS_FLAGS_RELIMIT,
           N_("Do not limit regexps to n^3 levels of backtracking"), NULL },
  -  { "nojit", 'J', POPT_BIT_CLR,		&_rpmgsr.flags, RPMJS_FLAGS_JIT,
  +  { "nojit", 'J', POPT_BIT_CLR,		&_rpmjs.flags, RPMJS_FLAGS_JIT,
           N_("Disable nanojit"), NULL },
  -  { "nostrict", 'S', POPT_BIT_CLR,	&_rpmgsr.flags, RPMJS_FLAGS_STRICT,
  +  { "nostrict", 'S', POPT_BIT_CLR,	&_rpmjs.flags, RPMJS_FLAGS_STRICT,
           N_("Disable Strict mode"), NULL },
  -  { "noutf8", 'U', POPT_BIT_SET,	&_rpmgsr.flags, RPMJS_FLAGS_NOUTF8,
  +  { "noutf8", 'U', POPT_BIT_SET,	&_rpmjs.flags, RPMJS_FLAGS_NOUTF8,
           N_("Disable UTF-8 C string processing"), NULL },
  -  { "xml", 'x', POPT_BIT_SET,		&_rpmgsr.flags, RPMJS_FLAGS_XML,
  +  { "xml", 'x', POPT_BIT_SET,		&_rpmjs.flags, RPMJS_FLAGS_XML,
           N_("Parse <!-- comments --> as E4X tokens"), NULL },
   
  -  { "anonfunfix", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,	&_rpmgsr.flags, RPMJS_FLAGS_ANONFUNFIX,
  +  { "anonfunfix", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,	&_rpmjs.flags, RPMJS_FLAGS_ANONFUNFIX,
           N_("Parse //@line number [\"filename\"] for XUL"), NULL },
  -  { "atline", 'A', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,	&_rpmgsr.flags, RPMJS_FLAGS_ATLINE,
  +  { "atline", 'A', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,	&_rpmjs.flags, RPMJS_FLAGS_ATLINE,
           N_("Parse //@line number [\"filename\"] for XUL"), NULL },
  -  { "werror", 'w', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,	&_rpmgsr.flags, RPMJS_FLAGS_WERROR,
  +  { "werror", 'w', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,	&_rpmjs.flags, RPMJS_FLAGS_WERROR,
           N_("Convert warnings to errors"), NULL },
   
     POPT_TABLEEND
  @@ -175,6 +171,7 @@
       static char *const _empty[] = { NULL };
       char *const * Iargv = (av ? (char *const *)av : _empty);
       char *const * Ienviron = NULL;
  +
       if (flags == 0)
   	flags = _rpmjs_options;
   
  @@ -191,18 +188,22 @@
   #endif
       }
   
  -    I = gpsee_createInterpreter(Iargv, Ienviron);
  -
  +    /* XXX FIXME: js->Iargv/js->Ienviron for use by rpmjsRunFile() */
  +    I = gpsee_createInterpreter();
  +#ifdef	NOTYET	/* FIXME: dig out where NOCACHE has moved. */
       if (F_ISSET(flags, NOCACHE))
   	I->useCompilerCache = 0;
  -    if (F_ISSET(flags, NOWARN))
  -	I->errorReport = er_noWarnings;
  +#endif
  +    if (F_ISSET(flags, NOWARN)) {
  +	gpsee_runtime_t * grt = JS_GetRuntimePrivate(JS_GetRuntime(I->cx));
  +	grt->errorReport |= er_noWarnings;
  +    }
   
       JS_SetOptions(I->cx, (flags & 0xffff));
   #if defined(JS_GC_ZEAL)
       JS_SetGCZeal(I->cx, _rpmjs_zeal);
   #endif
  -#endif
  +#endif	/* WITH_GPSEE */
   
       js->flags = flags;
       js->I = I;
  @@ -210,7 +211,6 @@
       return rpmjsLink(js);
   }
   
  -#if defined(WITH_JS)
   #if defined(WITH_GPSEE)
   static FILE * rpmjsOpenFile(rpmjs js, const char * fn, const char ** msgp)
   	/*@modifies js @*/
  @@ -239,15 +239,23 @@
   	
   	if (fgets(buf, sizeof(buf), fp)) {
   	    if (!(buf[0] == '#' && buf[1] == '!')) {
  +		/* XXX FIXME: return through *msgp */
   		rpmlog(RPMLOG_WARNING, "%s: %s: no \'#!\' on 1st line\n",
   			__FUNCTION__, fn);
   		rewind(fp);
   	    } else {
  +#ifdef	NOTYET	/* XXX FIXME */
   		I->linenoOffset += 1;
  +#endif	/* NOTYET */
   		do {	/* consume entire first line, regardless of length */
   		    if (strchr(buf, '\n'))
   			break;
   		} while (fgets(buf, sizeof(buf), fp));
  +		/*
  +		 * Make spidermonkey think the script starts with a blank line,
  +		 * to keep line numbers in sync.
  +		 */
  +		ungetc('\n', fp);
   	    }
   	}
       }
  @@ -259,56 +267,123 @@
   
       return fp;
   }
  +
  +#ifdef	NOTYET	/* XXX FIXME */
  +static void processInlineFlags(rpmjs js, FILE * fp, signed int *verbosity_p)
  +{
  +    char buf[256];
  +    off_t offset;
  +
  +    offset = ftello(fp);
  +
  +    while (fgets(buf, sizeof(buf), fp)) {
  +	char *s, *e;
  +
  +	if ((buf[0] != '/') || (buf[1] != '/'))
  +	    break;
  +
  +	for (s = buf + 2; *s == ' ' || *s == '\t'; s++);
  +	if (strncmp(s, "gpsee:", 6) != 0)
  +	    continue;
  +
  +	for (s = s + 6; *s == ' ' || *s == '\t'; s++);
  +
  +	for (e = s; *e; e++) {
  +	    switch (*e) {
  +	    case '\r':
  +	    case '\n':
  +	    case '\t':
  +	    case ' ':
  +		*e = '\0';
  +		break;
  +	    }
  +	}
  +
  +	if (s[0])
  +	    processFlags(gsr, s, verbosity_p);
  +    }
  +
  +    fseeko(fp, offset, SEEK_SET);
  +}
  +#endif	/* NOTYET */
   #endif	/* WITH_GPSEE */
  -#endif	/* WITH_JS */
   
  -rpmRC rpmjsRunFile(rpmjs js, const char * fn, const char ** resultp)
  +rpmRC rpmjsRunFile(rpmjs js, const char * fn,
  +		char *const * Iargv,
  +		const char ** resultp)
   {
       rpmRC rc = RPMRC_FAIL;
   
       if (js == NULL) js = rpmjsI();
   
       if (fn != NULL) {
  -#if defined(WITH_JS)
   #if defined(WITH_GPSEE)
   	gpsee_interpreter_t * I = js->I;
  -	FILE * fp;
  +	FILE * fp = rpmjsOpenFile(js, fn, resultp);
   
  -	fp = rpmjsOpenFile(js, fn, resultp);
  -	if (fp == NULL)
  +	if (fp == NULL) {
  +	    /* XXX FIXME: strerror in *reultp */
   	    goto exit;
  +	}
   
  -	gpsee_runProgramModule(I->cx, fn, fp);
  -	(void) fclose(fp);
  -	/* XXX hack tp get I->exitCode into rc -> ec by negating */
  -	rc = ((I->exitType & et_successMask) == I->exitType)
  -		? -I->exitCode : RPMRC_FAIL;
  -#else
  -	JSI_t I = js->I;
  -	JSContext *cx = I->cx;
  -	JSObject *glob = I->globalObj;
  -	JSScript *script = JS_CompileFile(cx, glob, fn);
  -	jsval rval;
  +#ifdef	NOTYET	/* XXX FIXME */
  +	processInlineFlags(js, fp, &verbosity);
  +	gpsee_setVerbosity(verbosity);
  +#endif
   
  -	if (script) {
  -	    if (JS_ExecuteScript(cx, glob, script, &rval)) {
  +	/* Just compile and exit? */
  +	if (F_ISSET(js->flags, NOEXEC)) {
  +	    JSScript *script = NULL;
  +	    JSObject *scrobj = NULL;
  +
  +	    if (!gpsee_compileScript(I->cx, fn,
  +			fp, NULL, &script, I->realm->globalObject, &scrobj))
  +	    {
  +		/* XXX FIXME: isatty(3) */
  +		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
   		rc = RPMRC_OK;
  -		if (resultp) {
  -		    JSString *rstr = JS_ValueToString(cx, rval);
  -		    *resultp = JS_GetStringBytes(rstr);
  -		}
  +	} else {
  +	    char *const * Ienviron;
  +
  +	    if (F_ISSET(js->flags, ALLOW)) {
  +#if defined(__APPLE__)
  +		Ienviron = (char *const *) _NSGetEnviron();
  +#else
  +		Ienviron = environ;
  +#endif
   	    }
  -	    JS_DestroyScript(cx, script);
  +
  +	    if (!gpsee_runProgramModule(I->cx, fn,
  +			NULL, fp, Iargv, Ienviron))
  +	    {
  +		int code = gpsee_getExceptionExitCode(I->cx);
  +		if (code >= 0) {
  +		    /* XXX FIXME: format and return code in *resultp. */
  +		    /* XXX hack tp get code into rc -> ec by negating */
  +		    rc = -code;
  +		} else {
  +		    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
  +		rc = RPMRC_OK;
   	}
  +	fclose(fp);
  +	fp = NULL;
   #endif	/* WITH_GPSEE */
  -#endif	/* WITH_JS */
       }
   
  -#if defined(WITH_JS)
   #if defined(WITH_GPSEE)
   exit:
   #endif	/* WITH_GPSEE */
  -#endif	/* WITH_JS */
   
   if (_rpmjs_debug)
   fprintf(stderr, "<== %s(%p,%s) rc %d\n", __FUNCTION__, js, fn, rc);
  @@ -323,23 +398,22 @@
       if (js == NULL) js = rpmjsI();
   
       if (str != NULL) {
  -#if defined(WITH_JS)
  -	JSI_t I = js->I;
  -	JSContext *cx = I->cx;
  -	JSObject *glob = I->globalObj;
  -	jsval rval = JSVAL_VOID;
  +#if defined(WITH_GPSEE)
  +	gpsee_interpreter_t * I = js->I;
  +	jsval v = JSVAL_VOID;
   	JSBool ok;
   
  -	ok = JS_EvaluateScript(cx, glob, str, strlen(str),
  -					__FILE__, __LINE__, &rval);
  -	if (ok && !JS_IsExceptionPending(I->cx)) {
  +	ok = JS_EvaluateScript(I->cx, I->realm->globalObject, str, strlen(str),
  +					__FILE__, __LINE__, &v);
  +	if (ok) {
   	    rc = RPMRC_OK;
   	    if (resultp) {
  -		JSString *rstr = JS_ValueToString(cx, rval);
  +		JSString *rstr = JS_ValueToString(I->cx, v);
   		*resultp = JS_GetStringBytes(rstr);
   	    }
   	}
  -#endif
  +	v = JSVAL_NULL;
  +#endif	/* WITH_GPSEE */
       }
   
   if (_rpmjs_debug)
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmjs.h
  ============================================================================
  $ cvs diff -u -r1.9 -r1.10 rpmjs.h
  --- rpm/rpmio/rpmjs.h	7 Apr 2010 03:20:06 -0000	1.9
  +++ rpm/rpmio/rpmjs.h	12 Sep 2010 21:26:48 -0000	1.10
  @@ -63,6 +63,10 @@
       int nrefs;			/*!< (unused) keep splint happy */
   #endif
   };
  +
  +/*@unchecked@*/
  +struct rpmjs_s _rpmjs;
  +
   #endif /* _RPMJS_INTERNAL */
   
   #ifdef __cplusplus
  @@ -118,10 +122,12 @@
    * Execute js from a file.
    * @param js		js interpreter (NULL uses global interpreter)
    * @param fn		js file to run (NULL returns RPMRC_FAIL)
  + * @param Iargv		js script argv
    * @param *resultp	js exec result
    * @return		RPMRC_OK on success
    */
   rpmRC rpmjsRunFile(rpmjs js, /*@null@*/ const char * fn,
  +		/*@null@*/ char *const * Iargv,
   		/*@null@*/ const char ** resultp)
   	/*@globals fileSystem, internalState @*/
   	/*@modifies js, fileSystem, internalState @*/;
  @@ .
Received on Sun Sep 12 23:26:48 2010
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.