summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2008-09-18 09:38:59 -0400
committerEliot Horowitz <eliot@10gen.com>2008-09-18 09:39:14 -0400
commit8216dc63c56cce87126d2a228a38fad2cddf3d44 (patch)
treea614fff3e567aa129a2693043bd0be342763f373
parent3507a09bfb6fe5931c43fa070a062ce4e4ae2b5e (diff)
downloadmongo-8216dc63c56cce87126d2a228a38fad2cddf3d44.tar.gz
jni lies - you do need to release things
-rw-r--r--db/javajs.cpp51
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(){