mirror of https://github.com/nodejs/node.git
string_bytes: introduce InlineDecoder
PR-URL: https://github.com/iojs/io.js/pull/664 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>pull/668/head
parent
c6367e7f2a
commit
aca2011251
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
#include "v8.h"
|
#include "v8.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
#include "env.h"
|
||||||
|
#include "env-inl.h"
|
||||||
|
|
||||||
namespace node {
|
namespace node {
|
||||||
|
|
||||||
|
@ -12,6 +14,51 @@ extern int WRITE_UTF8_FLAGS;
|
||||||
|
|
||||||
class StringBytes {
|
class StringBytes {
|
||||||
public:
|
public:
|
||||||
|
class InlineDecoder {
|
||||||
|
public:
|
||||||
|
InlineDecoder() : out_(nullptr) {
|
||||||
|
}
|
||||||
|
|
||||||
|
~InlineDecoder() {
|
||||||
|
if (out_ != out_st_)
|
||||||
|
delete[] out_;
|
||||||
|
out_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Decode(Environment* env,
|
||||||
|
v8::Handle<v8::String> string,
|
||||||
|
v8::Handle<v8::Value> encoding,
|
||||||
|
enum encoding _default) {
|
||||||
|
enum encoding enc = ParseEncoding(env->isolate(), encoding, _default);
|
||||||
|
if (!StringBytes::IsValidString(env->isolate(), string, enc)) {
|
||||||
|
env->ThrowTypeError("Bad input string");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t buflen = StringBytes::StorageSize(env->isolate(), string, enc);
|
||||||
|
if (buflen > sizeof(out_st_))
|
||||||
|
out_ = new char[buflen];
|
||||||
|
else
|
||||||
|
out_ = out_st_;
|
||||||
|
size_ = StringBytes::Write(env->isolate(),
|
||||||
|
out_,
|
||||||
|
buflen,
|
||||||
|
string,
|
||||||
|
enc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const char* out() const { return out_; }
|
||||||
|
inline size_t size() const { return size_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const int kStorageSize = 1024;
|
||||||
|
|
||||||
|
char out_st_[kStorageSize];
|
||||||
|
char* out_;
|
||||||
|
size_t size_;
|
||||||
|
};
|
||||||
|
|
||||||
// Does the string match the encoding? Quick but non-exhaustive.
|
// Does the string match the encoding? Quick but non-exhaustive.
|
||||||
// Example: a HEX string must have a length that's a multiple of two.
|
// Example: a HEX string must have a length that's a multiple of two.
|
||||||
// FIXME(bnoordhuis) IsMaybeValidString()? Naming things is hard...
|
// FIXME(bnoordhuis) IsMaybeValidString()? Naming things is hard...
|
||||||
|
|
Loading…
Reference in New Issue