Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 282729 Details for
Bug 376983
Patch or remove <dev-db/mongodb-2.2.0 as they fail to build against >=spidermonkey-1.8.5
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
patch to support all JS_VERSIONs (including >= 185)
mongodb-1.8-spidermonkey-1.8.5-support2.patch (text/plain), 57.89 KB, created by
Ian Stakenvicius (RETIRED)
on 2011-08-09 16:23:14 UTC
(
hide
)
Description:
patch to support all JS_VERSIONs (including >= 185)
Filename:
MIME Type:
Creator:
Ian Stakenvicius (RETIRED)
Created:
2011-08-09 16:23:14 UTC
Size:
57.89 KB
patch
obsolete
>diff -ur mongodb-src-r1.8.2/SConstruct mongodb-src-r1.8.2.new/SConstruct >--- mongodb-src-r1.8.2/SConstruct 2011-06-15 09:43:13.000000000 -0400 >+++ mongodb-src-r1.8.2.new/SConstruct 2011-08-08 17:04:37.000000000 -0400 >@@ -893,11 +893,11 @@ > if usesm: > > # see http://www.mongodb.org/pages/viewpageattachments.action?pageId=12157032 >- J = [ "mozjs" , "js", "js_static" ] >+ J = [ "mozjs185" , "mozjs" , "js", "js_static" ] > if windows: > if msarch == "amd64": > if release: >- J = [ "js64r", "js", "mozjs" , "js_static" ] >+ J = [ "js64r", "js", "mozjs185" , "mozjs" , "js_static" ] > else: > J = "js64d" > print( "looking for js64d.lib for spidermonkey. (available at mongodb.org prebuilt)" ); >@@ -905,9 +905,9 @@ > if not force32: > print( "Assuming a 32 bit build is desired" ) > if release: >- J = [ "js32r", "js", "mozjs" , "js_static" ] >+ J = [ "js32r", "js", "mozjs185" , "mozjs" , "js_static" ] > else: >- J = [ "js32d", "js", "mozjs" , "js_static" ] >+ J = [ "js32d", "js", "mozjs185" , "mozjs" , "js_static" ] > > myCheckLib( J , True ) > mozHeader = "js" >@@ -921,6 +921,13 @@ > print( "no spider monkey headers!" ) > Exit(1) > >+ if conf.CheckFunc( 'JS_NewCompartmentAndGlobalObject' ): >+ myenv.Append( CPPDEFINES=[ "HAVE_COMPARTMENTS" ] ) >+ if conf.CheckFunc( 'JS_GetStringCharsAndLength' ): >+ myenv.Append( CPPDEFINES=[ "HAVE_JS_GET_STRING_CHARS_AND_LENGTH" ] ) >+ if conf.CheckFunc( 'JS_NewRegExpObjectNoStatics' ): >+ myenv.Append( CPPDEFINES=[ "JS_NEW_REG_EXP_OBJECT_NO_STATISTICS" ] ) >+ > if usev8: > if debugBuild: > myCheckLib( [ "v8_g" , "v8" ] , True ) >diff -ur mongodb-src-r1.8.2/scripting/engine_spidermonkey.cpp mongodb-src-r1.8.2.new/scripting/engine_spidermonkey.cpp >--- mongodb-src-r1.8.2/scripting/engine_spidermonkey.cpp 2011-06-15 09:43:13.000000000 -0400 >+++ mongodb-src-r1.8.2.new/scripting/engine_spidermonkey.cpp 2011-08-08 16:51:52.000000000 -0400 >@@ -192,8 +192,13 @@ > } > > string toString( JSString * so ) { >+#ifdef HAVE_JS_GET_STRING_CHARS_AND_LENGTH >+ size_t srclen; >+ const jschar * s = JS_GetStringCharsAndLength( _context , so , &srclen ); >+#else > jschar * s = JS_GetStringChars( so ); > size_t srclen = JS_GetStringLength( so ); >+#endif > if( srclen == 0 ) > return ""; > >@@ -360,7 +365,7 @@ > > case JSTYPE_OBJECT: { > JSObject * o = JSVAL_TO_OBJECT( val ); >- if ( ! o || o == JSVAL_NULL ) { >+ if ( ! o || o == (JSObject *)JSVAL_NULL ){ > b.appendNull( name ); > } > else if ( ! appendSpecialDBObject( this , b , name , val , o ) ) { >@@ -419,16 +424,19 @@ > return true; > } > >+#if JS_VERSION < 185 > void addRoot( JSFunction * f , const char * name ); >+#else >+ void addRoot( JSFunction * f ); >+#endif > > JSFunction * compileFunction( const char * code, JSObject * assoc = 0 ) { >- const char * gcName = "unknown"; >- JSFunction * f = _compileFunction( code , assoc , gcName ); >- //addRoot( f , gcName ); >+ JSFunction * f = _compileFunction( code , assoc ); >+ //addRoot( f ); > return f; > } > >- JSFunction * _compileFunction( const char * raw , JSObject * assoc , const char *& gcName ) { >+ JSFunction * _compileFunction( const char * raw , JSObject * assoc ) { > if ( ! assoc ) > assoc = JS_GetGlobalObject( _context ); > >@@ -447,7 +455,6 @@ > if ( isSimpleStatement( s ) ) { > s = "return " + s; > } >- gcName = "cf anon"; > fname << "anon"; > return JS_CompileFunction( _context , assoc , fname.str().c_str() , 0 , 0 , s.c_str() , s.size() , "nofile_a" , 0 ); > } >@@ -488,7 +495,6 @@ > log() << "compile failed for: " << raw << endl; > return 0; > } >- gcName = "cf normal"; > return func; > } > >@@ -630,7 +636,11 @@ > flags++; > } > >+#ifdef JS_NEW_REG_EXP_OBJECT_NO_STATISTICS >+ JSObject * r = JS_NewRegExpObjectNoStatics( _context , (char*)e.regex() , strlen( e.regex() ) , flagNumber); >+#else > JSObject * r = JS_NewRegExpObject( _context , (char*)e.regex() , strlen( e.regex() ) , flagNumber ); >+#endif > assert( r ); > return OBJECT_TO_JSVAL( r ); > } >@@ -699,7 +795,11 @@ > *statep = 0; > } > if ( idp ) >+#if JS_VERSION < 185 > *idp = JSVAL_ZERO; >+#else >+ JS_ValueToId(cx,JSVAL_ZERO,idp); >+#endif > return JS_TRUE; > } > >@@ -791,7 +805,7 @@ > > BSONFieldIterator * it = (BSONFieldIterator*)JSVAL_TO_PRIVATE( *statep ); > if ( ! it ) { >- *statep = 0; >+ *statep = JSVAL_NULL; > return JS_TRUE; > } > >@@ -803,7 +817,7 @@ > } > else { > delete it; >- *statep = 0; >+ *statep = JSVAL_NULL; > } > return JS_TRUE; > } >@@ -818,7 +832,11 @@ > return JS_FALSE; > } > >+#if JS_VERSION < 185 > JSBool noaccess( JSContext *cx, JSObject *obj, jsval idval, jsval *vp) { >+#else >+ JSBool noaccess( JSContext *cx, JSObject *obj, jsid id, jsval *vp){ >+#endif > BSONHolder * holder = GETHOLDER( cx , obj ); > if ( ! holder ) { > // in init code still >@@ -830,24 +848,46 @@ > return JS_FALSE; > } > >+#if JS_VERSION >= 185 >+ JSBool strict_noaccess( JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){ >+ return noaccess( cx , obj , id , vp ); >+ } >+#endif >+ >+ // FIXME: This won't build on spidermonkey < 1.8.5 (JSStrictPropertyOp, JSResolveOp) > JSClass bson_ro_class = { > "bson_ro_object" , JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_NEW_ENUMERATE , >+#if JS_VERSION < 185 > noaccess, noaccess, JS_PropertyStub, noaccess, > (JSEnumerateOp)bson_enumerate, (JSResolveOp)(&resolveBSONField) , JS_ConvertStub, bson_finalize , >+#else >+ noaccess, noaccess, JS_PropertyStub, strict_noaccess, >+ (JSEnumerateOp)bson_enumerate, (JSResolveOp)resolveBSONField , JS_ConvertStub, bson_finalize , >+#endif > JSCLASS_NO_OPTIONAL_MEMBERS > }; > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool bson_cons( JSContext* cx, uintN argc, jsval* vp ){ >+#else > JSBool bson_cons( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > cerr << "bson_cons : shouldn't be here!" << endl; > JS_ReportError( cx , "can't construct bson object" ); > return JS_FALSE; > } > > JSFunctionSpec bson_functions[] = { >- { 0 } >+ JS_FS_END > }; > >+#if JS_VERSION < 185 > JSBool bson_add_prop( JSContext *cx, JSObject *obj, jsval idval, jsval *vp) { >+#else >+ JSBool bson_add_prop( JSContext *cx, JSObject *obj, jsid id, jsval *vp){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > BSONHolder * holder = GETHOLDER( cx , obj ); > if ( ! holder ) { > // static init >@@ -865,7 +905,13 @@ > } > > >+#if JS_VERSION < 185 > JSBool mark_modified( JSContext *cx, JSObject *obj, jsval idval, jsval *vp) { >+#else >+ JSBool mark_modified( JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > Convertor c(cx); > BSONHolder * holder = GETHOLDER( cx , obj ); > if ( !holder ) // needed when we're messing with DBRef.prototype >@@ -877,7 +919,13 @@ > return JS_TRUE; > } > >+#if JS_VERSION < 185 > JSBool mark_modified_remove( JSContext *cx, JSObject *obj, jsval idval, jsval *vp) { >+#else >+ JSBool mark_modified_remove( JSContext *cx, JSObject *obj, jsid id, jsval *vp){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > Convertor c(cx); > BSONHolder * holder = GETHOLDER( cx , obj ); > if ( holder->_inResolve ) >@@ -890,20 +942,33 @@ > JSClass bson_class = { > "bson_object" , JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE | JSCLASS_NEW_ENUMERATE , > bson_add_prop, mark_modified_remove, JS_PropertyStub, mark_modified, >+#if JS_VERSION < 185 > (JSEnumerateOp)bson_enumerate, (JSResolveOp)(&resolveBSONField) , JS_ConvertStub, bson_finalize , >+#else >+ (JSEnumerateOp)bson_enumerate, (JSResolveOp)resolveBSONField , JS_ConvertStub, bson_finalize , >+#endif > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > static JSClass global_class = { > "global", JSCLASS_GLOBAL_FLAGS, >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > // --- global helpers --- > >+#if JS_VERSION < 185 > JSBool native_print( JSContext * cx , JSObject * obj , uintN argc, jsval *argv, jsval *rval ) { >+#else >+ JSBool native_print( JSContext * cx , uintN argc , jsval *vp ){ >+ jsval *argv = JS_ARGV( cx , vp); >+#endif > stringstream ss; > Convertor c( cx ); > for ( uintN i=0; i<argc; i++ ) { >@@ -913,10 +978,19 @@ > } > ss << "\n"; > Logstream::logLockless( ss.str() ); >+#if JS_VERSION >= 185 >+ JS_SET_RVAL( cx , vp , JSVAL_VOID ); >+#endif > return JS_TRUE; > } > >+#if JS_VERSION < 185 > JSBool native_helper( JSContext *cx , JSObject *obj , uintN argc, jsval *argv , jsval *rval ) { >+#else >+ JSBool native_helper( JSContext *cx , uintN argc, jsval *vp){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > > NativeFunction func = (NativeFunction)((long long)c.getNumber( obj , "x" ) ); >@@ -942,35 +1016,67 @@ > } > > if ( out.isEmpty() ) { >+#if JS_VERSION < 185 > *rval = JSVAL_VOID; >+#else >+ JS_SET_RVAL( cx , vp , JSVAL_VOID ); >+#endif > } > else { >+#if JS_VERSION < 185 > *rval = c.toval( out.firstElement() ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( out.firstElement() ) ); >+#endif > } > > return JS_TRUE; > } > >+#if JS_VERSION < 185 > JSBool native_load( JSContext *cx , JSObject *obj , uintN argc, jsval *argv , jsval *rval ); >+#else >+ JSBool native_load( JSContext *cx , uintN argc, jsval *vp ); >+#endif > >+#if JS_VERSION < 185 > JSBool native_gc( JSContext *cx , JSObject *obj , uintN argc, jsval *argv , jsval *rval ) { >+#else >+ JSBool native_gc( JSContext *cx , uintN argc, jsval *vp ){ >+#endif > JS_GC( cx ); >+#if JS_VERSION >= 185 >+ JS_SET_RVAL( cx , vp , JSVAL_VOID ); >+#endif > return JS_TRUE; > } > > JSFunctionSpec globalHelpers[] = { >+#if JS_VERSION < 185 > { "print" , &native_print , 0 , 0 , 0 } , > { "nativeHelper" , &native_helper , 1 , 0 , 0 } , > { "load" , &native_load , 1 , 0 , 0 } , > { "gc" , &native_gc , 1 , 0 , 0 } , > { 0 , 0 , 0 , 0 , 0 } >+#else >+ JS_FS( "print" , &native_print , 0 , JSFUN_FAST_NATIVE ) , >+ JS_FS( "nativeHelper" , &native_helper , 1 , JSFUN_FAST_NATIVE ) , >+ JS_FS( "load" , &native_load , 1 , JSFUN_FAST_NATIVE ) , >+ JS_FS( "gc" , &native_gc , 1 , JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > // ----END global helpers ---- > > // Object helpers > >+#if JS_VERSION < 185 > JSBool bson_get_size(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool bson_get_size(JSContext *cx, uintN argc, jsval *vp){ >+ jsval *argv = JS_ARGV( cx , vp ); >+#endif > if ( argc != 1 || !JSVAL_IS_OBJECT( argv[ 0 ] ) ) { > JS_ReportError( cx , "bsonsize requires one valid object" ); > return JS_FALSE; >@@ -979,7 +1085,11 @@ > Convertor c(cx); > > if ( argv[0] == JSVAL_VOID || argv[0] == JSVAL_NULL ) { >+#if JS_VERSION < 185 > *rval = c.toval( 0.0 ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( 0.0 ) ); >+#endif > return JS_TRUE; > } > >@@ -999,18 +1109,33 @@ > size = temp.objsize(); > } > >+#if JS_VERSION < 185 > *rval = c.toval( size ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( size ) ); >+#endif > return JS_TRUE; > } > > JSFunctionSpec objectHelpers[] = { >+#if JS_VERSION < 185 > { "bsonsize" , &bson_get_size , 1 , 0 , 0 } , > { 0 , 0 , 0 , 0 , 0 } >+#else >+ JS_FS( "bsonsize" , &bson_get_size , 1 , JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > // end Object helpers > >- JSBool resolveBSONField( JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp ) { >+#if JS_VERSION < 185 >+ JSBool resolveBSONField( JSContext *cx, JSObject *obj, jsval idval, uintN flags, JSObject **objp ) { >+#else >+ JSBool resolveBSONField( JSContext *cx, JSObject *obj, jsid id, uintN flags, JSObject **objp ){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > assert( JS_EnterLocalRootScope( cx ) ); > Convertor c( cx ); > >@@ -1023,7 +1148,7 @@ > } > holder->check(); > >- string s = c.toString( id ); >+ string s = c.toString( idval ); > > BSONElement e = holder->_obj[ s.c_str() ]; > >@@ -1139,9 +1264,15 @@ > //JS_SetVersion( _context , JSVERSION_LATEST); TODO > JS_SetErrorReporter( _context , errorReporter ); > >+#ifdef HAVE_COMPARTMENTS >+ _global = JS_NewCompartmentAndGlobalObject( _context , &global_class , NULL); >+ massert( 13442 , "JS_NewCompartmentAndGlobalObject failed for global" , _global ); >+ _call = JS_EnterCrossCompartmentCall( _context , _global); >+#else > _global = JS_NewObject( _context , &global_class, NULL, NULL); > massert( 10432 , "JS_NewObject failed for global" , _global ); > JS_SetGlobalObject( _context , _global ); >+#endif > massert( 10433 , "js init failed" , JS_InitStandardClasses( _context , _global ) ); > > JS_SetOptions( _context , JS_GetOptions( _context ) | JSOPTION_VAROBJFIX ); >@@ -1159,13 +1290,23 @@ > smlock; > uassert( 10223 , "deleted SMScope twice?" , _convertor ); > >+#if JS_VERSION < 185 > for ( list<void*>::iterator i=_roots.begin(); i != _roots.end(); i++ ) { > JS_RemoveRoot( _context , *i ); >+#else >+ for ( list<JSObject*>::iterator i=_roots.begin(); i != _roots.end(); i++ ){ >+ JSObject * obj = (JSObject *)*i; >+ JS_RemoveObjectRoot( _context , &obj ); >+#endif > } > _roots.clear(); > > if ( _this ) { >+#if JS_VERSION < 185 > JS_RemoveRoot( _context , &_this ); >+#else >+ JS_RemoveObjectRoot( _context , &_this ); >+#endif > _this = 0; > } > >@@ -1174,6 +1315,13 @@ > _convertor = 0; > } > >+#ifdef HAVE_COMPARTMENTS >+ if ( _call ) { >+ JS_LeaveCrossCompartmentCall( _call ); >+ _call = 0; >+ } >+#endif >+ > if ( _context ) { > // This is expected to reclaim _global as well. > JS_DestroyContext( _context ); >@@ -1187,16 +1335,26 @@ > assert( _convertor ); > return; > if ( _this ) { >+#if JS_VERSION < 185 > JS_RemoveRoot( _context , &_this ); >+#else >+ JS_RemoveObjectRoot( _context , &_this ); >+#endif > _this = 0; > } > currentScope.reset( this ); > _error = ""; > } > >+#if JS_VERSION < 185 > void addRoot( void * root , const char * name ) { > JS_AddNamedRoot( _context , root , name ); > _roots.push_back( root ); >+#else >+ void addRoot( JSObject * obj ){ >+ JS_AddObjectRoot( _context , &obj ); >+ _roots.push_back( obj ); >+#endif > } > > void init( const BSONObj * data ) { >@@ -1336,13 +1494,21 @@ > void setThis( const BSONObj * obj ) { > smlock; > if ( _this ) { >+#if JS_VERSION < 185 > JS_RemoveRoot( _context , &_this ); >+#else >+ JS_RemoveObjectRoot( _context , &_this ); >+#endif > _this = 0; > } > > if ( obj ) { > _this = _convertor->toJSObject( obj ); >+#if JS_VERSION < 185 > JS_AddNamedRoot( _context , &_this , "scope this" ); >+#else >+ JS_AddObjectRoot( _context , &_this ); >+#endif > } > } > >@@ -1402,7 +1568,7 @@ > spec->start = boost::posix_time::microsec_clock::local_time(); > spec->count = 0; > JS_SetContextPrivate( _context, (void*)spec ); >-#if defined(SM181) && !defined(XULRUNNER190) >+#if JS_VERSION >= 180 && !defined(XULRUNNER190) > JS_SetOperationCallback( _context, _interrupt ); > #else > JS_SetBranchCallback( _context, interrupt ); >@@ -1412,7 +1578,7 @@ > > void uninstallInterrupt( int timeoutMs ) { > if ( timeoutMs != 0 || ScriptEngine::haveCheckInterruptCallback() ) { >-#if defined(SM181) && !defined(XULRUNNER190) >+#if JS_VERSION >= 180 && !defined(XULRUNNER190) > JS_SetOperationCallback( _context , 0 ); > #else > JS_SetBranchCallback( _context, 0 ); >@@ -1548,9 +1714,16 @@ > > JSObject * _global; > JSObject * _this; >+#ifdef HAVE_COMPARTMENTS >+ JSCrossCompartmentCall * _call; >+#endif > > string _error; >+#if JS_VERSION < 185 > list<void*> _roots; >+#else >+ list<JSObject*> _roots; >+#endif > > bool _externalSetup; > bool _localConnect; >@@ -1579,7 +1752,12 @@ > } > } > >+#if JS_VERSION < 185 > JSBool native_load( JSContext *cx , JSObject *obj , uintN argc, jsval *argv , jsval *rval ) { >+#else >+ JSBool native_load( JSContext *cx , uintN argc, jsval *vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+#endif > Convertor c(cx); > > Scope * s = currentScope.get(); >@@ -1594,6 +1772,9 @@ > } > } > >+#if JS_VERSION >= 185 >+ JS_SET_RVAL( cx , vp , JSVAL_VOID ); >+#endif > return JS_TRUE; > } > >@@ -1633,7 +1814,11 @@ > return new SMScope(); > } > >+#if JS_VERSION < 185 > void Convertor::addRoot( JSFunction * f , const char * name ) { >+#else >+ void Convertor::addRoot( JSFunction * f ){ >+#endif > if ( ! f ) > return; > >@@ -1642,7 +1827,11 @@ > > JSObject * o = JS_GetFunctionObject( f ); > assert( o ); >+#if JS_VERSION < 185 > scope->addRoot( &o , name ); >+#else >+ scope->addRoot( o ); >+#endif > } > > } >diff -ur mongodb-src-r1.8.2/scripting/engine_spidermonkey.h mongodb-src-r1.8.2.new/scripting/engine_spidermonkey.h >--- mongodb-src-r1.8.2/scripting/engine_spidermonkey.h 2011-06-15 09:43:13.000000000 -0400 >+++ mongodb-src-r1.8.2.new/scripting/engine_spidermonkey.h 2011-08-08 14:30:49.000000000 -0400 >@@ -21,6 +21,9 @@ > > // START inc hacking > >+#undef malloc >+#undef realloc >+ > #if defined( MOZJS ) > > #define MOZILLA_1_8_BRANCH >@@ -55,6 +58,9 @@ > > #endif > >+#define malloc MONGO_malloc >+#define realloc MONGO_realloc >+ > // END inc hacking > > // -- SM 1.6 hacks --- >@@ -81,6 +87,10 @@ > #define SM181 > #endif > >+#ifndef JSFUN_FAST_NATIVE >+#define JSFUN_FAST_NATIVE 0 >+#endif >+ > namespace mongo { > > class SMScope; >@@ -104,7 +114,11 @@ > extern boost::thread_specific_ptr<SMScope> currentScope; > > // bson >+#if JS_VERSION < 185 > JSBool resolveBSONField( JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp ); >+#else >+ JSBool resolveBSONField( JSContext *cx, JSObject *obj, jsid id, uintN flags, JSObject **objp ); >+#endif > > > // mongo >diff -ur mongodb-src-r1.8.2/scripting/sm_db.cpp mongodb-src-r1.8.2.new/scripting/sm_db.cpp >--- mongodb-src-r1.8.2/scripting/sm_db.cpp 2011-06-15 09:43:13.000000000 -0400 >+++ mongodb-src-r1.8.2.new/scripting/sm_db.cpp 2011-08-08 17:02:49.000000000 -0400 >@@ -79,13 +79,25 @@ > return holder->get(); > } > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool internal_cursor_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool internal_cursor_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > uassert( 10236 , "no args to internal_cursor_constructor" , argc == 0 ); > assert( JS_SetPrivate( cx , obj , 0 ) ); // just for safety >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > >- void internal_cursor_finalize( JSContext * cx , JSObject * obj ) { >+ void internal_cursor_finalize( JSContext * cx, JSObject * obj ) { > CursorHolder * holder = (CursorHolder*)JS_GetPrivate( cx , obj ); > if ( holder ) { > delete holder; >@@ -93,10 +105,19 @@ > } > } > >+#if JS_VERSION < 185 > JSBool internal_cursor_hasNext(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool internal_cursor_hasNext(JSContext *cx , uintN argc , jsval *vp) { >+ JSObject* obj = JS_THIS_OBJECT( cx , vp ); >+#endif > DBClientCursor *cursor = getCursor( cx, obj ); > try { >+#if JS_VERSION < 185 > *rval = cursor->more() ? JSVAL_TRUE : JSVAL_FALSE; >+#else >+ JS_SET_RVAL( cx , vp , cursor->more() ? JSVAL_TRUE : JSVAL_FALSE ); >+#endif > } > catch ( std::exception& e ) { > JS_ReportError( cx , e.what() ); >@@ -105,14 +126,28 @@ > return JS_TRUE; > } > >+#if JS_VERSION < 185 > JSBool internal_cursor_objsLeftInBatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool internal_cursor_objsLeftInBatch(JSContext *cx, uintN argc, jsval *vp) { >+ JSObject* obj = JS_THIS_OBJECT( cx , vp ); >+#endif > DBClientCursor *cursor = getCursor( cx, obj ); > Convertor c(cx); >+#if JS_VERSION < 185 > *rval = c.toval((double) cursor->objsLeftInBatch() ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval((double) cursor->objsLeftInBatch()) ); >+#endif > return JS_TRUE; > } > >+#if JS_VERSION < 185 > JSBool internal_cursor_next(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool internal_cursor_next(JSContext *cx, uintN argc, jsval *vp) { >+ JSObject* obj = JS_THIS_OBJECT( cx , vp ); >+#endif > DBClientCursor *cursor = getCursor( cx, obj ); > > BSONObj n; >@@ -131,20 +166,35 @@ > } > > Convertor c(cx); >+#if JS_VERSION < 185 > *rval = c.toval( &n ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( &n ) ); >+#endif > return JS_TRUE; > } > > JSFunctionSpec internal_cursor_functions[] = { >+#if JS_VERSION < 185 > { "hasNext" , internal_cursor_hasNext , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "objsLeftInBatch" , internal_cursor_objsLeftInBatch , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "next" , internal_cursor_next , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { 0 } >+#else >+ JS_FS( "hasNext" , internal_cursor_hasNext , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "objsLeftInBatch" , internal_cursor_objsLeftInBatch , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "next" , internal_cursor_next , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > JSClass internal_cursor_class = { > "InternalCursor" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, internal_cursor_finalize, > JSCLASS_NO_OPTIONAL_MEMBERS > }; >@@ -157,7 +207,16 @@ > throw -1; > } > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool mongo_local_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool mongo_local_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > Convertor c( cx ); > > shared_ptr< DBClientWithCommands > client( createDirectClient() ); >@@ -166,10 +225,23 @@ > jsval host = c.toval( "EMBEDDED" ); > assert( JS_SetProperty( cx , obj , "host" , &host ) ); > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool mongo_external_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool mongo_external_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > Convertor c( cx ); > > smuassert( cx , "0 or 1 args to Mongo" , argc <= 1 ); >@@ -197,6 +269,9 @@ > assert( JS_SetPrivate( cx , obj , (void*)( new shared_ptr< DBClientWithCommands >( conn ) ) ) ); > jsval host_val = c.toval( host.c_str() ); > assert( JS_SetProperty( cx , obj , "host" , &host_val ) ); >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > > } >@@ -215,14 +290,25 @@ > } > } > >+ // FIXME: This won't build on spidermonkey < 1.8.5 (JSStrictPropertyOp) > JSClass mongo_class = { > "Mongo" , JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, mongo_finalize, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > >+#if JS_VERSION < 185 > JSBool mongo_find(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool mongo_find(JSContext *cx, uintN argc, jsval *vp) { >+ JSObject* obj = JS_THIS_OBJECT( cx , vp ); >+ jsval* argv = JS_ARGV( cx , vp ); >+#endif > smuassert( cx , "mongo_find needs 7 args" , argc == 7 ); > shared_ptr< DBClientWithCommands > * connHolder = (shared_ptr< DBClientWithCommands >*)JS_GetPrivate( cx , obj ); > smuassert( cx , "no connection!" , connHolder && connHolder->get() ); >@@ -252,7 +338,11 @@ > JSObject * mycursor = JS_NewObject( cx , &internal_cursor_class , 0 , 0 ); > CHECKNEWOBJECT( mycursor, cx, "internal_cursor_class" ); > assert( JS_SetPrivate( cx , mycursor , new CursorHolder( cursor, *connHolder ) ) ); >+#if JS_VERSION < 185 > *rval = OBJECT_TO_JSVAL( mycursor ); >+#else >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( mycursor )); >+#endif > return JS_TRUE; > } > catch ( ... ) { >@@ -261,7 +351,13 @@ > } > } > >+#if JS_VERSION < 185 > JSBool mongo_update(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool mongo_update(JSContext *cx, uintN argc, jsval *vp) { >+ JSObject* obj = JS_THIS_OBJECT( cx , vp ); >+ jsval* argv = JS_ARGV( cx , vp ); >+#endif > smuassert( cx , "mongo_find needs at elast 3 args" , argc >= 3 ); > smuassert( cx , "2nd param to update has to be an object" , JSVAL_IS_OBJECT( argv[1] ) ); > smuassert( cx , "3rd param to update has to be an object" , JSVAL_IS_OBJECT( argv[2] ) ); >@@ -282,6 +378,9 @@ > > try { > conn->update( ns , c.toObject( argv[1] ) , c.toObject( argv[2] ) , upsert , multi ); >+#if JS_VERSION >= 185 >+ JS_SET_RVAL( cx , vp , JSVAL_VOID ); >+#endif > return JS_TRUE; > } > catch ( ... ) { >@@ -290,7 +389,13 @@ > } > } > >+#if JS_VERSION < 185 > JSBool mongo_insert(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool mongo_insert(JSContext *cx, uintN argc, jsval *vp) { >+ JSObject* obj = JS_THIS_OBJECT( cx , vp ); >+ jsval* argv = JS_ARGV( cx , vp ); >+#endif > smuassert( cx , "mongo_insert needs 2 args" , argc == 2 ); > smuassert( cx , "2nd param to insert has to be an object" , JSVAL_IS_OBJECT( argv[1] ) ); > >@@ -310,6 +415,9 @@ > // TODO: add _id > > conn->insert( ns , o ); >+#if JS_VERSION >= 185 >+ JS_SET_RVAL( cx, vp, JSVAL_VOID ); >+#endif > return JS_TRUE; > } > catch ( std::exception& e ) { >@@ -325,7 +433,13 @@ > } > } > >+#if JS_VERSION < 185 > JSBool mongo_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool mongo_remove(JSContext *cx, uintN argc, jsval *vp) { >+ JSObject* obj = JS_THIS_OBJECT( cx , vp ); >+ jsval* argv = JS_ARGV( cx , vp ); >+#endif > smuassert( cx , "mongo_remove needs 2 or 3 arguments" , argc == 2 || argc == 3 ); > smuassert( cx , "2nd param to insert has to be an object" , JSVAL_IS_OBJECT( argv[1] ) ); > >@@ -346,6 +460,9 @@ > > try { > conn->remove( ns , o , justOne ); >+#if JS_VERSION >= 185 >+ JS_SET_RVAL( cx , vp , JSVAL_VOID ); >+#endif > return JS_TRUE; > } > catch ( std::exception& e ) { >@@ -361,16 +478,34 @@ > } > > JSFunctionSpec mongo_functions[] = { >+#if JS_VERSION < 185 > { "find" , mongo_find , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "update" , mongo_update , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "insert" , mongo_insert , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "remove" , mongo_remove , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { 0 } >+#else >+ JS_FS( "find" , mongo_find , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "update" , mongo_update , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "insert" , mongo_insert , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "remove" , mongo_remove , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > // ------------- db_collection ------------- > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool db_collection_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool db_collection_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > smuassert( cx , "db_collection_constructor wrong args" , argc == 4 ); > assert( JS_SetProperty( cx , obj , "_mongo" , &(argv[0]) ) ); > assert( JS_SetProperty( cx , obj , "_db" , &(argv[1]) ) ); >@@ -383,15 +518,24 @@ > return JS_FALSE; > } > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > >- JSBool db_collection_resolve( JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp ) { >+#if JS_VERSION < 185 >+ JSBool db_collection_resolve( JSContext *cx, JSObject *obj, jsval idval, uintN flags, JSObject **objp ) { >+#else >+ JSBool db_collection_resolve( JSContext *cx, JSObject *obj, jsid id, uintN flags, JSObject **objp ){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > if ( flags & JSRESOLVE_ASSIGNING ) > return JS_TRUE; > > Convertor c( cx ); >- string collname = c.toString( id ); >+ string collname = c.toString( idval ); > > if ( isSpecialName( collname ) ) > return JS_TRUE; >@@ -421,8 +565,13 @@ > > JSClass db_collection_class = { > "DBCollection" , JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, > JS_EnumerateStub, (JSResolveOp)(&db_collection_resolve) , JS_ConvertStub, JS_FinalizeStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+ JS_EnumerateStub, (JSResolveOp)db_collection_resolve , JS_ConvertStub, JS_FinalizeStub, >+#endif > JSCLASS_NO_OPTIONAL_MEMBERS > }; > >@@ -454,15 +603,35 @@ > // -------------- DB --------------- > > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool db_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool db_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > smuassert( cx, "wrong number of arguments to DB" , argc == 2 ); > assert( JS_SetProperty( cx , obj , "_mongo" , &(argv[0]) ) ); > assert( JS_SetProperty( cx , obj , "_name" , &(argv[1]) ) ); > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif >+ > return JS_TRUE; > } > >- JSBool db_resolve( JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp ) { >+#if JS_VERSION < 185 >+ JSBool db_resolve( JSContext *cx, JSObject *obj, jsval idval, uintN flags, JSObject **objp ) { >+#else >+ JSBool db_resolve( JSContext *cx, JSObject *obj, jsid id, uintN flags, JSObject **objp ){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > if ( flags & JSRESOLVE_ASSIGNING ) > return JS_TRUE; > >@@ -471,7 +640,7 @@ > if ( obj == c.getGlobalPrototype( "DB" ) ) > return JS_TRUE; > >- string collname = c.toString( id ); >+ string collname = c.toString( idval ); > > if ( isSpecialName( collname ) ) > return JS_TRUE; >@@ -491,15 +660,30 @@ > > JSClass db_class = { > "DB" , JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, > JS_EnumerateStub, (JSResolveOp)(&db_resolve) , JS_ConvertStub, JS_FinalizeStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+ JS_EnumerateStub, (JSResolveOp)db_resolve , JS_ConvertStub, JS_FinalizeStub, >+#endif > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > > // -------------- object id ------------- > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool object_id_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool object_id_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > Convertor c( cx ); > > OID oid; >@@ -524,35 +708,69 @@ > if ( ! JS_InstanceOf( cx , obj , &object_id_class , 0 ) ) { > obj = JS_NewObject( cx , &object_id_class , 0 , 0 ); > CHECKNEWOBJECT( obj, cx, "object_id_constructor" ); >+#ifndef JSFUN_CONSTRUCTOR > *rval = OBJECT_TO_JSVAL( obj ); >+#endif > } > > jsval v = c.toval( oid.str().c_str() ); > assert( JS_SetProperty( cx , obj , "str" , &v ) ); > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > > JSClass object_id_class = { > "ObjectId" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > >+#if JS_VERSION < 185 > JSBool object_id_tostring(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool object_id_tostring(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); >+#if JS_VERSION < 185 > return (JSBool) (*rval = c.getProperty( obj , "str" )); >+#else >+ JS_SET_RVAL( cx , vp , c.getProperty( obj , "str" )); >+ return JS_TRUE; >+#endif > } > > JSFunctionSpec object_id_functions[] = { >+#if JS_VERSION < 185 > { "toString" , object_id_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { 0 } >+#else >+ JS_FS( "toString" , object_id_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > // dbpointer > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool dbpointer_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool dbpointer_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > Convertor c( cx ); > > if ( argc == 2 ) { >@@ -564,6 +782,9 @@ > > assert( JS_SetProperty( cx , obj , "ns" , &(argv[0]) ) ); > assert( JS_SetProperty( cx , obj , "id" , &(argv[1]) ) ); >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > else { >@@ -574,17 +795,31 @@ > > JSClass dbpointer_class = { > "DBPointer" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > JSFunctionSpec dbpointer_functions[] = { >- { 0 } >+ JS_FS_END > }; > > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool dbref_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool dbref_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > Convertor c( cx ); > > if ( argc == 2 ) { >@@ -594,6 +829,9 @@ > assert( JS_SetProperty( cx, o , "$id" , &argv[ 1 ] ) ); > BSONObj bo = c.toObject( o ); > assert( JS_SetPrivate( cx , obj , (void*)(new BSONHolder( bo.getOwned() ) ) ) ); >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > else { >@@ -607,7 +845,17 @@ > > // UUID ************************** > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool uuid_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool uuid_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > Convertor c( cx ); > > if( argc == 0 ) { >@@ -635,6 +883,9 @@ > c.setProperty( obj, "len", c.toval( (double)16 ) ); > c.setProperty( obj, "type", c.toval( (double)3 ) ); > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > else { >@@ -643,7 +894,12 @@ > } > } > >+#if JS_VERSION < 185 > JSBool uuid_tostring(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool uuid_tostring(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > void *holder = JS_GetPrivate( cx, obj ); > assert( holder ); >@@ -652,7 +908,12 @@ > ss << "UUID(\"" << toHex(data, 16); > ss << "\")"; > string ret = ss.str(); >+#if JS_VERSION < 185 > return *rval = c.toval( ret.c_str() ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( ret.c_str() ) ); >+ return JS_TRUE; >+#endif > } > > void uuid_finalize( JSContext * cx , JSObject * obj ) { >@@ -666,19 +927,38 @@ > > JSClass uuid_class = { > "UUID" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, uuid_finalize, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > JSFunctionSpec uuid_functions[] = { >+#if JS_VERSION < 185 > { "toString" , uuid_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { 0 } >+#else >+ JS_FS( "toString" , uuid_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > // BinData ************************** > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool bindata_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool bindata_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > Convertor c( cx ); > > if ( argc == 2 ) { >@@ -702,6 +982,9 @@ > c.setProperty( obj, "len", c.toval( (double)decoded.length() ) ); > c.setProperty( obj, "type", c.toval( (double)type ) ); > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > else { >@@ -710,7 +993,12 @@ > } > } > >+#if JS_VERSION < 185 > JSBool bindata_tostring(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool bindata_tostring(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > int type = (int)c.getNumber( obj , "type" ); > int len = (int)c.getNumber( obj, "len" ); >@@ -722,10 +1010,20 @@ > base64::encode( ss, (const char *)data, len ); > ss << "\")"; > string ret = ss.str(); >+#if JS_VERSION < 185 > return *rval = c.toval( ret.c_str() ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( ret.c_str() ) ); >+ return JS_TRUE; >+#endif > } > >+#if JS_VERSION < 185 > JSBool bindataBase64(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool bindataBase64(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > int len = (int)c.getNumber( obj, "len" ); > void *holder = JS_GetPrivate( cx, obj ); >@@ -734,10 +1032,20 @@ > stringstream ss; > base64::encode( ss, (const char *)data, len ); > string ret = ss.str(); >+#if JS_VERSION < 185 > return *rval = c.toval( ret.c_str() ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( ret.c_str() ) ); >+ return JS_TRUE; >+#endif > } > >+#if JS_VERSION < 185 > JSBool bindataAsHex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool bindataAsHex(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > int len = (int)c.getNumber( obj, "len" ); > void *holder = JS_GetPrivate( cx, obj ); >@@ -750,19 +1058,44 @@ > ss << v; > } > string ret = ss.str(); >+#if JS_VERSION < 185 > return *rval = c.toval( ret.c_str() ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( ret.c_str() ) ); >+ return JS_TRUE; >+#endif > } > >+#if JS_VERSION < 185 > JSBool bindataLength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool bindataLength(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > int len = (int)c.getNumber( obj, "len" ); >+#if JS_VERSION < 185 > return *rval = c.toval((double) len); >+#else >+ JS_SET_RVAL( cx , vp , c.toval((double) len) ); >+ return JS_TRUE; >+#endif > } > >+#if JS_VERSION < 185 > JSBool bindataSubtype(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool bindataSubtype(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > int t = (int)c.getNumber( obj, "type" ); >+#if JS_VERSION < 185 > return *rval = c.toval((double) t); >+#else >+ JS_SET_RVAL( cx , vp , c.toval((double) t) ); >+ return JS_TRUE; >+#endif > } > > void bindata_finalize( JSContext * cx , JSObject * obj ) { >@@ -776,18 +1109,31 @@ > > JSClass bindata_class = { > "BinData" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, bindata_finalize, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > JSFunctionSpec bindata_functions[] = { >+#if JS_VERSION < 185 > { "toString" , bindata_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "hex", bindataAsHex, 0, JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "base64", bindataBase64, 0, JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "length", bindataLength, 0, JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "subtype", bindataSubtype, 0, JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { 0 } >+#else >+ JS_FS( "toString" , bindata_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "hex", bindataAsHex, 0, JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "base64", bindataBase64, 0, JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "length", bindataLength, 0, JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "subtype", bindataSubtype, 0, JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > // Map >@@ -796,7 +1142,16 @@ > return s == "put" || s == "get" || s == "_get" || s == "values" || s == "_data" || s == "constructor" ; > } > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool map_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool map_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > if ( argc > 0 ) { > JS_ReportError( cx , "Map takes no arguments" ); > return JS_FALSE; >@@ -808,10 +1163,19 @@ > jsval a = OBJECT_TO_JSVAL( array ); > JS_SetProperty( cx , obj , "_data" , &a ); > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > >+#if JS_VERSION < 185 > JSBool map_prop( JSContext *cx, JSObject *obj, jsval idval, jsval *vp ) { >+#else >+ JSBool map_prop( JSContext *cx, JSObject *obj, jsid id, jsval *vp ){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > Convertor c(cx); > if ( specialMapString( c.toString( idval ) ) ) > return JS_TRUE; >@@ -821,15 +1185,25 @@ > return JS_FALSE; > } > >+#if JS_VERSION >= 185 >+ JSBool strict_map_prop( JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp ){ >+ return map_prop( cx , obj , id , vp ); >+ } >+#endif >+ > JSClass map_class = { > "Map" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > map_prop, JS_PropertyStub, map_prop, map_prop, >+#else >+ map_prop, JS_PropertyStub, map_prop, strict_map_prop, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > JSFunctionSpec map_functions[] = { >- { 0 } >+ JS_FS_END > }; > > >@@ -837,18 +1211,34 @@ > > JSClass timestamp_class = { > "Timestamp" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool timestamp_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool timestamp_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > smuassert( cx , "Timestamp needs 0 or 2 args" , argc == 0 || argc == 2 ); > > if ( ! JS_InstanceOf( cx , obj , ×tamp_class , 0 ) ) { > obj = JS_NewObject( cx , ×tamp_class , 0 , 0 ); > CHECKNEWOBJECT( obj, cx, "timestamp_constructor" ); >+#ifndef JSFUN_CONSTRUCTOR > *rval = OBJECT_TO_JSVAL( obj ); >+#endif > } > > Convertor c( cx ); >@@ -861,24 +1251,43 @@ > c.setProperty( obj, "i", argv[ 1 ] ); > } > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > > > JSClass numberlong_class = { > "NumberLong" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool numberlong_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool numberlong_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > smuassert( cx , "NumberLong needs 0 or 1 args" , argc == 0 || argc == 1 ); > > if ( ! JS_InstanceOf( cx , obj , &numberlong_class , 0 ) ) { > obj = JS_NewObject( cx , &numberlong_class , 0 , 0 ); > CHECKNEWOBJECT( obj, cx, "numberlong_constructor" ); >+#ifndef JSFUN_CONSTRUCTOR > *rval = OBJECT_TO_JSVAL( obj ); >+#endif > } > > Convertor c( cx ); >@@ -903,19 +1312,42 @@ > c.makeLongObj( n, obj ); > } > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > >+#if JS_VERSION < 185 > JSBool numberlong_valueof(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool numberlong_valueof(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); >+#if JS_VERSION < 185 > return *rval = c.toval( double( c.toNumberLongUnsafe( obj ) ) ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( double( c.toNumberLongUnsafe( obj ) ) ) ); >+ return JS_TRUE; >+#endif > } > >+#if JS_VERSION < 185 > JSBool numberlong_tonumber(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { > return numberlong_valueof( cx, obj, argc, argv, rval ); >+#else >+ JSBool numberlong_tonumber(JSContext *cx, uintN argc, jsval *vp){ >+ return numberlong_valueof( cx, argc, vp ); >+#endif > } > >+#if JS_VERSION < 185 > JSBool numberlong_tostring(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { >+#else >+ JSBool numberlong_tostring(JSContext *cx, uintN argc, jsval *vp){ >+ JSObject *obj = JS_THIS_OBJECT( cx , vp ); >+#endif > Convertor c(cx); > stringstream ss; > long long val = c.toNumberLongUnsafe( obj ); >@@ -927,33 +1359,63 @@ > ss << "NumberLong(" << val << ")"; > > string ret = ss.str(); >+#if JS_VERSION < 185 > return *rval = c.toval( ret.c_str() ); >+#else >+ JS_SET_RVAL( cx , vp , c.toval( ret.c_str() ) ); >+ return JS_TRUE; >+#endif > } > > JSFunctionSpec numberlong_functions[] = { >+#if JS_VERSION < 185 > { "valueOf" , numberlong_valueof , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "toNumber" , numberlong_tonumber , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { "toString" , numberlong_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT, 0 } , > { 0 } >+#else >+ JS_FS( "valueOf" , numberlong_valueof , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "toNumber" , numberlong_tonumber , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS( "toString" , numberlong_tostring , 0 , JSPROP_READONLY | JSPROP_PERMANENT | JSFUN_FAST_NATIVE ) , >+ JS_FS_END >+#endif > }; > > JSClass minkey_class = { > "MinKey" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > JSClass maxkey_class = { > "MaxKey" , JSCLASS_HAS_PRIVATE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+#endif > JS_EnumerateStub, JS_ResolveStub , JS_ConvertStub, JS_FinalizeStub, > JSCLASS_NO_OPTIONAL_MEMBERS > }; > > // dbquery > >+#ifdef JSFUN_CONSTRUCTOR >+ JSBool dbquery_constructor( JSContext* cx, uintN argc, jsval* vp ){ >+ jsval *argv = JS_ARGV( cx , vp ); >+ JSObject *obj = JS_NewObjectForConstructor( cx , vp ); >+ if( ! obj ) { >+ JS_ReportError( cx , "Failed to create 'this' object" ); >+ return JS_FALSE; >+ } >+#else > JSBool dbquery_constructor( JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval ) { >+#endif > smuassert( cx , "DDQuery needs at least 4 args" , argc >= 4 ); > > Convertor c(cx); >@@ -1001,28 +1463,42 @@ > c.setProperty( obj , "_numReturned" , JSVAL_ZERO ); > c.setProperty( obj , "_special" , JSVAL_FALSE ); > >+#ifdef JSFUN_CONSTRUCTOR >+ JS_SET_RVAL( cx , vp , OBJECT_TO_JSVAL( obj ) ); >+#endif > return JS_TRUE; > } > >- JSBool dbquery_resolve( JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp ) { >+#if JS_VERSION < 185 >+ JSBool dbquery_resolve( JSContext *cx, JSObject *obj, jsval idval, uintN flags, JSObject **objp ) { >+#else >+ JSBool dbquery_resolve( JSContext *cx, JSObject *obj, jsid id, uintN flags, JSObject **objp ){ >+ jsval idval; >+ JS_IdToValue( cx , id , &idval ); >+#endif > if ( flags & JSRESOLVE_ASSIGNING ) > return JS_TRUE; > >- if ( ! JSVAL_IS_NUMBER( id ) ) >+ if ( ! JSVAL_IS_NUMBER( idval ) ) > return JS_TRUE; > > jsval val = JSVAL_VOID; >- assert( JS_CallFunctionName( cx , obj , "arrayAccess" , 1 , &id , &val ) ); >+ assert( JS_CallFunctionName( cx , obj , "arrayAccess" , 1 , &idval , &val ) ); > Convertor c(cx); >- c.setProperty( obj , c.toString( id ).c_str() , val ); >+ c.setProperty( obj , c.toString( idval ).c_str() , val ); > *objp = obj; > return JS_TRUE; > } > > JSClass dbquery_class = { > "DBQuery" , JSCLASS_NEW_RESOLVE , >+#if JS_VERSION < 185 > JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, > JS_EnumerateStub, (JSResolveOp)(&dbquery_resolve) , JS_ConvertStub, JS_FinalizeStub, >+#else >+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, >+ JS_EnumerateStub, (JSResolveOp)dbquery_resolve , JS_ConvertStub, JS_FinalizeStub, >+#endif > JSCLASS_NO_OPTIONAL_MEMBERS > }; > >@@ -1102,7 +1578,7 @@ > return true; > } > >-#if defined( SM16 ) || defined( MOZJS ) >+#if defined( SM16 ) || JS_VERSION >= 181 > #warning dates do not work in your version of spider monkey > { > jsdouble d = js_DateGetMsecSinceEpoch( c->_context , o ); >@@ -1150,7 +1626,7 @@ > } > > bool isDate( JSContext * cx , JSObject * o ) { >-#if defined( SM16 ) || defined( MOZJS ) || defined( XULRUNNER ) >+#if defined( SM16 ) || JS_VERSION >= 181 || defined( XULRUNNER ) > return js_DateGetMsecSinceEpoch( cx , o ) != 0; > #else > return JS_InstanceOf( cx , o, &js_DateClass, 0 ); >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 376983
:
281881
|
282575
| 282729