static int setArrayPropertyByName(Ejs *ejs, EjsArray *ap, EjsName *qname, EjsVar *value) { int slotNum; if (!isdigit((int) qname->name[0])) { /* The "length" property is a method getter */ if (strcmp(qname->name, "length") == 0) { return EJS_ERR; } slotNum = (ejs->objectHelpers->lookupProperty)(ejs, (EjsVar*) ap, qname); if (slotNum < 0) { slotNum = (ejs->objectHelpers->setProperty)(ejs, (EjsVar*) ap, slotNum, value); if (slotNum < 0) { return EJS_ERR; } if ((ejs->objectHelpers->setPropertyName)(ejs, (EjsVar*) ap, slotNum, qname) < 0) { return EJS_ERR; } return slotNum; } else { return (ejs->objectHelpers->setProperty)(ejs, (EjsVar*) ap, slotNum, value); } } if ((slotNum = checkSlot(ejs, ap, atoi(qname->name))) < 0) { return EJS_ERR; } ap->data[slotNum] = value; return slotNum; }
static int setArrayPropertyByName(Ejs *ejs, EjsArray *ap, EjsName qname, EjsObj *value) { int slotNum; if (!isdigit((uchar) qname.name->value[0])) { /* The "length" property is a method getter */ if (qname.name == ESV(length)) { setArrayLength(ejs, ap, 1, &value); return ES_Array_length; } slotNum = (ejs->service->potHelpers.lookupProperty)(ejs, ap, qname); if (slotNum < 0) { slotNum = (ejs->service->potHelpers.setProperty)(ejs, ap, slotNum, value); if (slotNum < 0) { return EJS_ERR; } if ((ejs->service->potHelpers.setPropertyName)(ejs, ap, slotNum, qname) < 0) { return EJS_ERR; } return slotNum; } else { return (ejs->service->potHelpers.setProperty)(ejs, ap, slotNum, value); } } if ((slotNum = checkSlot(ejs, ap, ejsAtoi(ejs, qname.name, 10))) < 0) { return EJS_ERR; } ap->data[slotNum] = value; return slotNum; }
/* * Create or update an array elements. If slotNum is < 0, then create the next free array slot. If slotNum is greater * than the array length, grow the array. */ static int setArrayProperty(Ejs *ejs, EjsArray *ap, int slotNum, EjsVar *value) { if ((slotNum = checkSlot(ejs, ap, slotNum)) < 0) { return EJS_ERR; } ap->data[slotNum] = value; return slotNum; }