Bug 965830 - Add HandleValueArray class to receive rooted arrays of Values r=terrence

This commit is contained in:
Jon Coppeard 2014-02-11 10:59:16 +00:00
Родитель f9b9e81392
Коммит 457e5b82c5
2 изменённых файлов: 44 добавлений и 0 удалений

Просмотреть файл

@ -115,6 +115,8 @@ using js::frontend::Parser;
JS_STATIC_ASSERT((jschar)-1 > 0); JS_STATIC_ASSERT((jschar)-1 > 0);
JS_STATIC_ASSERT(sizeof(jschar) == 2); JS_STATIC_ASSERT(sizeof(jschar) == 2);
const JS::HandleValueArray JS::EmptyValueArray;
JS_PUBLIC_API(int64_t) JS_PUBLIC_API(int64_t)
JS_Now() JS_Now()
{ {

Просмотреть файл

@ -600,6 +600,48 @@ class JS_PUBLIC_API(CustomAutoRooter) : private AutoGCRooter
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
}; };
/* A handle to an array of rooted values. */
class HandleValueArray
{
const size_t length_;
const Value *elements_;
HandleValueArray(size_t len, const Value *elements) : length_(len), elements_(elements) {}
public:
HandleValueArray() : length_(0), elements_(nullptr) {}
HandleValueArray(const RootedValue& value) : length_(1), elements_(value.address()) {}
HandleValueArray(const AutoValueVector& values)
: length_(values.length()), elements_(values.begin()) {}
template <size_t N>
HandleValueArray(const AutoValueArray<N>& values) : length_(N), elements_(values.begin()) {}
/* CallArgs must already be rooted somewhere up the stack. */
HandleValueArray(const JS::CallArgs& args) : length_(args.length()), elements_(args.array()) {}
/* Use with care! Only call this if the data is guaranteed to be marked. */
static HandleValueArray fromMarkedLocation(size_t len, const Value *elements) {
return HandleValueArray(len, elements);
}
static HandleValueArray subarray(const AutoValueVector& values, size_t startIndex, size_t len) {
JS_ASSERT(startIndex + len <= values.length());
return HandleValueArray(len, values.begin() + startIndex);
}
size_t length() const { return length_; }
const Value *begin() const { return elements_; }
HandleValue operator[](size_t i) const {
JS_ASSERT(i < length_);
return HandleValue::fromMarkedLocation(&elements_[i]);
}
};
extern JS_PUBLIC_DATA(const HandleValueArray) EmptyValueArray;
} /* namespace JS */ } /* namespace JS */
/************************************************************************/ /************************************************************************/