[prev in list] [next in list] [prev in thread] [next in thread] 

List:       rpm-cvs
Subject:    [CVS] RPM: rpm/js/ rpmmacro-js.c rpmmacro-js.h rpmps-js.c tjs.c rpm/js...
From:       "Jeff Johnson" <jbj () rpm5 ! org>
Date:       2009-04-28 15:13:36
Message-ID: 20090428151336.DC2314F09 () rpm5 ! org
[Download RAW message or body]

  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   28-Apr-2009 17:13:36
  Branch: HEAD                             Handle: 2009042815133600

  Added files:
    rpm/js                  rpmmacro-js.c rpmmacro-js.h
    rpm/js/tscripts         Macro.js
  Modified files:
    rpm/js                  rpmps-js.c tjs.c

  Log:
    - js: Macro: add a macro.expand() method.

  Summary:
    Revision    Changes     Path
    1.1         +277 -0     rpm/js/rpmmacro-js.c
    1.1         +26 -0      rpm/js/rpmmacro-js.h
    1.7         +2  -2      rpm/js/rpmps-js.c
    1.20        +1  -1      rpm/js/tjs.c
    1.1         +21 -0      rpm/js/tscripts/Macro.js
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/js/rpmmacro-js.c
  ============================================================================
  $ cvs diff -u -r0 -r1.1 rpmmacro-js.c
  --- /dev/null	2009-04-28 17:13:00 +0200
  +++ rpmmacro-js.c	2009-04-28 17:13:36 +0200
  @@ -0,0 +1,277 @@
  +/** \ingroup js_c
  + * \file js/rpmmacro-js.c
  + */
  +
  +#include "system.h"
  +
  +#include "rpmmacro-js.h"
  +#include "rpmjs-debug.h"
  +
  +#include <rpmmacro.h>
  +
  +#include "debug.h"
  +
  +/*@unchecked@*/
  +static int _debug = 0;
  +
  +typedef	void ** rpmmacro;
  +
  +/* --- helpers */
  +
  +/* --- Object methods */
  +static JSBool
  +rpmmacro_expand(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval \
*rval)  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +    char * s;
  +    char * t;
  +    JSString *valstr;
  +    JSBool ok = JS_FALSE;
  +
  +if (_debug)
  +fprintf(stderr, "==> %s(%p,%p,%p[%u],%p) ptr %p\n", __FUNCTION__, cx, obj, argv, \
(unsigned)argc, rval, ptr);  +
  +    if (!(ok = JS_ConvertArguments(cx, argc, argv, "s", &s)))
  +        goto exit;
  +
  +    t = rpmExpand(s, NULL);
  +    if ((valstr = JS_NewStringCopyZ(cx, t)) == NULL)
  +	goto exit;
  +    t = _free(t);
  +    *rval = STRING_TO_JSVAL(valstr);
  +
  +    ok = JS_TRUE;
  +exit:
  +    return ok;
  +}
  +
  +static JSFunctionSpec rpmmacro_funcs[] = {
  +    {"expand",	rpmmacro_expand,		0,0,0},
  +    JS_FS_END
  +};
  +
  +/* --- Object properties */
  +enum rpmmacro_tinyid {
  +    _DEBUG	= -2,
  +};
  +
  +static JSPropertySpec rpmmacro_props[] = {
  +    {"debug",	_DEBUG,		JSPROP_ENUMERATE,	NULL,	NULL},
  +    {NULL, 0, 0, NULL, NULL}
  +};
  +
  +static JSBool
  +rpmmacro_addprop(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +_PROP_DEBUG_ENTRY(_debug < 0);
  +    return JS_TRUE;
  +}
  +
  +static JSBool
  +rpmmacro_delprop(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +_PROP_DEBUG_ENTRY(_debug < 0);
  +    return JS_TRUE;
  +}
  +
  +static JSBool
  +rpmmacro_getprop(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +    jsint tiny = JSVAL_TO_INT(id);
  +    /* XXX the class has ptr == NULL, instances have ptr != NULL. */
  +    JSBool ok = (ptr ? JS_FALSE : JS_TRUE);
  +
  +    switch (tiny) {
  +    case _DEBUG:
  +	*vp = INT_TO_JSVAL(_debug);
  +	ok = JS_TRUE;
  +	break;
  +    default:
  +	break;
  +    }
  +
  +    if (!ok) {
  +_PROP_DEBUG_EXIT(_debug);
  +    }
  +
  +ok = JS_TRUE;   /* XXX avoid immediate interp exit by always succeeding. */
  +
  +    return ok;
  +}
  +
  +static JSBool
  +rpmmacro_setprop(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +    jsint tiny = JSVAL_TO_INT(id);
  +    /* XXX the class has ptr == NULL, instances have ptr != NULL. */
  +    JSBool ok = (ptr ? JS_FALSE : JS_TRUE);
  +    int myint;
  +
  +    switch (tiny) {
  +    case _DEBUG:
  +	if (JS_ValueToInt32(cx, *vp, &_debug))
  +	    ok = JS_TRUE;
  +	break;
  +    default:
  +	break;
  +    }
  +
  +    if (!ok) {
  +_PROP_DEBUG_EXIT(_debug);
  +    }
  +    return ok;
  +}
  +
  +static JSBool
  +rpmmacro_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
  +	JSObject **objp)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +    JSBool ok = JS_FALSE;
  +
  +_RESOLVE_DEBUG_ENTRY(_debug < 0);
  +
  +    if ((flags & JSRESOLVE_ASSIGNING)
  +     || (ptr == NULL)) { /* don't resolve to parent prototypes objects. */
  +	*objp = NULL;
  +	ok = JS_TRUE;
  +	goto exit;
  +    }
  +
  +    *objp = obj;	/* XXX always resolve in this object. */
  +
  +    ok = JS_TRUE;
  +exit:
  +    return ok;
  +}
  +
  +static JSBool
  +rpmmacro_enumerate(JSContext *cx, JSObject *obj, JSIterateOp op,
  +		  jsval *statep, jsid *idp)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +    JSBool ok = JS_FALSE;
  +
  +_ENUMERATE_DEBUG_ENTRY(_debug < 0);
  +
  +    switch (op) {
  +    case JSENUMERATE_INIT:
  +	*statep = JSVAL_VOID;
  +        if (idp)
  +            *idp = JSVAL_ZERO;
  +        break;
  +    case JSENUMERATE_NEXT:
  +	*statep = JSVAL_VOID;
  +        if (*idp != JSVAL_VOID)
  +            break;
  +        /*@fallthrough@*/
  +    case JSENUMERATE_DESTROY:
  +	*statep = JSVAL_NULL;
  +        break;
  +    }
  +    ok = JS_TRUE;
  +exit:
  +    return ok;
  +}
  +
  +static JSBool
  +rpmmacro_convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +
  +_CONVERT_DEBUG_ENTRY(_debug);
  +
  +    return JS_TRUE;
  +}
  +
  +/* --- Object ctors/dtors */
  +static rpmmacro
  +rpmmacro_init(JSContext *cx, JSObject *obj)
  +{
  +    rpmmacro macro = xcalloc(1, sizeof(*macro));
  +    int xx;
  +
  +    if (!JS_SetPrivate(cx, obj, (void *)macro)) {
  +	/* XXX error msg */
  +	return NULL;
  +    }
  +    return macro;
  +}
  +
  +static void
  +rpmmacro_dtor(JSContext *cx, JSObject *obj)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmacroClass, NULL);
  +
  +if (_debug)
  +fprintf(stderr, "==> %s(%p,%p) ptr %p\n", __FUNCTION__, cx, obj, ptr);
  +
  +    (void) _free(ptr);
  +}
  +
  +static JSBool
  +rpmmacro_ctor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    JSBool ok = JS_FALSE;
  +    JSObject *o = NULL;
  +
  +if (_debug)
  +fprintf(stderr, "==> %s(%p,%p,%p[%u],%p)%s\n", __FUNCTION__, cx, obj, argv, \
(unsigned)argc, rval, ((cx->fp->flags & JSFRAME_CONSTRUCTING) ? " constructing" : \
""));  +
  +    if (cx->fp->flags & JSFRAME_CONSTRUCTING) {
  +	if (rpmmacro_init(cx, obj) == NULL)
  +	    goto exit;
  +    } else {
  +	if ((obj = JS_NewObject(cx, &rpmmacroClass, NULL, NULL)) == NULL)
  +	    goto exit;
  +	*rval = OBJECT_TO_JSVAL(obj);
  +    }
  +    ok = JS_TRUE;
  +
  +exit:
  +    return ok;
  +}
  +
  +/* --- Class initialization */
  +JSClass rpmmacroClass = {
  +    "Macro", JSCLASS_NEW_RESOLVE | JSCLASS_NEW_ENUMERATE | JSCLASS_HAS_PRIVATE,
  +    rpmmacro_addprop,   rpmmacro_delprop, rpmmacro_getprop, rpmmacro_setprop,
  +    (JSEnumerateOp)rpmmacro_enumerate, (JSResolveOp)rpmmacro_resolve,
  +    rpmmacro_convert,	rpmmacro_dtor,
  +    JSCLASS_NO_OPTIONAL_MEMBERS
  +};
  +
  +JSObject *
  +rpmjs_InitMacroClass(JSContext *cx, JSObject* obj)
  +{
  +    JSObject * o;
  +
  +if (_debug)
  +fprintf(stderr, "==> %s(%p,%p)\n", __FUNCTION__, cx, obj);
  +
  +    o = JS_InitClass(cx, obj, NULL, &rpmmacroClass, rpmmacro_ctor, 1,
  +		rpmmacro_props, rpmmacro_funcs, NULL, NULL);
  +assert(o != NULL);
  +    return o;
  +}
  +
  +JSObject *
  +rpmjs_NewMacroObject(JSContext *cx, JSObject *o)
  +{
  +    JSObject *obj;
  +    rpmmacro macro;
  +
  +    if ((obj = JS_NewObject(cx, &rpmmacroClass, NULL, NULL)) == NULL) {
  +	/* XXX error msg */
  +	return NULL;
  +    }
  +    if ((macro = rpmmacro_init(cx, obj)) == NULL) {
  +	/* XXX error msg */
  +	return NULL;
  +    }
  +    return obj;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/js/rpmmacro-js.h
  ============================================================================
  $ cvs diff -u -r0 -r1.1 rpmmacro-js.h
  --- /dev/null	2009-04-28 17:13:00 +0200
  +++ rpmmacro-js.h	2009-04-28 17:13:36 +0200
  @@ -0,0 +1,26 @@
  +#ifndef H_RPMMACRO_JS
  +#define H_RPMMACRO_JS
  +
  +/**
  + * \file js/rpmmacro-js.h
  + */
  +
  +#include "rpm-js.h"
  +
  +extern JSClass rpmmacroClass;
  +
  +#ifdef __cplusplus
  +extern "C" {
  +#endif
  +
  +extern JSObject *
  +rpmjs_InitMacroClass(JSContext *cx, JSObject* obj);
  +
  +extern JSObject *
  +rpmjs_NewMacroObject(JSContext *cx, JSObject *o);
  +
  +#ifdef __cplusplus      
  +}
  +#endif
  +
  +#endif	/* H_RPMMACRO_JS */
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/js/rpmps-js.c
  ============================================================================
  $ cvs diff -u -r1.6 -r1.7 rpmps-js.c
  --- rpm/js/rpmps-js.c	28 Apr 2009 05:29:54 -0000	1.6
  +++ rpm/js/rpmps-js.c	28 Apr 2009 15:13:36 -0000	1.7
  @@ -62,8 +62,8 @@
   }
   
   static JSFunctionSpec rpmps_funcs[] = {
  -    { "push",	rpmps_push,		0,0,0},
  -    { "print",	rpmps_print,		0,0,0},
  +    {"push",	rpmps_push,		0,0,0},
  +    {"print",	rpmps_print,		0,0,0},
       JS_FS_END
   };
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/js/tjs.c
  ============================================================================
  $ cvs diff -u -r1.19 -r1.20 tjs.c
  --- rpm/js/tjs.c	28 Apr 2009 05:29:54 -0000	1.19
  +++ rpm/js/tjs.c	28 Apr 2009 15:13:36 -0000	1.20
  @@ -45,7 +45,7 @@
       { "Fi",		rpmjs_InitFiClass,	 14 },
       { "File",		   js_InitFileClass,	  1 },
       { "Hdr",		rpmjs_InitHdrClass,	 12 },
  -    { "Macro",		rpmjs_InitMacroClass,	  4 },
  +    { "Macro",		rpmjs_InitMacroClass,	 24 },
       { "Mi",		rpmjs_InitMiClass,	 11 },
       { "Ps",		rpmjs_InitPsClass,	 16 },
       { "Syck",		rpmjs_InitSyckClass,	  3 },
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/js/tscripts/Macro.js
  ============================================================================
  $ cvs diff -u -r0 -r1.1 Macro.js
  --- /dev/null	2009-04-28 17:13:00 +0200
  +++ Macro.js	2009-04-28 17:13:36 +0200
  @@ -0,0 +1,21 @@
  +if (loglvl) print("--> Macro.js");
  +
  +var macro = new Macro();
  +ack("typeof macro;", "object");
  +ack("macro instanceof Macro;", true);
  +ack("macro.debug = 1;", 1);
  +ack("macro.debug = 0;", 0);
  +
  +
  +ack('macro.expand("%{_bindir}")', "/usr/bin");
  +
  +ack('macro.expand("%{lua:print(\\"lua\\")}")',	"lua");
  +
  +// FIXME: reloading rpm modules within embedded interpreter segfaults
  +// ack('macro.expand("%{perl:print \\"perl\\"}")',	"perl");
  +// ack('macro.expand("%{python:print \\"python\\"}")', "python");
  +
  +ack('macro.expand("%{ruby:puts \\"ruby\\"}")',	"ruby");
  +ack('macro.expand("%{tcl:puts \\"tcl\\"}")',	"tcl");
  +
  +if (loglvl) print("<-- Macro.js");
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic