#include "BehaviorSharedDataJsImplementation.h" #include #include #include #include #include #include #include using namespace gd; BehaviorSharedDataJsImplementation* BehaviorSharedDataJsImplementation::Clone() const { BehaviorSharedDataJsImplementation* clone = new BehaviorSharedDataJsImplementation(*this); // Copy the references to the JS implementations of the functions (because we // want an object cloned from C++ to retain the functions implemented in JS). EM_ASM_INT( { var clone = Module['wrapPointer']( $0, Module['BehaviorSharedDataJsImplementation']); var self = Module['wrapPointer']( $1, Module['BehaviorSharedDataJsImplementation']); clone['getProperties'] = self['getProperties']; clone['updateProperty'] = self['updateProperty']; clone['initializeContent'] = self['initializeContent']; }, (int)clone, (int)this); return clone; } std::map BehaviorSharedDataJsImplementation::GetProperties( const gd::SerializerElement& behaviorSharedDataContent) const { std::map* jsCreatedProperties = nullptr; std::map copiedProperties; jsCreatedProperties = (std::map*)EM_ASM_INT( { var self = Module['getCache']( Module['BehaviorSharedDataJsImplementation'])[$0]; if (!self.hasOwnProperty('getProperties')) throw 'getProperties is not defined on a BehaviorSharedDataJsImplementation.'; var newProperties = self['getProperties'](wrapPointer($1, Module['SerializerElement'])); if (!newProperties) throw 'getProperties returned nothing in a gd::BehaviorSharedDataJsImplementation.'; return getPointer(newProperties); }, (int)this, (int)&behaviorSharedDataContent); copiedProperties = *jsCreatedProperties; delete jsCreatedProperties; return copiedProperties; } bool BehaviorSharedDataJsImplementation::UpdateProperty( gd::SerializerElement& behaviorSharedDataContent, const gd::String& arg0, const gd::String& arg1) { EM_ASM_INT( { var self = Module['getCache']( Module['BehaviorSharedDataJsImplementation'])[$0]; if (!self.hasOwnProperty('updateProperty')) throw 'updateProperty is not defined on a BehaviorSharedDataJsImplementation.'; self['updateProperty'](wrapPointer($1, Module['SerializerElement']), UTF8ToString($2), UTF8ToString($3)); }, (int)this, (int)&behaviorSharedDataContent, arg0.c_str(), arg1.c_str()); return true; } void BehaviorSharedDataJsImplementation::InitializeContent( gd::SerializerElement& behaviorSharedDataContent) { EM_ASM_INT( { var self = Module['getCache']( Module['BehaviorSharedDataJsImplementation'])[$0]; if (!self.hasOwnProperty('initializeContent')) throw 'initializeContent is not defined on a BehaviorSharedDataJsImplementation.'; self['initializeContent'](wrapPointer($1, Module['SerializerElement'])); }, (int)this, (int)&behaviorSharedDataContent); } void BehaviorSharedDataJsImplementation::__destroy__() { // Useless? EM_ASM_INT( { var self = Module['getCache']( Module['BehaviorSharedDataJsImplementation'])[$0]; if (!self.hasOwnProperty('__destroy__')) throw 'a JSImplementation must implement all functions, you forgot BehaviorSharedDataJsImplementation::__destroy__.'; self['__destroy__'](); }, (int)this); }