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