Skip to content

Commit

Permalink
core, refactor: merge allocations of data blocks and BackingStore obj…
Browse files Browse the repository at this point in the history
…ects.
  • Loading branch information
xicilion committed May 25, 2023
1 parent 250c3ee commit 90b04aa
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 12 deletions.
5 changes: 0 additions & 5 deletions fibjs/include/object.h
Expand Up @@ -181,11 +181,6 @@ class object_base : public obj_base {
final_release(this);
}

static void StoreDeleter(void* data, size_t length, void* deleter_data)
{
delete[] (uint8_t*)data;
}

public:
class scope {
public:
Expand Down
5 changes: 4 additions & 1 deletion fibjs/include/v8_api.h
Expand Up @@ -30,6 +30,9 @@ void WriteLcovData(v8::Isolate* isolate, FILE* file);
bool isFrozen(v8::Local<v8::Object> object);
void setAsyncFunctoin(v8::Local<v8::Function> func);

void* fetch_store_data(std::shared_ptr<v8::BackingStore> backing_store, v8::BackingStore::DeleterCallback deleter = NULL);
void* fetch_store_data(std::shared_ptr<v8::BackingStore>& backing_store);
std::unique_ptr<v8::BackingStore> NewBackingStore(size_t byte_length, void* deleter_data);

void keep_alive(void* object);

} /* namespace fibjs */
2 changes: 1 addition & 1 deletion fibjs/src/base/object.cpp
Expand Up @@ -50,7 +50,7 @@ void* object_base::unwrap(v8::Local<v8::Value> o)
return NULL;
v8::Local<v8::Uint8Array> arr = obj.As<v8::Uint8Array>();
std::shared_ptr<v8::BackingStore> store = arr->Buffer()->GetBackingStore();
return fetch_store_data(store, StoreDeleter);
return fetch_store_data(store);
}

if (obj->InternalFieldCount() != 1)
Expand Down
24 changes: 22 additions & 2 deletions fibjs/src/base/v8_api.cpp
Expand Up @@ -66,14 +66,34 @@ void setAsyncFunctoin(Local<Function> func)
_func->shared().set_kind(i::FunctionKind::kAsyncFunction);
}

void* fetch_store_data(std::shared_ptr<v8::BackingStore> backing_store, v8::BackingStore::DeleterCallback deleter)
static void s_store_deleter(void* data, size_t length, void* deleter_data)
{
}

void* fetch_store_data(std::shared_ptr<v8::BackingStore>& backing_store)
{
auto store = reinterpret_cast<const i::BackingStore*>(backing_store.get());
if (!deleter || deleter == store->type_specific_data_.deleter.callback)
if (s_store_deleter == store->type_specific_data_.deleter.callback)
return store->type_specific_data_.deleter.data;
return NULL;
}

std::unique_ptr<v8::BackingStore> NewBackingStore(size_t byte_length, void* deleter_data)
{
CHECK_LE(byte_length, i::JSArrayBuffer::kMaxByteLength);

uint8_t* data = new uint8_t[byte_length + sizeof(i::BackingStore)];
auto result = new ((i::BackingStore*)data) i::BackingStore(data + sizeof(i::BackingStore), byte_length, byte_length, byte_length,
i::SharedFlag::kNotShared, i::ResizableFlag::kNotResizable, false, true, false, true, false);
result->type_specific_data_.deleter = { s_store_deleter, deleter_data };

return std::unique_ptr<v8::BackingStore>((v8::BackingStore*)result);
}

void keep_alive(void* object)
{
}

// void* get_custom_ptr(Local<ArrayBufferView> view)
// {
// i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(*view);
Expand Down
5 changes: 2 additions & 3 deletions fibjs/src/global/Buffer.cpp
Expand Up @@ -223,11 +223,10 @@ result_t Buffer_base::concat(v8::Local<v8::Array> buflist, int32_t cutLength, ob

void Buffer::init(const void* data, size_t length)
{
uint8_t* buffer = new uint8_t[length];
m_store = NewBackingStore(length, this);
if (data)
memcpy(buffer, data, length);
memcpy(Buffer::data(), data, Buffer::length());

m_store = v8::ArrayBuffer::NewBackingStore(buffer, length, StoreDeleter, this);
extMemory(length);
}

Expand Down

0 comments on commit 90b04aa

Please sign in to comment.