Skip to content

Commit

Permalink
Merge pull request emscripten-core#2962 from FishingCactus/embind_imp…
Browse files Browse the repository at this point in the history
…rovements

Embind improvements
  • Loading branch information
chadaustin committed Nov 13, 2014
2 parents a7b7398 + e90043c commit 0b24893
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 31 deletions.
8 changes: 6 additions & 2 deletions src/embind/emval.js
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,12 @@ var LibraryEmVal = {
$emval_get_global: function() { return (function(){return Function;})()('return this')(); },
_emval_get_global__deps: ['_emval_register', '$getStringOrSymbol', '$emval_get_global'],
_emval_get_global: function(name) {
name = getStringOrSymbol(name);
return __emval_register(emval_get_global()[name]);
if(name===0){
return __emval_register(emval_get_global());
} else {
name = getStringOrSymbol(name);
return __emval_register(emval_get_global()[name]);
}
},

_emval_get_module_property__deps: ['$getStringOrSymbol', '_emval_register'],
Expand Down
61 changes: 32 additions & 29 deletions system/include/emscripten/val.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,14 @@


namespace emscripten {

class val;

namespace internal {

template<typename WrapperType>
val wrapped_extend(const std::string&, const val&);

// Implemented in JavaScript. Don't call these directly.
extern "C" {
void _emval_register_symbol(const char*);
Expand Down Expand Up @@ -293,7 +300,7 @@ namespace emscripten {
return val(e);
}

static val global(const char* name) {
static val global(const char* name = 0) {
return val(internal::_emval_get_global(name));
}

Expand Down Expand Up @@ -378,20 +385,9 @@ namespace emscripten {

template<typename... Args>
val new_(Args&&... args) const {
using namespace internal;

WithPolicies<>::ArgTypeList<Args...> argList;
WireTypePack<Args...> argv(std::forward<Args>(args)...);
// todo: this is awfully similar to operator(), can we
// merge them somehow?
return val(
_emval_new(
handle,
argList.getCount(),
argList.getTypes(),
argv));
return internalCall(internal::_emval_new,std::forward<Args>(args)...);
}

template<typename T>
val operator[](const T& key) const {
return val(internal::_emval_get_property(handle, val(key).handle));
Expand All @@ -409,16 +405,7 @@ namespace emscripten {

template<typename... Args>
val operator()(Args&&... args) {
using namespace internal;

WithPolicies<>::ArgTypeList<Args...> argList;
WireTypePack<Args...> argv(std::forward<Args>(args)...);
return val(
_emval_call(
handle,
argList.getCount(),
argList.getTypes(),
argv));
return internalCall(internal::_emval_call, std::forward<Args>(args)...);
}

template<typename ReturnValue, typename... Args>
Expand All @@ -443,11 +430,6 @@ namespace emscripten {
return fromGenericWireType<T>(result);
}

// private: TODO: use a friend?
internal::EM_VAL __get_handle() const {
return handle;
}

val typeof() const {
return val(_emval_typeof(handle));
}
Expand All @@ -458,6 +440,27 @@ namespace emscripten {
: handle(handle)
{}

template<typename WrapperType>
friend val internal::wrapped_extend(const std::string& , const val& );

internal::EM_VAL __get_handle() const {
return handle;
}

template<typename Implementation, typename... Args>
val internalCall(Implementation impl, Args&&... args)const {
using namespace internal;

WithPolicies<>::ArgTypeList<Args...> argList;
WireTypePack<Args...> argv(std::forward<Args>(args)...);
return val(
impl(
handle,
argList.getCount(),
argList.getTypes(),
argv));
}

internal::EM_VAL handle;

friend struct internal::BindingType<val>;
Expand Down
4 changes: 4 additions & 0 deletions tests/embind/embind.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,10 @@ module({
cm.emval_test_take_and_return_std_string_const_ref("foobar");
});

test("can get global", function(){
assert.equal((new Function("return this;"))(), cm.embind_test_getglobal());
});

test("can create new object", function() {
assert.deepEqual({}, cm.embind_test_new_Object());
});
Expand Down
6 changes: 6 additions & 0 deletions tests/embind/embind_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1139,6 +1139,10 @@ void test_string_with_vec(const std::string& p1, std::vector<std::string>& v1) {
printf("%s\n", p1.c_str());
}

val embind_test_getglobal() {
return val::global();
}

val embind_test_new_Object() {
return val::global("Object").new_();
}
Expand Down Expand Up @@ -2001,6 +2005,8 @@ EMSCRIPTEN_BINDINGS(tests) {
register_map<std::string, int>("StringIntMap");
function("embind_test_get_string_int_map", embind_test_get_string_int_map);

function("embind_test_getglobal", &embind_test_getglobal);

function("embind_test_new_Object", &embind_test_new_Object);
function("embind_test_new_factory", &embind_test_new_factory);

Expand Down

0 comments on commit 0b24893

Please sign in to comment.