I hit the send button too soon. The example error I intended to include is
[ 79%] Building CXX object
CMakeFiles/msc_basis_transcoder_js.dir/interface/js_binding/transcoder_wrapper.cpp.o
/src/interface/js_binding/transcoder_wrapper.cpp:333:49: error: no viable
conversion from 'TranscodedImage *' to 'allow_raw_pointer<TranscodedImage *>'
333 | allow_raw_pointer<TranscodedImage*> dst = new
TranscodedImage(tiByteLength));
| ^
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/emsdk/upstream/emscripten/cache/sysroot/include/emscripten/bind.h:329:8: note:
candidate constructor (the implicit copy constructor) not viable: no known
conversion from 'TranscodedImage *' to 'const
allow_raw_pointer<msc::TranscodedImage *> &' for 1st argument
I do not know how to do a conversion to allow_raw_pointer<TranscodedImage*>. I
also want to avoid a copy on returning this from the native function as the
image is potentially large.
Regards
-Mark
> On May 23, 2025, at 22:04, キャロウ マーク <[email protected]> wrote:
>
> I have embind code that does the following to return something from native to
> JS.
>
> val ret = val::object();
> if (status) {
> ret.set("transcodedImage", dst);
> }
> return ret;
>
> where dst is
>
> TranscodedImage* dst
>
> Since 4.0.9 I get (I've removed the backtrace from my code to the assertion
> statement)
>
> /emsdk/upstream/emscripten/cache/sysroot/include/emscripten/wire.h:124:19:
> error: static assertion failed due to requirement
> '!std::is_pointer<msc::TranscodedImage *>::value': Implicitly binding raw
> pointers is illegal. Specify allow_raw_pointer<arg<?>>
> 124 | static_assert(!std::is_pointer<T*>::value, "Implicitly binding
> raw pointers is illegal. Specify allow_raw_pointer<arg<?>>");
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> ...
> /src/interface/js_binding/transcoder_wrapper.cpp:277:21: note: in
> instantiation of function template specialization
> 'emscripten::val::set<char[16], msc::TranscodedImage *>' requested here
> 277 | ret.set("transcodedImage", dst);
> | ^
>
>
> I cannot figure out how to specify `allow_raw_pointer`. I added `,
> allow_raw_pointers()` to the end of the function declaration in the
> EMSCRIPTEN_BINDINGS section but I got the same error. I have tried to use
> `allow_raw_pointer` template with TranscodedImage* as the arg in various ways
> but I am clearly not doing it the right way. I get a log of different errors.
> For example
>
> What is the right way?
>
> The documentation did not help.
> https://emscripten.org/docs/api_reference/bind.h.html#how-to-use-this-api
> just says "type allow_raw_pointer” under a heading of “Policies.”
> https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html#embind
> does not even mention `allow_raw_pointer`.
>
> For reference the declaration of TranscodeImage is
>
> class TranscodedImage {
> public:
> TranscodedImage(size_t size) : image(size) { }
>
> uint8_t* data() { return image.data(); }
> size_t size() { return image.size(); }
>
> val get_typed_memory_view() {
> return val(typed_memory_view(image.size(), image.data()));
> }
>
> protected:
> std::vector<uint8_t> image;
> };
>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected]
> <mailto:[email protected]>.
> To view this discussion visit
> https://groups.google.com/d/msgid/emscripten-discuss/62902311-A081-4F3C-A2F1-389655F18E5E%40callow.im
>
> <https://groups.google.com/d/msgid/emscripten-discuss/62902311-A081-4F3C-A2F1-389655F18E5E%40callow.im?utm_medium=email&utm_source=footer>.
--
You received this message because you are subscribed to the Google Groups
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/emscripten-discuss/1E5EADD3-6669-49A8-8B11-8EC752B5721B%40callow.im.
signature.asc
Description: Message signed with OpenPGP
