summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Becker <ben.becker@10gen.com>2013-03-29 17:21:39 -0700
committerBen Becker <ben.becker@10gen.com>2013-03-29 17:23:18 -0700
commitf00104e92fc12bf6fc85edbdb30c0d3b6250a954 (patch)
tree405ef7fa9dac6e4980d998770b82e58dbdd6f63f
parente4890bf85c97c5b4d8d1797a77ad0e3cb5bf95f3 (diff)
downloadmongo-f00104e92fc12bf6fc85edbdb30c0d3b6250a954.tar.gz
SERVER-9124: Avoid raw pointers for SM's nativeHelper
-rw-r--r--src/mongo/scripting/engine_spidermonkey.cpp32
-rw-r--r--src/mongo/scripting/engine_spidermonkey_internal.h8
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();