diff options
author | Eliot Horowitz <eliot@10gen.com> | 2008-09-18 09:38:59 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2008-09-18 09:39:14 -0400 |
commit | 8216dc63c56cce87126d2a228a38fad2cddf3d44 (patch) | |
tree | a614fff3e567aa129a2693043bd0be342763f373 | |
parent | 3507a09bfb6fe5931c43fa070a062ce4e4ae2b5e (diff) | |
download | mongo-8216dc63c56cce87126d2a228a38fad2cddf3d44.tar.gz |
jni lies - you do need to release things
-rw-r--r-- | db/javajs.cpp | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/db/javajs.cpp b/db/javajs.cpp index 27b9fba86ac..55d00e7f81a 100644 --- a/db/javajs.cpp +++ b/db/javajs.cpp @@ -266,26 +266,42 @@ void JavaJSImpl::scopeFree( jlong id ){ // scope setters int JavaJSImpl::scopeSetBoolean( jlong id , const char * field , jboolean val ) { - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _getEnv()->NewStringUTF( field ) , val ); + jstring fieldString = _getEnv()->NewStringUTF( field ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , fieldString , val ); + _getEnv()->DeleteLocalRef( fieldString ); + return res; } int JavaJSImpl::scopeSetNumber( jlong id , const char * field , double val ){ - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _getEnv()->NewStringUTF( field ) , val ); + jstring fieldString = _getEnv()->NewStringUTF( field ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , fieldString , val ); + _getEnv()->DeleteLocalRef( fieldString ); + return res; } int JavaJSImpl::scopeSetString( jlong id , const char * field , const char * val ){ - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetString , id , _getEnv()->NewStringUTF( field ) , _getEnv()->NewStringUTF( val ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + jstring s2 = _getEnv()->NewStringUTF( val ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetString , id , s1 , s2 ); + _getEnv()->DeleteLocalRef( s1 ); + _getEnv()->DeleteLocalRef( s2 ); + return res; } int JavaJSImpl::scopeSetObject( jlong id , const char * field , JSObj * obj ){ jobject bb = 0; if ( obj ){ - //cout << "from c : " << obj->toString() << endl; bb = _getEnv()->NewDirectByteBuffer( (void*)(obj->objdata()) , (jlong)(obj->objsize()) ); jassert( bb ); } + + jstring s1 = _getEnv()->NewStringUTF( field ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetObject , id , s1 , bb ); + _getEnv()->DeleteLocalRef( s1 ); + if ( bb ) + _getEnv()->DeleteLocalRef( bb ); - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetObject , id , _getEnv()->NewStringUTF( field ) , bb ); + return res; } int JavaJSImpl::scopeInit( jlong id , JSObj * obj ){ @@ -311,19 +327,31 @@ int JavaJSImpl::scopeSetThis( jlong id , JSObj * obj ){ // scope getters char JavaJSImpl::scopeGetType( jlong id , const char * field ){ - return _getEnv()->CallStaticByteMethod( _dbhook , _scopeGetType , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + int res =_getEnv()->CallStaticByteMethod( _dbhook , _scopeGetType , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + return res; } double JavaJSImpl::scopeGetNumber( jlong id , const char * field ){ - return _getEnv()->CallStaticDoubleMethod( _dbhook , _scopeGetNumber , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + double res = _getEnv()->CallStaticDoubleMethod( _dbhook , _scopeGetNumber , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + return res; } jboolean JavaJSImpl::scopeGetBoolean( jlong id , const char * field ){ - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeGetBoolean , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + jboolean res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeGetBoolean , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + return res; } string JavaJSImpl::scopeGetString( jlong id , const char * field ) { - jstring s = (jstring)_getEnv()->CallStaticObjectMethod( _dbhook , _scopeGetString , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + jstring s = (jstring)_getEnv()->CallStaticObjectMethod( _dbhook , _scopeGetString , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + if ( ! s ) return ""; @@ -336,13 +364,16 @@ string JavaJSImpl::scopeGetString( jlong id , const char * field ) { #ifdef J_USE_OBJ JSObj JavaJSImpl::scopeGetObject( jlong id , const char * field ) { + jstring s1 = _getEnv()->NewStringUTF( field ); int guess = _getEnv()->CallStaticIntMethod( _dbhook , _scopeGuessObjectSize , id , _getEnv()->NewStringUTF( field ) ); + _getEnv()->DeleteLocalRef( s1 ); char * buf = (char *) malloc(guess); jobject bb = _getEnv()->NewDirectByteBuffer( (void*)buf , guess ); jassert( bb ); int len = _getEnv()->CallStaticIntMethod( _dbhook , _scopeGetObject , id , _getEnv()->NewStringUTF( field ) , bb ); + _getEnv()->DeleteLocalRef( bb ); //cout << "len : " << len << endl; jassert( len > 0 && len < guess ); @@ -358,6 +389,7 @@ jlong JavaJSImpl::functionCreate( const char * code ){ jstring s = _getEnv()->NewStringUTF( code ); jassert( s ); jlong id = _getEnv()->CallStaticLongMethod( _dbhook , _functionCreate , s ); + _getEnv()->DeleteLocalRef( s ); return id; } @@ -376,6 +408,7 @@ void JavaJSImpl::run( const char * js ){ jstring s = _getEnv()->NewStringUTF( js ); log() << _getEnv()->CallStaticObjectMethod( c , m , s ) << endl; + _getEnv()->DeleteLocalRef( s ); } void JavaJSImpl::printException(){ |