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: 18-Apr-2009 21:47:31 Branch: HEAD Handle: 2009041819473100 Modified files: rpm CHANGES rpm/rpmio rpmjs.c Log: - js: add an "environment" object (swiped from SpiderMonkey js shell). Summary: Revision Changes Path 1.2948 +1 -0 rpm/CHANGES 1.6 +93 -3 rpm/rpmio/rpmjs.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2947 -r1.2948 CHANGES --- rpm/CHANGES 18 Apr 2009 18:50:30 -0000 1.2947 +++ rpm/CHANGES 18 Apr 2009 19:47:31 -0000 1.2948 @@ -1,5 +1,6 @@ 5.2a4 -> 5.2b1: + - jbj: js: add an "environment" object (swiped from SpiderMonkey js shell). - jbj: js: add a "arguments" array (swiped from SpiderMonkey js shell). - jbj: js: add a print method (swiped from SpiderMonkey js shell). - rse: RPM_VENDOR_OPENPKG: stick with local RPM sanity checking for reasonable warning messages @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmjs.c ============================================================================ $ cvs diff -u -r1.5 -r1.6 rpmjs.c --- rpm/rpmio/rpmjs.c 18 Apr 2009 18:50:30 -0000 1.5 +++ rpm/rpmio/rpmjs.c 18 Apr 2009 19:47:31 -0000 1.6 @@ -68,6 +68,99 @@ JS_FS_END }; +static JSBool +env_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) +{ + JSString *idstr = JS_ValueToString(cx, id); + JSString *valstr = JS_ValueToString(cx, *vp); + JSBool ok = JS_FALSE; + +if (_rpmjs_debug) +fprintf(stderr, "==> %s(%p,%p,%p,%p)\n", __FUNCTION__, cx, obj, id, vp); + + if (idstr && valstr) { + const char * name = JS_GetStringBytes(idstr); + const char * value = JS_GetStringBytes(valstr); + + if (setenv(name, value, 1) < 0) + JS_ReportError(cx, "can't set envvar %s to %s", name, value); + else { + *vp = STRING_TO_JSVAL(valstr); + ok = JS_TRUE; + } + } + return ok; +} + +static JSBool +env_enumerate(JSContext *cx, JSObject *obj) +{ + static JSBool reflected; + char **evp, *name; + JSBool ok = JS_FALSE; + +if (_rpmjs_debug) +fprintf(stderr, "==> %s(%p,%p)\n", __FUNCTION__, cx, obj); + + if (reflected) + return JS_TRUE; + + for (evp = (char **)JS_GetPrivate(cx, obj); (name = *evp) != NULL; evp++) { + char *value; + JSString *valstr; + + if ((value = strchr(name, '=')) == NULL) + continue; + *value++ = '\0'; + if ((valstr = JS_NewStringCopyZ(cx, value)) != NULL) + ok = JS_DefineProperty(cx, obj, name, STRING_TO_JSVAL(valstr), + NULL, NULL, JSPROP_ENUMERATE); + value[-1] = '='; + if (!ok) + goto exit; + } + + reflected = JS_TRUE; + ok = JS_TRUE; +exit: + return ok; +} + +static JSBool +env_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, + JSObject **objp) +{ + JSString *idstr, *valstr; + const char *name, *value; + JSBool ok = JS_FALSE; + +if (_rpmjs_debug) +fprintf(stderr, "==> %s(%p,%p,%p,%u,%p)\n", __FUNCTION__, cx, obj, id, flags, objp); + if (flags & JSRESOLVE_ASSIGNING) + return JS_TRUE; + + if ((idstr = JS_ValueToString(cx, id)) == NULL) + goto exit; + name = JS_GetStringBytes(idstr); + if ((value = getenv(name)) != NULL) { + if ((valstr = JS_NewStringCopyZ(cx, value)) == NULL + || !JS_DefineProperty(cx, obj, name, STRING_TO_JSVAL(valstr), + NULL, NULL, JSPROP_ENUMERATE)) + goto exit; + *objp = obj; + } + ok = JS_TRUE; +exit: + return ok; +} + +static JSClass env_class = { + "environment", JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE, + JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, env_setProperty, + env_enumerate, (JSResolveOp) env_resolve, JS_ConvertStub, JS_FinalizeStub, + JSCLASS_NO_OPTIONAL_MEMBERS +}; + /*...@unchecked@*/ /*...@observer@*/ static JSClass global_class = { "global", JSCLASS_GLOBAL_FLAGS, @@ -158,14 +251,11 @@ xx = JS_DefineFunctions(cx, glob, shell_functions); js->glob = glob; -#ifdef NOTYET { JSObject * env = JS_DefineObject(cx, glob, "environment", &env_class, NULL, 0); assert(env != NULL); xx = JS_SetPrivate(cx, env, environ); - js->env = env; } -#endif { JSObject * args = JS_NewArrayObject(cx, 0, NULL); int i; @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org