| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| #pragma once |
| |
| namespace Js |
| { |
| class ByteBlock |
| { |
| DECLARE_OBJECT(ByteBlock) |
| |
| private: |
| Field(uint) m_contentSize; // Length of block, in bytes |
| |
| __declspec(align(4)) // Align the buffer to sizeof(uint32) to improve GetHashCode() perf. |
| Field(byte*) m_content; // The block's content |
| |
| static ByteBlock* New(Recycler* alloc, const byte * initialContent, int initialContentSize, ScriptContext * requestContext); |
| |
| public: |
| ByteBlock(uint size, byte * content) |
| : m_contentSize(size), m_content(content) |
| { } |
| ByteBlock(uint size, Recycler *alloc) : m_contentSize(size) |
| { |
| // The New function below will copy over a buffer into this so |
| // we don't need to zero it out |
| m_content = RecyclerNewArrayLeaf(alloc, byte, size); |
| } |
| |
| ByteBlock(uint size, ArenaAllocator* alloc) : m_contentSize(size) |
| { |
| m_content = AnewArray(alloc, byte, size); |
| } |
| |
| static DWORD GetBufferOffset() { return offsetof(ByteBlock, m_content); } |
| |
| static ByteBlock* New(Recycler* alloc, const byte * initialContent, int initialContentSize); |
| |
| // This is needed just for the debugger since it allocates |
| // the byte block on a separate thread, which the recycler doesn't like. |
| // To remove when the recycler supports multi-threaded allocation. |
| static ByteBlock* NewFromArena(ArenaAllocator* alloc, const byte * initialContent, int initialContentSize); |
| |
| uint GetLength() const; |
| byte* GetBuffer(); |
| const byte* GetBuffer() const; |
| const byte operator[](uint itemIndex) const; |
| byte& operator[] (uint itemIndex); |
| }; |
| } // namespace Js |