0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-29 07:18:20 +02:00

ircd::js: Use jsapi external string facilities for string constructions.

This commit is contained in:
Jason Volk 2016-10-26 01:28:17 -07:00
parent 6a1fb4e8fb
commit 4c62795aeb
5 changed files with 112 additions and 17 deletions

View file

@ -61,6 +61,7 @@ inline JSVersion version(const char *const &v) { return JS_StringToVersion(v);
#include "compartment.h"
#include "debug.h"
#include "error.h"
#include "native.h"
#include "value.h"
#include "string.h"
#include "id.h"

61
include/ircd/js/native.h Normal file
View file

@ -0,0 +1,61 @@
/*
* Copyright (C) 2016 Charybdis Development Team
* Copyright (C) 2016 Jason Volk <jason@zemos.net>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#define HAVE_IRCD_JS_NATIVE_H
namespace ircd {
namespace js {
void native_external_delete(const JSStringFinalizer *, char16_t *);
extern JSStringFinalizer native_external_deleter;
std::unique_ptr<char16_t[]> native_external_copy(const char *const &s, const size_t &len);
std::unique_ptr<char16_t[]> native_external_copy(const char *const &s);
std::unique_ptr<char16_t[]> native_external_copy(const std::string &s);
size_t native(const JSString *const &, char *const &buf, const size_t &max);
size_t native_size(const JSString *const &);
std::string native(const JSString *const &);
} // namespace js
} // namespace ircd
inline std::unique_ptr<char16_t[]>
ircd::js::native_external_copy(const std::string &s)
{
return native_external_copy(s.data(), s.size());
}
inline std::unique_ptr<char16_t[]>
ircd::js::native_external_copy(const char *const &s)
{
return native_external_copy(s, strlen(s));
}
inline std::unique_ptr<char16_t[]>
ircd::js::native_external_copy(const char *const &s,
const size_t &len)
{
auto buf(std::make_unique<char16_t[]>(len + 1));
ircd::locale::convert(s, buf.get(), len + 1);
return buf;
}

View file

@ -118,12 +118,15 @@ string::string(const char *const &s)
}
inline
string::string(const char *const &s,
const size_t &len)
ircd::js::string::string(const char *const &s,
const size_t &len)
:JS::Rooted<JSString *>
{
*cx,
JS_NewStringCopyN(*cx, s, len)
*cx, [&s, &len]
{
auto buf(native_external_copy(s, len));
return JS_NewExternalString(*cx, buf.release(), len, &native_external_deleter);
}()
}
{
if(unlikely(!get()))

View file

@ -25,12 +25,6 @@
namespace ircd {
namespace js {
// Fundamental string utils. This is placed here instead of string.h so
// `struct value` can make direct conversions without depending on struct string type
size_t native_size(const JSString *const &);
size_t native(const JSString *const &, char *const &buf, const size_t &max);
std::string native(const JSString *const &);
struct value
:JS::Rooted<JS::Value>
{
@ -210,8 +204,12 @@ inline
value::value(const std::string &s)
:JS::Rooted<JS::Value>
{
*cx,
JS::StringValue(JS_NewStringCopyN(*cx, s.data(), s.size()))
*cx, [&s]
{
auto buf(native_external_copy(s));
const auto ret(JS_NewExternalString(*cx, buf.release(), s.size(), &native_external_deleter));
return JS::StringValue(ret);
}()
}
{
}
@ -220,8 +218,13 @@ inline
value::value(const char *const &s)
:JS::Rooted<JS::Value>
{
*cx,
!s? JS::NullValue() : JS::StringValue(JS_NewStringCopyZ(*cx, s))
*cx, !s? JS::NullValue() : [&s]
{
const auto len(strlen(s));
auto buf(native_external_copy(s, len));
const auto ret(JS_NewExternalString(*cx, buf.release(), len, &native_external_deleter));
return JS::StringValue(ret);
}()
}
{
}

View file

@ -1130,6 +1130,22 @@ const
// ircd/js/value.h
//
///////////////////////////////////////////////////////////////////////////////
//
// ircd/js/native.h
//
namespace ircd {
namespace js {
JSStringFinalizer native_external_deleter
{
native_external_delete
};
} // namespace js
} // namespace ircd
std::string
ircd::js::native(const JSString *const &s)
{
@ -1139,6 +1155,12 @@ ircd::js::native(const JSString *const &s)
return ret;
}
size_t
ircd::js::native_size(const JSString *const &s)
{
return JS_GetStringEncodingLength(*cx, const_cast<JSString *>(s));
}
size_t
ircd::js::native(const JSString *const &s,
char *const &buf,
@ -1154,10 +1176,15 @@ ircd::js::native(const JSString *const &s,
return ret;
}
size_t
ircd::js::native_size(const JSString *const &s)
void
ircd::js::native_external_delete(const JSStringFinalizer *const fin,
char16_t *const buf)
{
return JS_GetStringEncodingLength(*cx, const_cast<JSString *>(s));
log.debug("string delete (fin: %p buf: %p)",
(const void *)fin,
(const void *)buf);
delete[] buf;
}
///////////////////////////////////////////////////////////////////////////////