diff -r 000000000000 -r 6474c204b198 layout/style/nsRuleData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/style/nsRuleData.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsRuleData.h" + +#include "mozilla/Poison.h" +#include + +inline size_t +nsRuleData::GetPoisonOffset() +{ + // Fill in mValueOffsets such that mValueStorage + mValueOffsets[i] + // will yield the frame poison value for all uninitialized value + // offsets. + static_assert(sizeof(uintptr_t) == sizeof(size_t), + "expect uintptr_t and size_t to be the same size"); + static_assert(uintptr_t(-1) > uintptr_t(0), + "expect uintptr_t to be unsigned"); + static_assert(size_t(-1) > size_t(0), + "expect size_t to be unsigned"); + uintptr_t framePoisonValue = mozPoisonValue(); + return size_t(framePoisonValue - uintptr_t(mValueStorage)) / + sizeof(nsCSSValue); +} + +nsRuleData::nsRuleData(uint32_t aSIDs, nsCSSValue* aValueStorage, + nsPresContext* aContext, nsStyleContext* aStyleContext) + : mSIDs(aSIDs), + mCanStoreInRuleTree(true), + mPresContext(aContext), + mStyleContext(aStyleContext), + mValueStorage(aValueStorage) +{ +#ifndef MOZ_VALGRIND + size_t framePoisonOffset = GetPoisonOffset(); + for (size_t i = 0; i < nsStyleStructID_Length; ++i) { + mValueOffsets[i] = framePoisonOffset; + } +#endif +} + +#ifdef DEBUG +nsRuleData::~nsRuleData() +{ +#ifndef MOZ_VALGRIND + // assert nothing in mSIDs has poison value + size_t framePoisonOffset = GetPoisonOffset(); + for (size_t i = 0; i < nsStyleStructID_Length; ++i) { + NS_ABORT_IF_FALSE(!(mSIDs & (1 << i)) || + mValueOffsets[i] != framePoisonOffset, + "value in SIDs was left with poison offset"); + } +#endif +} +#endif