JS_NewStringCopyZ(cx, element->tagName ? element->tagName : "#tag");
tagName = JS_NewStringCopyZ(cx, element->tagName ? element->tagName : "#tag");
element_getter(JSContext *cx, JSObject *obj, jsval id, jsval *vp){    intN slot;    DOM_Element *element;    if (!JSVAL_IS_INT(id))        return JS_TRUE;    slot = JSVAL_TO_INT(id);    /*      * Look, ma!  Inheritance!     * We handle .attributes ourselves because we return something other     * than null, unlike every other Node subclass.     */    if (slot != DOM_NODE_ATTRIBUTES &&        slot <= DOM_NODE_NODENAME &&        slot >= DOM_NODE_HASCHILDNODES) {        return dom_node_getter(cx, obj, id, vp);    }    element = (DOM_Element *)JS_GetPrivate(cx, obj);    if (!element)        return JS_TRUE;    if (slot == DOM_ELEMENT_TAGNAME) {        JSString *tagName =#ifdef DEBUG_shaver            fprintf(stderr, "getting tagName %s\n",                     element->tagName ? element->tagName : "#tag");            JS_InternString(cx, element->tagName ? element->tagName : "#tag");#else            JS_NewStringCopyZ(cx,                              element->tagName ? element->tagName : "#tag");#endif        if (!tagName)            return JS_FALSE;        *vp = STRING_TO_JSVAL(tagName);    }    return JS_TRUE;}