static JSDProperty* _newProperty(JSDContext* jsdc, JSPropertyDesc* pd, uintN additionalFlags) { JSDProperty* jsdprop; if(!(jsdprop = (JSDProperty*) calloc(1, sizeof(JSDProperty)))) return NULL; JS_INIT_CLIST(&jsdprop->links); jsdprop->nref = 1; jsdprop->flags = pd->flags | additionalFlags; jsdprop->slot = pd->slot; if(!(jsdprop->name = jsd_NewValue(jsdc, pd->id))) goto new_prop_fail; if(!(jsdprop->val = jsd_NewValue(jsdc, pd->value))) goto new_prop_fail; if((jsdprop->flags & JSDPD_ALIAS) && !(jsdprop->alias = jsd_NewValue(jsdc, pd->alias))) goto new_prop_fail; return jsdprop; new_prop_fail: jsd_DropProperty(jsdc, jsdprop); return NULL; }
static void _freeProps(JSDContext* jsdc, JSDValue* jsdval) { JSDProperty* jsdprop; while(jsdprop = (JSDProperty*)jsdval->props.next, jsdprop != (JSDProperty*)&jsdval->props) { JS_REMOVE_AND_INIT_LINK(&jsdprop->links); jsd_DropProperty(jsdc, jsdprop); } JS_ASSERT(JS_CLIST_IS_EMPTY(&jsdval->props)); CLEAR_BIT_FLAG(jsdval->flags, GOT_PROPS); }
JSD_DropProperty(JSDContext* jsdc, JSDProperty* jsdprop) { JSD_ASSERT_VALID_CONTEXT(jsdc); JSD_ASSERT_VALID_PROPERTY(jsdprop); jsd_DropProperty(jsdc, jsdprop); }