static bool FillVector(JSContext* cx, MutableHandle<ShapeVec> shapes) { for (size_t i = 0; i < 10; ++i) { RootedObject obj(cx, JS_NewObject(cx, nullptr)); RootedValue val(cx, UndefinedValue()); // Construct a unique property name to ensure that the object creates a // new shape. char buffer[2]; buffer[0] = 'a' + i; buffer[1] = '\0'; if (!JS_SetProperty(cx, obj, buffer, val)) return false; if (!shapes.append(obj->as<NativeObject>().lastProperty())) return false; } // Ensure iterator enumeration works through the mutable handle. for (auto shape : shapes) { if (!shape) return false; } return true; }
static bool ImportFunctions(JSContext* cx, HandleObject importObj, const ImportNameVector& importNames, MutableHandle<FunctionVector> imports) { if (!importNames.empty() && !importObj) return Fail(cx, "no import object given"); for (const ImportName& name : importNames) { RootedValue v(cx); if (!GetProperty(cx, importObj, name.module.get(), &v)) return false; if (*name.func.get()) { if (!v.isObject()) return Fail(cx, "import object field is not an Object"); RootedObject obj(cx, &v.toObject()); if (!GetProperty(cx, obj, name.func.get(), &v)) return false; } if (!IsFunctionObject(v)) return Fail(cx, "import object field is not a Function"); if (!imports.append(&v.toObject().as<JSFunction>())) return false; } return true; }