JSAutoByteString 编辑
This article covers features introduced in SpiderMonkey 17
Take ownership of a string and free it later.
Syntax
JSAutoByteString str;
JSAutoByteString(JSContext *cx, JSString *str);
Name | Type | Description |
---|---|---|
cx | JSContext * | The context in which to add the root. Requires request. In a JS_THREADSAFE build, the caller must be in a request on this JSContext . |
str | JSString * | A pointer to JSString to get initial content by calling JS_EncodeString(cx, str) . |
Methods
Method | Description |
---|---|
void initBytes(char *bytes) | Take ownership of the given byte array. |
char *encodeLatin1(JSContext *cx, JSString *str) | Call JS_EncodeString and take ownership of the returned string, and return the string. |
char *encodeLatin1(js::ExclusiveContext *cx, JSString *str) | Call JS::LossyTwoByteCharsToNewLatin1CharsZ , or allocate string and copy the content of JSLinearString::latin1Chars , and take the ownership of the string. This may fail if str is not linear. |
char *encodeUtf8(JSContext *cx, JS::HandleString str) | Call JS_EncodeStringToUTF8 and take ownership of the returned string, and return the string. |
void clear() | Free the owned string. You should call this before calling encode* methods or initBytes method if a string is already owned, otherwise the string will never be freed. |
char *ptr() const | Return a pointer to the owned string. This could be NULL if no string is owned. |
bool operator!() const | Return true if no string is owned. |
size_t length() const | Return the length of the owned string. Return 0 if no string is owned. |
Description
JSAutoByteString
takes the ownership of string and frees it in destructor.
If JSAutoByteString
instance is initialized with JSAutoByteString bytes(cx, str);
style, it calls JS_EncodeString(cx, str)
to get the string to take ownership.
If JSAutoByteString
instance is initialized with JSAutoByteString bytes;
style, it does not own any string. You can call some methods to take ownership of other string.
Note that the JS_EncodeString
call in constructor and some encode*
methods may fail and get NULL
. So ensure the string is returned by operator!()
before using ptr()
method.
Examples
Use constructor arguments
{
JSString *str = JS::ToString(cx, strVal);
if (!str)
return false;
JSAutoByteString bytes(cx, str); /* calls JS_EncodeString internally */
if (!bytes)
return false;
/* ...do something with bytes... */
/* when leaving this scope, the string returned by JS_EncodeString is freed. */
}
Use method to encode string
{
JS::RootedString str(cx, JS::ToString(cx, strVal));
if (!str)
return false;
JSAutoByteString bytes;
if (!bytes.encodeUtf8(cx, str)) /* calls JS_EncodeStringToUTF8 internally */
return false;
/* ...do something with bytes... */
/* when leaving this scope, the string returned by JS_EncodeStringToUTF8 is freed. */
}
Take ownership of other buffer
{
char *buff = cx->pod_malloc<char>(length + 1);
if (!buff)
return false;
memcpy(buff, other_buff, length + 1)
JSAutoByteString bytes;
bytes.initBytes(buff);
/* ...do something with bytes... */
/* when leaving this scope, buff is freed. */
}
See Also
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论