bool JSRope::copyNonPureCharsInternal(ThreadSafeContext *cx, ScopedJSFreePtr<jschar> &out, bool nullTerminate) const { /* * Perform non-destructive post-order traversal of the rope, splatting * each node's characters into a contiguous buffer. */ size_t n = length(); if (cx) out.reset(cx->pod_malloc<jschar>(n + 1)); else out.reset(js_pod_malloc<jschar>(n + 1)); if (!out) return false; Vector<const JSString *, 8, SystemAllocPolicy> nodeStack; const JSString *str = this; jschar *pos = out; while (true) { if (str->isRope()) { if (!nodeStack.append(str->asRope().rightChild())) return false; str = str->asRope().leftChild(); } else { size_t len = str->length(); PodCopy(pos, str->asLinear().chars(), len); pos += len; if (nodeStack.empty()) break; str = nodeStack.popCopy(); } } JS_ASSERT(pos == out + n); if (nullTerminate) out[n] = 0; return true; }
bool JSDependentString::copyNonPureCharsZ(ThreadSafeContext *cx, ScopedJSFreePtr<jschar> &out) const { JS_ASSERT(JSString::isDependent()); size_t n = length(); jschar *s = cx->pod_malloc<jschar>(n + 1); if (!s) return false; PodCopy(s, nonInlineChars(), n); s[n] = 0; out.reset(s); return true; }