Bug 854029 - Allow use of non-gcthing values with RelocatableValue; r=billm

--HG--
rename : content/svg/content/src/SVGFEMorphologyElement.h => content/svg/content/src/nsSVGFilters.cpp
rename : content/svg/content/test/selectSubString-helper.svg => content/svg/content/test/getSubStringLength-helper.svg
rename : content/svg/content/test/test_selectSubString.xhtml => content/svg/content/test/test_getSubStringLength.xhtml
rename : intl/icu/source/config/mh-msys-msvc => intl/icu/source/config/mh-cygwin-msvc
rename : layout/reftests/svg/text/selectSubString-2-ref.svg => layout/reftests/svg/text/simple-selection.svg
extra : rebase_source : 39ef8fef55bf6e540d41e6d12a4e73859833c0a7
This commit is contained in:
Terrence Cole 2013-03-25 11:48:25 -07:00
parent cdd8f4770d
commit b9a6e8c78d
2 changed files with 31 additions and 25 deletions

View File

@ -223,7 +223,8 @@ RelocatableValue::RelocatableValue(const Value &v)
: EncapsulatedValue(v)
{
JS_ASSERT(!IsPoisonedValue(v));
post();
if (v.isMarkable())
post();
}
inline
@ -231,14 +232,15 @@ RelocatableValue::RelocatableValue(const RelocatableValue &v)
: EncapsulatedValue(v.value)
{
JS_ASSERT(!IsPoisonedValue(v.value));
post();
if (v.value.isMarkable())
post();
}
inline
RelocatableValue::~RelocatableValue()
{
pre();
relocate();
if (value.isMarkable())
relocate(runtime(value));
}
inline RelocatableValue &
@ -246,8 +248,16 @@ RelocatableValue::operator=(const Value &v)
{
pre();
JS_ASSERT(!IsPoisonedValue(v));
value = v;
post();
if (v.isMarkable()) {
value = v;
post();
} else if (value.isMarkable()) {
JSRuntime *rt = runtime(value);
value = v;
relocate(rt);
} else {
value = v;
}
return *this;
}
@ -256,8 +266,16 @@ RelocatableValue::operator=(const RelocatableValue &v)
{
pre();
JS_ASSERT(!IsPoisonedValue(v.value));
value = v.value;
post();
if (v.value.isMarkable()) {
value = v.value;
post();
} else if (value.isMarkable()) {
JSRuntime *rt = runtime(value);
value = v.value;
relocate(rt);
} else {
value = v.value;
}
return *this;
}
@ -265,26 +283,16 @@ inline void
RelocatableValue::post()
{
#ifdef JSGC_GENERATIONAL
if (value.isMarkable())
runtime(value)->gcStoreBuffer.putRelocatableValue(&value);
JS_ASSERT(value.isMarkable());
runtime(value)->gcStoreBuffer.putRelocatableValue(&value);
#endif
}
inline void
RelocatableValue::post(JSRuntime *rt)
RelocatableValue::relocate(JSRuntime *rt)
{
#ifdef JSGC_GENERATIONAL
if (value.isMarkable())
rt->gcStoreBuffer.putRelocatableValue(&value);
#endif
}
inline void
RelocatableValue::relocate()
{
#ifdef JSGC_GENERATIONAL
if (value.isMarkable())
runtime(value)->gcStoreBuffer.removeRelocatableValue(&value);
rt->gcStoreBuffer.removeRelocatableValue(&value);
#endif
}

View File

@ -376,7 +376,6 @@ class EncapsulatedValue : public ValueOperations<EncapsulatedValue>
*/
EncapsulatedValue() MOZ_DELETE;
public:
EncapsulatedValue(const Value &v) : value(v) {
JS_ASSERT(!IsPoisonedValue(v));
@ -460,8 +459,7 @@ class RelocatableValue : public EncapsulatedValue
private:
inline void post();
inline void post(JSRuntime *rt);
inline void relocate();
inline void relocate(JSRuntime *rt);
};
class HeapSlot : public EncapsulatedValue