As you can see, we're not running in the browser - this is standalone xpconnect for a 3d engine. We're calling JS_GC regularly and myPosition doesn't get destroyed. myCamera - which we're getting using standard idl-based xpcom interfaces - is correctly destroyed when gc happens.
You might define GC_MARK_DEBUG and recompile js/src, then programmatically set js_LiveThingToFind (you can declare it as an extern "C" void * in your code) to myPosition in your C++ code. The GC will dump the reference path from a root by which it marked this object as still alive. That ought to be revealing, although if the root is the wrapper, then you'll have big fun finding the unbalanced reference count! ;-)
/be
