static bool CloneValue(JSContext *cx, MutableHandleValue vp, CloneMemory &clonedObjects) { if (vp.isObject()) { RootedObject obj(cx, &vp.toObject()); RootedObject clone(cx, CloneObject(cx, obj, clonedObjects)); if (!clone) return false; vp.setObject(*clone); } else if (vp.isBoolean() || vp.isNumber() || vp.isNullOrUndefined()) { // Nothing to do here: these are represented inline in the value } else if (vp.isString()) { Rooted<JSStableString*> str(cx, vp.toString()->ensureStable(cx)); if (!str) return false; RootedString clone(cx, js_NewStringCopyN<CanGC>(cx, str->chars().get(), str->length())); if (!clone) return false; vp.setString(clone); } else { if (JSString *valSrc = JS_ValueToSource(cx, vp)) printf("Error: Can't yet clone value: %s\n", JS_EncodeString(cx, valSrc)); return false; } return true; }
static bool CloneValue(JSContext *cx, MutableHandleValue vp, CloneMemory &clonedObjects) { if (vp.isObject()) { RootedObject obj(cx, &vp.toObject()); RootedObject clone(cx, CloneObject(cx, obj, clonedObjects)); if (!clone) return false; vp.setObject(*clone); } else if (vp.isBoolean() || vp.isNumber() || vp.isNullOrUndefined()) { // Nothing to do here: these are represented inline in the value } else if (vp.isString()) { Rooted<JSStableString*> str(cx, vp.toString()->ensureStable(cx)); if (!str) return false; RootedString clone(cx, js_NewStringCopyN<CanGC>(cx, str->chars().get(), str->length())); if (!clone) return false; vp.setString(clone); } else { MOZ_ASSUME_UNREACHABLE("Self-hosting CloneValue can't clone given value."); } return true; }