From 354efa45502166d5245d94fd6551cca16fcec34a Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 7 Feb 2013 09:13:08 +0100 Subject: [PATCH] Bug 829997 - Pass MutableHandleValue to static RegExp getters; r=sfink --- js/src/builtin/RegExp.cpp | 30 +++++++++---------- js/src/jsstr.cpp | 8 ++--- js/src/vm/RegExpStatics-inl.h | 55 ++++++++++++++++++----------------- 3 files changed, 47 insertions(+), 46 deletions(-) diff --git a/js/src/builtin/RegExp.cpp b/js/src/builtin/RegExp.cpp index 9236763b4e8a..ac37ab732c99 100644 --- a/js/src/builtin/RegExp.cpp +++ b/js/src/builtin/RegExp.cpp @@ -413,23 +413,23 @@ static JSFunctionSpec regexp_methods[] = { code; \ } -DEFINE_STATIC_GETTER(static_input_getter, return res->createPendingInput(cx, vp.address())) -DEFINE_STATIC_GETTER(static_multiline_getter, vp.set(BOOLEAN_TO_JSVAL(res->multiline())); +DEFINE_STATIC_GETTER(static_input_getter, return res->createPendingInput(cx, vp)) +DEFINE_STATIC_GETTER(static_multiline_getter, vp.setBoolean(res->multiline()); return true) -DEFINE_STATIC_GETTER(static_lastMatch_getter, return res->createLastMatch(cx, vp.address())) -DEFINE_STATIC_GETTER(static_lastParen_getter, return res->createLastParen(cx, vp.address())) -DEFINE_STATIC_GETTER(static_leftContext_getter, return res->createLeftContext(cx, vp.address())) -DEFINE_STATIC_GETTER(static_rightContext_getter, return res->createRightContext(cx, vp.address())) +DEFINE_STATIC_GETTER(static_lastMatch_getter, return res->createLastMatch(cx, vp)) +DEFINE_STATIC_GETTER(static_lastParen_getter, return res->createLastParen(cx, vp)) +DEFINE_STATIC_GETTER(static_leftContext_getter, return res->createLeftContext(cx, vp)) +DEFINE_STATIC_GETTER(static_rightContext_getter, return res->createRightContext(cx, vp)) -DEFINE_STATIC_GETTER(static_paren1_getter, return res->createParen(cx, 1, vp.address())) -DEFINE_STATIC_GETTER(static_paren2_getter, return res->createParen(cx, 2, vp.address())) -DEFINE_STATIC_GETTER(static_paren3_getter, return res->createParen(cx, 3, vp.address())) -DEFINE_STATIC_GETTER(static_paren4_getter, return res->createParen(cx, 4, vp.address())) -DEFINE_STATIC_GETTER(static_paren5_getter, return res->createParen(cx, 5, vp.address())) -DEFINE_STATIC_GETTER(static_paren6_getter, return res->createParen(cx, 6, vp.address())) -DEFINE_STATIC_GETTER(static_paren7_getter, return res->createParen(cx, 7, vp.address())) -DEFINE_STATIC_GETTER(static_paren8_getter, return res->createParen(cx, 8, vp.address())) -DEFINE_STATIC_GETTER(static_paren9_getter, return res->createParen(cx, 9, vp.address())) +DEFINE_STATIC_GETTER(static_paren1_getter, return res->createParen(cx, 1, vp)) +DEFINE_STATIC_GETTER(static_paren2_getter, return res->createParen(cx, 2, vp)) +DEFINE_STATIC_GETTER(static_paren3_getter, return res->createParen(cx, 3, vp)) +DEFINE_STATIC_GETTER(static_paren4_getter, return res->createParen(cx, 4, vp)) +DEFINE_STATIC_GETTER(static_paren5_getter, return res->createParen(cx, 5, vp)) +DEFINE_STATIC_GETTER(static_paren6_getter, return res->createParen(cx, 6, vp)) +DEFINE_STATIC_GETTER(static_paren7_getter, return res->createParen(cx, 7, vp)) +DEFINE_STATIC_GETTER(static_paren8_getter, return res->createParen(cx, 8, vp)) +DEFINE_STATIC_GETTER(static_paren9_getter, return res->createParen(cx, 9, vp)) #define DEFINE_STATIC_SETTER(name, code) \ static JSBool \ diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 27f086f2d45c..c9732faa0718 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -1829,7 +1829,7 @@ MatchCallback(JSContext *cx, RegExpStatics *res, size_t count, void *p) RootedObject obj(cx, arrayobj); RootedValue v(cx); - return res->createLastMatch(cx, v.address()) && JSObject::defineElement(cx, obj, count, v); + return res->createLastMatch(cx, &v) && JSObject::defineElement(cx, obj, count, v); } JSBool @@ -2017,7 +2017,7 @@ FindReplaceLength(JSContext *cx, RegExpStatics *res, ReplaceData &rdata, size_t JS_ASSERT(!rdata.elembase->getOps()->getProperty); RootedValue match(cx); - if (!res->createLastMatch(cx, match.address())) + if (!res->createLastMatch(cx, &match)) return false; JSString *str = match.toString(); @@ -2071,11 +2071,11 @@ FindReplaceLength(JSContext *cx, RegExpStatics *res, ReplaceData &rdata, size_t /* Push $&, $1, $2, ... */ unsigned argi = 0; - if (!res->createLastMatch(cx, &args[argi++])) + if (!res->createLastMatch(cx, args.handleAt(argi++))) return false; for (size_t i = 0; i < res->getMatches().parenCount(); ++i) { - if (!res->createParen(cx, i + 1, &args[argi++])) + if (!res->createParen(cx, i + 1, args.handleAt(argi++))) return false; } diff --git a/js/src/vm/RegExpStatics-inl.h b/js/src/vm/RegExpStatics-inl.h index 42bf7df7da05..9e569c702ab3 100644 --- a/js/src/vm/RegExpStatics-inl.h +++ b/js/src/vm/RegExpStatics-inl.h @@ -73,8 +73,8 @@ class RegExpStatics * If so, construct a string for it and place it in |*out|. * If not, place undefined in |*out|. */ - bool makeMatch(JSContext *cx, size_t checkValidIndex, size_t pairNum, Value *out); - bool createDependent(JSContext *cx, size_t start, size_t end, Value *out); + bool makeMatch(JSContext *cx, size_t checkValidIndex, size_t pairNum, MutableHandleValue out); + bool createDependent(JSContext *cx, size_t start, size_t end, MutableHandleValue out); void markFlagsSet(JSContext *cx); @@ -133,12 +133,12 @@ class RegExpStatics /* Value creators. */ - bool createPendingInput(JSContext *cx, Value *out); - bool createLastMatch(JSContext *cx, Value *out); - bool createLastParen(JSContext *cx, Value *out); - bool createParen(JSContext *cx, size_t pairNum, Value *out); - bool createLeftContext(JSContext *cx, Value *out); - bool createRightContext(JSContext *cx, Value *out); + bool createPendingInput(JSContext *cx, MutableHandleValue out); + bool createLastMatch(JSContext *cx, MutableHandleValue out); + bool createLastParen(JSContext *cx, MutableHandleValue out); + bool createParen(JSContext *cx, size_t pairNum, MutableHandleValue out); + bool createLeftContext(JSContext *cx, MutableHandleValue out); + bool createRightContext(JSContext *cx, MutableHandleValue out); /* Infallible substring creators. */ @@ -204,30 +204,31 @@ SizeOfRegExpStaticsData(const JSObject *obj, JSMallocSizeOfFun mallocSizeOf) } inline bool -RegExpStatics::createDependent(JSContext *cx, size_t start, size_t end, Value *out) +RegExpStatics::createDependent(JSContext *cx, size_t start, size_t end, MutableHandleValue out) { /* Private function: caller must perform lazy evaluation. */ JS_ASSERT(!pendingLazyEvaluation); JS_ASSERT(start <= end); JS_ASSERT(end <= matchesInput->length()); - JSString *str = js_NewDependentString(cx, matchesInput, start, end - start); + UnrootedString str = js_NewDependentString(cx, matchesInput, start, end - start); if (!str) return false; - *out = StringValue(str); + out.setString(str); return true; } inline bool -RegExpStatics::createPendingInput(JSContext *cx, Value *out) +RegExpStatics::createPendingInput(JSContext *cx, MutableHandleValue out) { /* Lazy evaluation need not be resolved to return the input. */ - out->setString(pendingInput ? pendingInput.get() : cx->runtime->emptyString); + out.setString(pendingInput ? pendingInput.get() : cx->runtime->emptyString); return true; } inline bool -RegExpStatics::makeMatch(JSContext *cx, size_t checkValidIndex, size_t pairNum, Value *out) +RegExpStatics::makeMatch(JSContext *cx, size_t checkValidIndex, size_t pairNum, + MutableHandleValue out) { /* Private function: caller must perform lazy evaluation. */ JS_ASSERT(!pendingLazyEvaluation); @@ -238,7 +239,7 @@ RegExpStatics::makeMatch(JSContext *cx, size_t checkValidIndex, size_t pairNum, if (matches.empty() || checkPair >= matches.pairCount() || (checkWhich ? matches[checkPair].limit : matches[checkPair].start) < 0) { - out->setString(cx->runtime->emptyString); + out.setString(cx->runtime->emptyString); return true; } const MatchPair &pair = matches[pairNum]; @@ -246,7 +247,7 @@ RegExpStatics::makeMatch(JSContext *cx, size_t checkValidIndex, size_t pairNum, } inline bool -RegExpStatics::createLastMatch(JSContext *cx, Value *out) +RegExpStatics::createLastMatch(JSContext *cx, MutableHandleValue out) { if (!executeLazy(cx)) return false; @@ -254,18 +255,18 @@ RegExpStatics::createLastMatch(JSContext *cx, Value *out) } inline bool -RegExpStatics::createLastParen(JSContext *cx, Value *out) +RegExpStatics::createLastParen(JSContext *cx, MutableHandleValue out) { if (!executeLazy(cx)) return false; if (matches.empty() || matches.pairCount() == 1) { - out->setString(cx->runtime->emptyString); + out.setString(cx->runtime->emptyString); return true; } const MatchPair &pair = matches[matches.pairCount() - 1]; if (pair.start == -1) { - out->setString(cx->runtime->emptyString); + out.setString(cx->runtime->emptyString); return true; } JS_ASSERT(pair.start >= 0 && pair.limit >= 0); @@ -274,48 +275,48 @@ RegExpStatics::createLastParen(JSContext *cx, Value *out) } inline bool -RegExpStatics::createParen(JSContext *cx, size_t pairNum, Value *out) +RegExpStatics::createParen(JSContext *cx, size_t pairNum, MutableHandleValue out) { JS_ASSERT(pairNum >= 1); if (!executeLazy(cx)) return false; if (matches.empty() || pairNum >= matches.pairCount()) { - out->setString(cx->runtime->emptyString); + out.setString(cx->runtime->emptyString); return true; } return makeMatch(cx, pairNum * 2, pairNum, out); } inline bool -RegExpStatics::createLeftContext(JSContext *cx, Value *out) +RegExpStatics::createLeftContext(JSContext *cx, MutableHandleValue out) { if (!executeLazy(cx)) return false; if (matches.empty()) { - out->setString(cx->runtime->emptyString); + out.setString(cx->runtime->emptyString); return true; } if (matches[0].start < 0) { - *out = UndefinedValue(); + out.setUndefined(); return true; } return createDependent(cx, 0, matches[0].start, out); } inline bool -RegExpStatics::createRightContext(JSContext *cx, Value *out) +RegExpStatics::createRightContext(JSContext *cx, MutableHandleValue out) { if (!executeLazy(cx)) return false; if (matches.empty()) { - out->setString(cx->runtime->emptyString); + out.setString(cx->runtime->emptyString); return true; } if (matches[0].limit < 0) { - *out = UndefinedValue(); + out.setUndefined(); return true; } return createDependent(cx, matches[0].limit, matchesInput->length(), out);