Comments (1)
With deeping into the source code these days, I know what js_traits do gradually.
js_traits::wrap
is used to transform C++ object to JS object,js_traits::unwrap
is used to transform JS object to C++ object.
The special of unique_ptr decides that there isn't a certain solution to solve this problem.
When we use unique_ptr to point our object, we own the ownership of this object.
My solution is to use a global map to manage the ownership of objects used in js_traits.
- When we use
js_traits::wrap
, we should transfer object ownership from unique_ptr to the global map, then usejs_traits<T*>::wrap
to transfrom raw ptr to JS object. - When we use
js_traits::unwrap
, we should get object ownership back from the global map, return it to user.
template <class T>
struct js_traits<std::unique_ptr<T>> {
static JSValue wrap(JSContext* ctx, std::unique_ptr<T> val) noexcept {
T* raw_ptr = val.get();
// transfer ownership to the global map which saves ownership temporately
GetOwnershipMgr<T>()->ShiftOwner(std::move(val));
// transform C++ object to JS object
return js_traits<T*>::wrap(ctx, raw_ptr);
}
static std::unique_ptr<T> unwrap(JSContext* ctx, JSValueConst v)
{
std::unique_ptr<T> ptr = nullptr;
if (JS_IsNull(v)) {
return ptr;
}
// transform JS object to C++ object by js_traits<std::shared_ptr<T>>
auto shared_ptr = js_traits<std::shared_ptr<T>>::unwrap(ctx, v);
// get and return ownership to user from the global map
return GetOwnershipMgr<T>()->GetOwner(shared_ptr.get());
}
};
Above is just a simple thought to solve my problem, if you find some problems or better solutions, please feel free to comment.
from quickjspp.
Related Issues (20)
- Binding a callback (std::function) causes runtime error HOT 11
- How to implement a variadic (const) compound type for List and Map
- Number of arguments are not checked when calling a function HOT 1
- Support of `make install`...?
- Share Value between contexts HOT 1
- 'this' is undefined when calling static JS class method from C++ HOT 2
- how to resolve "The property "PUBLIC_HEADER" is not allowed"
- Updated MSVC branch HOT 5
- Does QuickJS support multithreading?
- wrap is not a member of qjs::js_traits<MyCustomClass,void> HOT 5
- Simpler way to call js_init_module_os() HOT 2
- JavaScript inheritance from C++ class HOT 1
- How do I export all the classes in a module?
- Will this project continue to update?
- MSVC cannot find qjs::rest HOT 1
- Test cases of QuickJS execution failed HOT 2
- std::variant and JS null HOT 2
- Optional arguments HOT 2
- Use https://github.com/quickjs-ng/quickjs instead?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from quickjspp.