static EjsVar *arrayConstructor(Ejs *ejs, EjsArray *ap, int argc, EjsVar **argv) { EjsArray *args; EjsVar *arg0, **src, **dest; int size, i; mprAssert(argc == 1 && ejsIsArray(argv[0])); args = (EjsArray*) argv[0]; if (args->length == 0) { return 0; } size = 0; arg0 = getArrayProperty(ejs, args, 0); if (args->length == 1 && ejsIsNumber(arg0)) { /* * x = new Array(size); */ size = ejsGetInt(arg0); if (size > 0 && growArray(ejs, ap, size) < 0) { ejsThrowMemoryError(ejs); return 0; } } else { /* * x = new Array(element0, element1, ..., elementN): */ size = args->length; if (size > 0 && growArray(ejs, ap, size) < 0) { ejsThrowMemoryError(ejs); return 0; } src = args->data; dest = ap->data; for (i = 0; i < size; i++) { dest[i] = src[i]; } } ap->length = size; return (EjsVar*) ap; }
static EjsVar *getArrayPropertyByName(Ejs *ejs, EjsArray *ap, EjsName *qname) { int slotNum; if (isdigit((int) qname->name[0])) { slotNum = atoi(qname->name); if (slotNum < 0 || slotNum >= ap->length) { return 0; } return getArrayProperty(ejs, ap, slotNum); } /* The "length" property is a method getter */ if (strcmp(qname->name, "length") == 0) { return 0; } slotNum = (ejs->objectHelpers->lookupProperty)(ejs, (EjsVar*) ap, qname); if (slotNum < 0) { return 0; } return (ejs->objectHelpers->getProperty)(ejs, (EjsVar*) ap, slotNum); }
static EjsObj *getArrayPropertyByName(Ejs *ejs, EjsArray *ap, EjsName qname) { int slotNum; if (isdigit((uchar) qname.name->value[0])) { slotNum = ejsAtoi(ejs, qname.name, 10); if (slotNum < 0 || slotNum >= ap->length) { return 0; } return getArrayProperty(ejs, ap, slotNum); } /* The "length" property is a method getter */ if (qname.name == ESV(length)) { return 0; } slotNum = (ejs->service->potHelpers.lookupProperty)(ejs, ap, qname); if (slotNum < 0) { return 0; } return (ejs->service->potHelpers.getProperty)(ejs, ap, slotNum); }