| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent dcba3a0 commit 6b60f38
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -13,7 +13,6 @@ const { | |||
| 13 | 13 | StringPrototypeSlice, | |
| 14 | 14 | Symbol, | |
| 15 | 15 | SymbolToStringTag, | |
| 16 | - Uint32Array, | ||
| 17 | 16 | Uint8Array, | |
| 18 | 17 | } = primordials; | |
| 19 | 18 | ||
@@ -49,12 +48,12 @@ const { | |||
| 49 | 48 | validateString, | |
| 50 | 49 | validateObject, | |
| 51 | 50 | } = require('internal/validators'); | |
| 52 | - | ||
| 51 | + const binding = internalBinding('encoding_binding'); | ||
| 53 | 52 | const { | |
| 54 | 53 | encodeInto, | |
| 55 | 54 | encodeUtf8String, | |
| 56 | 55 | decodeUTF8, | |
| 57 | - } = internalBinding('encoding_binding'); | ||
| 56 | + } = binding; | ||
| 58 | 57 | ||
| 59 | 58 | const { Buffer } = require('buffer'); | |
| 60 | 59 | ||
@@ -318,8 +317,6 @@ function getEncodingFromLabel(label) { | |||
| 318 | 317 | return encodings.get(trimAsciiWhitespace(label.toLowerCase())); | |
| 319 | 318 | } | |
| 320 | 319 | ||
| 321 | - const encodeIntoResults = new Uint32Array(2); | ||
| 322 | - | ||
| 323 | 320 | class TextEncoder { | |
| 324 | 321 | constructor() { | |
| 325 | 322 | this[kEncoder] = true; | |
@@ -340,8 +337,12 @@ class TextEncoder { | |||
| 340 | 337 | validateString(src, 'src'); | |
| 341 | 338 | if (!dest || !isUint8Array(dest)) | |
| 342 | 339 | throw new ERR_INVALID_ARG_TYPE('dest', 'Uint8Array', dest); | |
| 343 | - encodeInto(src, dest, encodeIntoResults); | ||
| 344 | - return { read: encodeIntoResults[0], written: encodeIntoResults[1] }; | ||
| 340 | + | ||
| 341 | + encodeInto(src, dest); | ||
| 342 | + // We need to read from the binding here since the buffer gets refreshed | ||
| 343 | + // from the snapshot. | ||
| 344 | + const { 0: read, 1: written } = binding.encodeIntoResults; | ||
| 345 | + return { read, written }; | ||
| 345 | 346 | } | |
| 346 | 347 | ||
| 347 | 348 | [inspect](depth, opts) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -20,15 +20,30 @@ using v8::Local; | |||
| 20 | 20 | using v8::MaybeLocal; | |
| 21 | 21 | using v8::Object; | |
| 22 | 22 | using v8::String; | |
| 23 | - using v8::Uint8Array; | ||
| 24 | 23 | using v8::Uint32Array; | |
| 24 | + using v8::Uint8Array; | ||
| 25 | 25 | using v8::Value; | |
| 26 | 26 | ||
| 27 | - BindingData::BindingData(Environment* env, Local<Object> object) | ||
| 28 | - : SnapshotableObject(env, object, type_int) {} | ||
| 27 | + void BindingData::MemoryInfo(MemoryTracker* tracker) const { | ||
| 28 | + tracker->TrackField("encode_into_results_buffer", | ||
| 29 | + encode_into_results_buffer_); | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + BindingData::BindingData(Realm* realm, v8::Local<v8::Object> object) | ||
| 33 | + : SnapshotableObject(realm, object, type_int), | ||
| 34 | + encode_into_results_buffer_(realm->isolate(), kEncodeIntoResultsLength) { | ||
| 35 | + object | ||
| 36 | + ->Set(realm->context(), | ||
| 37 | + FIXED_ONE_BYTE_STRING(realm->isolate(), "encodeIntoResults"), | ||
| 38 | + encode_into_results_buffer_.GetJSArray()) | ||
| 39 | + .Check(); | ||
| 40 | + } | ||
| 29 | 41 | ||
| 30 | 42 | bool BindingData::PrepareForSerialization(Local<Context> context, | |
| 31 | 43 | v8::SnapshotCreator* creator) { | |
| 44 | + // We'll just re-initialize the buffers in the constructor since their | ||
| 45 | + // contents can be thrown away once consumed in the previous call. | ||
| 46 | + encode_into_results_buffer_.Release(); | ||
| 32 | 47 | // Return true because we need to maintain the reference to the binding from | |
| 33 | 48 | // JS land. | |
| 34 | 49 | return true; | |
@@ -47,19 +62,19 @@ void BindingData::Deserialize(Local<Context> context, | |||
| 47 | 62 | InternalFieldInfoBase* info) { | |
| 48 | 63 | DCHECK_EQ(index, BaseObject::kEmbedderType); | |
| 49 | 64 | v8::HandleScope scope(context->GetIsolate()); | |
| 50 | - Environment* env = Environment::GetCurrent(context); | ||
| 65 | + Realm* realm = Realm::GetCurrent(context); | ||
| 51 | 66 | // Recreate the buffer in the constructor. | |
| 52 | - BindingData* binding = env->AddBindingData<BindingData>(context, holder); | ||
| 67 | + BindingData* binding = realm->AddBindingData<BindingData>(context, holder); | ||
| 53 | 68 | CHECK_NOT_NULL(binding); | |
| 54 | 69 | } | |
| 55 | 70 | ||
| 56 | 71 | void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) { | |
| 57 | 72 | Environment* env = Environment::GetCurrent(args); | |
| 58 | 73 | Isolate* isolate = env->isolate(); | |
| 59 | - CHECK_GE(args.Length(), 3); | ||
| 74 | + CHECK_GE(args.Length(), 2); | ||
| 60 | 75 | CHECK(args[0]->IsString()); | |
| 61 | 76 | CHECK(args[1]->IsUint8Array()); | |
| 62 | - CHECK(args[2]->IsUint32Array()); | ||
| 77 | + BindingData* binding_data = Realm::GetBindingData<BindingData>(args); | ||
| 63 | 78 | ||
| 64 | 79 | Local<String> source = args[0].As<String>(); | |
| 65 | 80 | ||
@@ -68,21 +83,16 @@ void BindingData::EncodeInto(const FunctionCallbackInfo<Value>& args) { | |||
| 68 | 83 | char* write_result = static_cast<char*>(buf->Data()) + dest->ByteOffset(); | |
| 69 | 84 | size_t dest_length = dest->ByteLength(); | |
| 70 | 85 | ||
| 71 | - // results = [ read, written ] | ||
| 72 | - Local<Uint32Array> result_arr = args[2].As<Uint32Array>(); | ||
| 73 | - uint32_t* results = reinterpret_cast<uint32_t*>( | ||
| 74 | - static_cast<char*>(result_arr->Buffer()->Data()) + | ||
| 75 | - result_arr->ByteOffset()); | ||
| 76 | - | ||
| 77 | 86 | int nchars; | |
| 78 | 87 | int written = source->WriteUtf8( | |
| 79 | 88 | isolate, | |
| 80 | 89 | write_result, | |
| 81 | 90 | dest_length, | |
| 82 | 91 | &nchars, | |
| 83 | 92 | String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8); | |
| 84 | - results[0] = nchars; | ||
| 85 | - results[1] = written; | ||
| 93 | + | ||
| 94 | + binding_data->encode_into_results_buffer_[0] = nchars; | ||
| 95 | + binding_data->encode_into_results_buffer_[1] = written; | ||
| 86 | 96 | } | |
| 87 | 97 | ||
| 88 | 98 | // Encode a single string to a UTF-8 Uint8Array (not Buffer). | |
@@ -175,9 +185,9 @@ void BindingData::Initialize(Local<Object> target, | |||
| 175 | 185 | Local<Value> unused, | |
| 176 | 186 | Local<Context> context, | |
| 177 | 187 | void* priv) { | |
| 178 | - Environment* env = Environment::GetCurrent(context); | ||
| 188 | + Realm* realm = Realm::GetCurrent(context); | ||
| 179 | 189 | BindingData* const binding_data = | |
| 180 | - env->AddBindingData<BindingData>(context, target); | ||
| 190 | + realm->AddBindingData<BindingData>(context, target); | ||
| 181 | 191 | if (binding_data == nullptr) return; | |
| 182 | 192 | ||
| 183 | 193 | SetMethod(context, target, "encodeInto", EncodeInto); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -14,14 +14,14 @@ class ExternalReferenceRegistry; | |||
| 14 | 14 | namespace encoding_binding { | |
| 15 | 15 | class BindingData : public SnapshotableObject { | |
| 16 | 16 | public: | |
| 17 | - BindingData(Environment* env, v8::Local<v8::Object> obj); | ||
| 17 | + BindingData(Realm* realm, v8::Local<v8::Object> obj); | ||
| 18 | 18 | ||
| 19 | 19 | using InternalFieldInfo = InternalFieldInfoBase; | |
| 20 | 20 | ||
| 21 | 21 | SERIALIZABLE_OBJECT_METHODS() | |
| 22 | 22 | SET_BINDING_ID(encoding_binding_data) | |
| 23 | 23 | ||
| 24 | - SET_NO_MEMORY_INFO() | ||
| 24 | + void MemoryInfo(MemoryTracker* tracker) const override; | ||
| 25 | 25 | SET_SELF_SIZE(BindingData) | |
| 26 | 26 | SET_MEMORY_INFO_NAME(BindingData) | |
| 27 | 27 | ||
@@ -35,6 +35,10 @@ class BindingData : public SnapshotableObject { | |||
| 35 | 35 | void* priv); | |
| 36 | 36 | static void RegisterTimerExternalReferences( | |
| 37 | 37 | ExternalReferenceRegistry* registry); | |
| 38 | + | ||
| 39 | + private: | ||
| 40 | + static constexpr size_t kEncodeIntoResultsLength = 2; | ||
| 41 | + AliasedUint32Array encode_into_results_buffer_; | ||
| 38 | 42 | }; | |
| 39 | 43 | ||
| 40 | 44 | } // namespace encoding_binding | |
| Back | FazBrowse Home | New Git URL |
0 commit comments