| OLD | NEW | 
|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/value-serializer.h" | 5 #include "src/value-serializer.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <string> | 8 #include <string> | 
| 9 | 9 | 
| 10 #include "include/v8.h" | 10 #include "include/v8.h" | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 57   const Local<Context>& serialization_context() { | 57   const Local<Context>& serialization_context() { | 
| 58     return serialization_context_; | 58     return serialization_context_; | 
| 59   } | 59   } | 
| 60   const Local<Context>& deserialization_context() { | 60   const Local<Context>& deserialization_context() { | 
| 61     return deserialization_context_; | 61     return deserialization_context_; | 
| 62   } | 62   } | 
| 63 | 63 | 
| 64   // Overridden in more specific fixtures. | 64   // Overridden in more specific fixtures. | 
| 65   virtual ValueSerializer::Delegate* GetSerializerDelegate() { return nullptr; } | 65   virtual ValueSerializer::Delegate* GetSerializerDelegate() { return nullptr; } | 
| 66   virtual void BeforeEncode(ValueSerializer*) {} | 66   virtual void BeforeEncode(ValueSerializer*) {} | 
|  | 67   virtual void AfterEncode() {} | 
| 67   virtual ValueDeserializer::Delegate* GetDeserializerDelegate() { | 68   virtual ValueDeserializer::Delegate* GetDeserializerDelegate() { | 
| 68     return nullptr; | 69     return nullptr; | 
| 69   } | 70   } | 
| 70   virtual void BeforeDecode(ValueDeserializer*) {} | 71   virtual void BeforeDecode(ValueDeserializer*) {} | 
| 71 | 72 | 
| 72   template <typename InputFunctor, typename OutputFunctor> | 73   template <typename InputFunctor, typename OutputFunctor> | 
| 73   void RoundTripTest(const InputFunctor& input_functor, | 74   void RoundTripTest(const InputFunctor& input_functor, | 
| 74                      const OutputFunctor& output_functor) { | 75                      const OutputFunctor& output_functor) { | 
| 75     EncodeTest(input_functor, | 76     EncodeTest(input_functor, | 
| 76                [this, &output_functor](const std::vector<uint8_t>& data) { | 77                [this, &output_functor](const std::vector<uint8_t>& data) { | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 102   } | 103   } | 
| 103 | 104 | 
| 104   Maybe<std::vector<uint8_t>> DoEncode(Local<Value> value) { | 105   Maybe<std::vector<uint8_t>> DoEncode(Local<Value> value) { | 
| 105     Local<Context> context = serialization_context(); | 106     Local<Context> context = serialization_context(); | 
| 106     ValueSerializer serializer(isolate(), GetSerializerDelegate()); | 107     ValueSerializer serializer(isolate(), GetSerializerDelegate()); | 
| 107     BeforeEncode(&serializer); | 108     BeforeEncode(&serializer); | 
| 108     serializer.WriteHeader(); | 109     serializer.WriteHeader(); | 
| 109     if (!serializer.WriteValue(context, value).FromMaybe(false)) { | 110     if (!serializer.WriteValue(context, value).FromMaybe(false)) { | 
| 110       return Nothing<std::vector<uint8_t>>(); | 111       return Nothing<std::vector<uint8_t>>(); | 
| 111     } | 112     } | 
|  | 113     AfterEncode(); | 
| 112     return Just(serializer.ReleaseBuffer()); | 114     return Just(serializer.ReleaseBuffer()); | 
| 113   } | 115   } | 
| 114 | 116 | 
| 115   template <typename InputFunctor, typename EncodedDataFunctor> | 117   template <typename InputFunctor, typename EncodedDataFunctor> | 
| 116   void EncodeTest(const InputFunctor& input_functor, | 118   void EncodeTest(const InputFunctor& input_functor, | 
| 117                   const EncodedDataFunctor& encoded_data_functor) { | 119                   const EncodedDataFunctor& encoded_data_functor) { | 
| 118     Context::Scope scope(serialization_context()); | 120     Context::Scope scope(serialization_context()); | 
| 119     TryCatch try_catch(isolate()); | 121     TryCatch try_catch(isolate()); | 
| 120     Local<Value> input_value = input_functor(); | 122     Local<Value> input_value = input_functor(); | 
| 121     std::vector<uint8_t> buffer; | 123     std::vector<uint8_t> buffer; | 
| (...skipping 1611 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1733 // Includes an ArrayBuffer wrapper marked for transfer from the serialization | 1735 // Includes an ArrayBuffer wrapper marked for transfer from the serialization | 
| 1734 // context to the deserialization context. | 1736 // context to the deserialization context. | 
| 1735 class ValueSerializerTestWithArrayBufferTransfer : public ValueSerializerTest { | 1737 class ValueSerializerTestWithArrayBufferTransfer : public ValueSerializerTest { | 
| 1736  protected: | 1738  protected: | 
| 1737   static const size_t kTestByteLength = 4; | 1739   static const size_t kTestByteLength = 4; | 
| 1738 | 1740 | 
| 1739   ValueSerializerTestWithArrayBufferTransfer() { | 1741   ValueSerializerTestWithArrayBufferTransfer() { | 
| 1740     { | 1742     { | 
| 1741       Context::Scope scope(serialization_context()); | 1743       Context::Scope scope(serialization_context()); | 
| 1742       input_buffer_ = ArrayBuffer::New(isolate(), nullptr, 0); | 1744       input_buffer_ = ArrayBuffer::New(isolate(), nullptr, 0); | 
| 1743       input_buffer_->Neuter(); |  | 
| 1744     } | 1745     } | 
| 1745     { | 1746     { | 
| 1746       Context::Scope scope(deserialization_context()); | 1747       Context::Scope scope(deserialization_context()); | 
| 1747       output_buffer_ = ArrayBuffer::New(isolate(), kTestByteLength); | 1748       output_buffer_ = ArrayBuffer::New(isolate(), kTestByteLength); | 
| 1748       const uint8_t data[kTestByteLength] = {0x00, 0x01, 0x80, 0xff}; | 1749       const uint8_t data[kTestByteLength] = {0x00, 0x01, 0x80, 0xff}; | 
| 1749       memcpy(output_buffer_->GetContents().Data(), data, kTestByteLength); | 1750       memcpy(output_buffer_->GetContents().Data(), data, kTestByteLength); | 
| 1750     } | 1751     } | 
| 1751   } | 1752   } | 
| 1752 | 1753 | 
| 1753   const Local<ArrayBuffer>& input_buffer() { return input_buffer_; } | 1754   const Local<ArrayBuffer>& input_buffer() { return input_buffer_; } | 
| 1754   const Local<ArrayBuffer>& output_buffer() { return output_buffer_; } | 1755   const Local<ArrayBuffer>& output_buffer() { return output_buffer_; } | 
| 1755 | 1756 | 
| 1756   void BeforeEncode(ValueSerializer* serializer) override { | 1757   void BeforeEncode(ValueSerializer* serializer) override { | 
| 1757     serializer->TransferArrayBuffer(0, input_buffer_); | 1758     serializer->TransferArrayBuffer(0, input_buffer_); | 
| 1758   } | 1759   } | 
| 1759 | 1760 | 
|  | 1761   void AfterEncode() override { input_buffer_->Neuter(); } | 
|  | 1762 | 
| 1760   void BeforeDecode(ValueDeserializer* deserializer) override { | 1763   void BeforeDecode(ValueDeserializer* deserializer) override { | 
| 1761     deserializer->TransferArrayBuffer(0, output_buffer_); | 1764     deserializer->TransferArrayBuffer(0, output_buffer_); | 
| 1762   } | 1765   } | 
| 1763 | 1766 | 
| 1764  private: | 1767  private: | 
| 1765   Local<ArrayBuffer> input_buffer_; | 1768   Local<ArrayBuffer> input_buffer_; | 
| 1766   Local<ArrayBuffer> output_buffer_; | 1769   Local<ArrayBuffer> output_buffer_; | 
| 1767 }; | 1770 }; | 
| 1768 | 1771 | 
| 1769 TEST_F(ValueSerializerTestWithArrayBufferTransfer, | 1772 TEST_F(ValueSerializerTestWithArrayBufferTransfer, | 
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2364       "({ a: new ExampleHostObject(), get b() { return this.a; }})", | 2367       "({ a: new ExampleHostObject(), get b() { return this.a; }})", | 
| 2365       [this](Local<Value> value) { | 2368       [this](Local<Value> value) { | 
| 2366         EXPECT_TRUE(EvaluateScriptForResultBool( | 2369         EXPECT_TRUE(EvaluateScriptForResultBool( | 
| 2367             "result.a instanceof ExampleHostObject")); | 2370             "result.a instanceof ExampleHostObject")); | 
| 2368         EXPECT_TRUE(EvaluateScriptForResultBool("result.a === result.b")); | 2371         EXPECT_TRUE(EvaluateScriptForResultBool("result.a === result.b")); | 
| 2369       }); | 2372       }); | 
| 2370 } | 2373 } | 
| 2371 | 2374 | 
| 2372 }  // namespace | 2375 }  // namespace | 
| 2373 }  // namespace v8 | 2376 }  // namespace v8 | 
| OLD | NEW | 
|---|