Hi Ricky,

I am having the same problem. Did you ever find a solution?


On Monday, May 2, 2016 at 12:30:56 AM UTC+2, Ricky wrote:
>
> I've been investigating/playing with Embind and one of the things that 
> currently bothers me is the allow_raw_pointers that I have in locations 
> in my code. Essentially I'm using them in locations where I need the 
> language specific resources to do some work. An example of this could be 
> (but doesn't have to be through the use of Berkley sockets) if I wanted to 
> use JQueries Ajax method to do requests.
>
> The code is below if you want to see but basically we have a pure virtual 
> class IAjaxAdapter and App. In it's constructor App takes a 
> std::shared_ptr<IAjaxAdapter> but since IAjaxAdapter is created by running 
> Module.IAjaxAdapter.implement or Module.IAjaxAdapter.extends, it creates a 
> raw pointer, not a smart pointer and you eventually get the error 
> "BindingError: Passing raw pointer to smart pointer is illegal" which makes 
> complete sense.
>
> So my question is if its possible to wrap or create a smart pointer when 
> using implement or extends from the javascript side so you do not have to 
> use allow_raw_pointers which would open up the internals of your code to 
> possible abuse if those raw pointers are not handled correctly.
>
> Cheers,
> Ricky
>
> ExternalImpl.h
> #pragma once
>
> #include <memory>
> #include <string>
> #include <map>
>
> class IAjaxAdapter
> {
> public:
>  virtual void ajax(std::wstring url, std::map<std::wstring, std::wstring> 
> settings) = 0;
> };
>
> class App
> {
> public:
>  App(std::shared_ptr<IAjaxAdapter> ajaxManager);
> };
>
>
> ExternalImpl.cpp
> #include "ExternalImpl.h"
>
> #ifdef EMSCRIPTEN
> #include <emscripten/bind.h>
>
> using namespace emscripten;
> #endif
>
> App::App(std::shared_ptr<IAjaxAdapter> ajaxManager)
> {
>  ajaxManager->ajax(L"https://kripken.github.io";, {});
> }
>
> #ifdef EMSCRIPTEN
>
> struct IAjaxAdapterWrapper : public wrapper<IAjaxAdapter> {
>  EMSCRIPTEN_WRAPPER(IAjaxAdapterWrapper);
>  void ajax(std::wstring url, std::map<std::wstring, std::wstring> settings
> ) {
>   return call<void>("ajax", url, settings);
>  }
> };
>
> EMSCRIPTEN_BINDINGS(ExternalImpl) {
>  class_<IAjaxAdapter>("IAjaxAdapter")
>   .smart_ptr<std::shared_ptr<IAjaxAdapter>>("IAjaxAdapter")
>   .function("ajax", &IAjaxAdapter::ajax, pure_virtual())
>   .allow_subclass<IAjaxAdapterWrapper>("IAjaxAdapterWrapper")
>   ;
>  class_<App>("App")
>   .smart_ptr_constructor("App", &std::make_shared<App, std::shared_ptr<
> IAjaxAdapter>>)
>   ;
> }
> #endif
>
>
> externalImpl.html
> <HTML>
> <HEAD>
>     <META NAME="GENERATOR" Content="Microsoft Visual Studio">
>     <TITLE></TITLE>
>     <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.2.1.min.js
> " type="text/javascript"></script>
>     <script src="externalImpl.js" type="text/javascript"></script>
>     <script>
>         $(function () {
>             $("#writeToMe").text("Working");
>             var item = new Module.App(Module.IAjaxAdapter.implement({
>                 ajax: function (url, settings) {
>                     $("#writeToMe").text('Ajax function called');
>                 }
>             }));
>         });
>     </script>
> </HEAD>
> <BODY>
>     <div id="writeToMe"></div>
> </BODY>
> </HTML>
>
>
>

-- 
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].
For more options, visit https://groups.google.com/d/optout.

Reply via email to