On Mon, Aug 14, 2023 at 2:40 AM 'Mike Lischke' via emscripten-discuss <
emscripten-discuss@googlegroups.com> wrote:

> One possible workaround is to use the derived class in the bindings, where
> one of its base classes is required. That even works without changing the
> underlying C++ library code. In my case I changed:
>
> class_<CommonTokenStream, base<BufferedTokenStream>>("CommonTokenStream")
> .constructor<TokenSource *>()
> .constructor<TokenSource *, size_t>();
>
> to:
>
> class_<CommonTokenStream, base<BufferedTokenStream>>("CommonTokenStream")
> .constructor<Lexer *>()
> .constructor<Lexer *, size_t>();
>
> That limits the acceptable token source to lexers only, but in my case
> this is acceptable. Any other suggestion is still welcome!
>

This workaround makes sense to me.

I imagine it would be very rare to expose the full details/complexity of
the type hierarchy to JS.  Exposing a simplified hierarchy to JS is
probably the way to go.

cheers,
sam


> On Monday, August 14, 2023 at 11:16:29 AM UTC+2 Mike Lischke wrote:
>
> Hi all,
>
> C++ multiple inheritance is not discussed in the documentation and there
> are only very old issues in the emscripten issue tracker. From what I read
> so far is that multiple inheritance is not supported in embind because JS
> does not support that. That's not false, but MI is used so often in C++
> there must be a workaround (and I'm looking for one).
>
> In my case I have `class Lexer : public Recognizer, public TokenSource
> {}`. In some places I need that lexer as a recognizer and in some I need it
> as token source. My bindings are like this (simplified):
>
> class_<Lexer, base<Recognizer>>("Lexer$Internal")
> .property("mode", &Lexer::mode);
>
> class_<LexerHelper, base<Lexer>>("Lexer")
> .constructor<CharStream *>()
> .allow_subclass<LexerWrapper>("LexerWrapper", constructor<CharStream *
> >());
>
> Since I cannot specify both classes as base in the bindings call, I
> started with `base<Recognizer>` which works fine. However, when I try to
> use the lexer class in a place where a token source is required, I get the
> error:
>
> BindingError: Expected null or instance of TokenSource, got an instance of
> Recognizer at throwBindingError (file:...)
>
> Side note: that approach to use `Lexer$Internal` and `LexerHelper` comes
> from the fact that `Lexer` is an abstract class, but I need to bind its
> constructor to allow calling that from JS where I use the Lexer to derive a
> JS class from. So, I created the (non-abstract) `LexerHelper` class and
> pretend it's the actual lexer class.
>
> IIUC the error is bogus, because the checked class indeed derives from
> both base classes, only JS doesn't know that. What can I do to make this
> scenario work?
>
> I experimented with leaving out the `Lexer` binding entirely (to avoid the
> MI dilemma), but that only caused the generated JS class to be not
> extendable.
>
> Mike
> --
> www.soft-gems.net
>
> --
> 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 emscripten-discuss+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/emscripten-discuss/819aacbf-ea39-46c6-bf8c-a4989cbc3760n%40googlegroups.com
> <https://groups.google.com/d/msgid/emscripten-discuss/819aacbf-ea39-46c6-bf8c-a4989cbc3760n%40googlegroups.com?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 emscripten-discuss+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/emscripten-discuss/CAL_va2-xgR%3DdZcWBrCQcA-_NuzXgij7aikS%3DLp2guvcp21QXhA%40mail.gmail.com.

Reply via email to