diff options
author | Ben Becker <ben.becker@10gen.com> | 2013-03-29 17:21:39 -0700 |
---|---|---|
committer | Ben Becker <ben.becker@10gen.com> | 2013-03-29 17:23:18 -0700 |
commit | f00104e92fc12bf6fc85edbdb30c0d3b6250a954 (patch) | |
tree | 405ef7fa9dac6e4980d998770b82e58dbdd6f63f | |
parent | e4890bf85c97c5b4d8d1797a77ad0e3cb5bf95f3 (diff) | |
download | mongo-f00104e92fc12bf6fc85edbdb30c0d3b6250a954.tar.gz |
SERVER-9124: Avoid raw pointers for SM's nativeHelper
-rw-r--r-- | src/mongo/scripting/engine_spidermonkey.cpp | 32 | ||||
-rw-r--r-- | src/mongo/scripting/engine_spidermonkey_internal.h | 8 |
2 files changed, 33 insertions, 7 deletions
diff --git a/src/mongo/scripting/engine_spidermonkey.cpp b/src/mongo/scripting/engine_spidermonkey.cpp index 1a0cd117155..e39734305a2 100644 --- a/src/mongo/scripting/engine_spidermonkey.cpp +++ b/src/mongo/scripting/engine_spidermonkey.cpp @@ -1071,11 +1071,25 @@ namespace spidermonkey { JSBool native_helper( JSContext *cx , JSObject *obj , uintN argc, jsval *argv , jsval *rval ) { try { Convertor c(cx); - NativeFunction func = reinterpret_cast<NativeFunction>( - static_cast<long long>( c.getNumber( obj , "x" ) ) ); - void* data = reinterpret_cast<void*>( - static_cast<long long>( c.getNumber( obj , "y" ) ) ); - verify( func ); + + // get function pointer from JS caller's argument property 'x' + massert(16740, "nativeHelper argument requires object with 'x' property", + c.hasProperty(obj, "x")); + FunctionMap::iterator funcIter = currentScope->_functionMap.find(c.getNumber(obj, "x")); + massert(16742, "JavaScript function not in map", + funcIter != currentScope->_functionMap.end()); + NativeFunction func = funcIter->second; + verify(func); + + // get data pointer from JS caller's argument property 'y' + void* data = NULL; + if (c.hasProperty(obj, "y")) { + ArgumentMap::iterator argIter = + currentScope->_argumentMap.find(c.getNumber(obj, "y")); + massert(16741, "nativeHelper 'y' parameter must be in the argumentMap", + argIter != currentScope->_argumentMap.end()); + data = argIter->second; + } BSONObj a; if ( argc > 0 ) { @@ -1725,12 +1739,16 @@ namespace spidermonkey { smlock; string name = field; jsval v; - v = _convertor->toval( static_cast<double>( reinterpret_cast<long long>(func) ) ); + uint32_t funcId = _functionMap.size(); + _functionMap.insert(make_pair(funcId, func)); + v = _convertor->toval(static_cast<double>(funcId)); _convertor->setProperty( _global, (name + "_").c_str(), v ); stringstream code; if (data) { - v = _convertor->toval( static_cast<double>( reinterpret_cast<long long>(data) ) ); + uint32_t argsId = _argumentMap.size(); + _argumentMap.insert(make_pair(argsId, data)); + v = _convertor->toval(static_cast<double>(argsId)); _convertor->setProperty( _global, (name + "_data_").c_str(), v ); code << field << "_" << " = { x : " << field << "_ , y: " << field << "_data_ }; "; } else { diff --git a/src/mongo/scripting/engine_spidermonkey_internal.h b/src/mongo/scripting/engine_spidermonkey_internal.h index 26d772c84f7..5b31db677a6 100644 --- a/src/mongo/scripting/engine_spidermonkey_internal.h +++ b/src/mongo/scripting/engine_spidermonkey_internal.h @@ -47,6 +47,9 @@ namespace spidermonkey { using std::string; + typedef std::map<uint32_t, NativeFunction> FunctionMap; + typedef std::map<uint32_t, void*> ArgumentMap; + string trim( string s ); class BSONFieldIterator; @@ -295,6 +298,11 @@ namespace spidermonkey { JSContext *SavedContext() const { return _context; } + // map from internal function id to function pointer + FunctionMap _functionMap; + // map from internal function argument id to function pointer + ArgumentMap _argumentMap; + private: void _postCreateHacks(); |