forked from mirrors/gecko-dev
		
	 bf48aecf29
			
		
	
	
		bf48aecf29
		
	
	
	
	
		
			
			nsIXPCScriptable flags handling in xpc_map_end.h is a bit of a mess. - Half the flags relate to whether various functions are defined (PreCreate, GetProperty, etc). These are set using the XPC_MAP_WANT_* macros; for each one xpc_map_end.h inserts the corresponding flag using the preprocessor (see XPC_MAP_CLASSNAME::GetScriptableFlags()). - The other half of the flags relate to other things (IS_GLOBAL_OBJECT, DONT_REFLECT_INTERFACE_NAMES, etc). These are set using the XPC_MAP_FLAGS macro. Having two similar but different mechanisms to set the flags for a class is confusing. (Indeed, until recently we had some classes where a single flag was redundantly specified via both mechanisms.) Note also that the classes done in dom/base/nsIDOMClassInfo.h also specify all the flags in a single value, similar to how XPC_MAP_FLAGS works. This patch removes the XPC_MAP_WANT_* macros. All flags are now set via XPC_MAP_FLAGS. This is a significant simplification to xpc_map_end.h and all the places that use it. The downside of this change is that I had to change the flag constants from class constants (i.e. nsIXPCScriptable::FOO) to macros (i.e. NSIXPCSCRIPTABLE_FOO) because they need to be used in #if statements like this in xpc_map_end.h: #if !((XPC_MAP_FLAGS) & NSIXPCSCRIPTABLE_WANT_PRECREATE) and you can't use a '::'-qualified name inside a #if. I think this downside is outweighed by the simplification described above. Overall the patch removes 80 lines of code. --HG-- extra : rebase_source : 6d5c341d0deba8f1529d81c17bb8819e09620b05
		
			
				
	
	
		
			153 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 | |
|  * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ :
 | |
|  * This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "nsIXPConnect.h"
 | |
| #include "mozStorageAsyncStatement.h"
 | |
| #include "mozStorageService.h"
 | |
| 
 | |
| #include "nsMemory.h"
 | |
| #include "nsString.h"
 | |
| #include "nsServiceManagerUtils.h"
 | |
| 
 | |
| #include "mozStorageAsyncStatementJSHelper.h"
 | |
| 
 | |
| #include "mozStorageAsyncStatementParams.h"
 | |
| 
 | |
| #include "jsapi.h"
 | |
| 
 | |
| #include "xpc_make_class.h"
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace storage {
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| //// AsyncStatementJSHelper
 | |
| 
 | |
| nsresult
 | |
| AsyncStatementJSHelper::getParams(AsyncStatement *aStatement,
 | |
|                                   JSContext *aCtx,
 | |
|                                   JSObject *aScopeObj,
 | |
|                                   JS::Value *_params)
 | |
| {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   nsresult rv;
 | |
| 
 | |
| #ifdef DEBUG
 | |
|   int32_t state;
 | |
|   (void)aStatement->GetState(&state);
 | |
|   NS_ASSERTION(state == mozIStorageAsyncStatement::MOZ_STORAGE_STATEMENT_READY,
 | |
|                "Invalid state to get the params object - all calls will fail!");
 | |
| #endif
 | |
| 
 | |
|   if (!aStatement->mStatementParamsHolder) {
 | |
|     nsCOMPtr<mozIStorageStatementParams> params =
 | |
|       new AsyncStatementParams(aStatement);
 | |
|     NS_ENSURE_TRUE(params, NS_ERROR_OUT_OF_MEMORY);
 | |
| 
 | |
|     JS::RootedObject scope(aCtx, aScopeObj);
 | |
|     nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
 | |
|     nsCOMPtr<nsIXPConnect> xpc(Service::getXPConnect());
 | |
|     rv = xpc->WrapNativeHolder(
 | |
|       aCtx,
 | |
|       ::JS_GetGlobalForObject(aCtx, scope),
 | |
|       params,
 | |
|       NS_GET_IID(mozIStorageStatementParams),
 | |
|       getter_AddRefs(holder)
 | |
|     );
 | |
|     NS_ENSURE_SUCCESS(rv, rv);
 | |
|     RefPtr<AsyncStatementParamsHolder> paramsHolder =
 | |
|       new AsyncStatementParamsHolder(holder);
 | |
|     aStatement->mStatementParamsHolder =
 | |
|       new nsMainThreadPtrHolder<nsIXPConnectJSObjectHolder>(paramsHolder);
 | |
|   }
 | |
| 
 | |
|   JS::Rooted<JSObject*> obj(aCtx);
 | |
|   obj = aStatement->mStatementParamsHolder->GetJSObject();
 | |
|   NS_ENSURE_STATE(obj);
 | |
| 
 | |
|   _params->setObject(*obj);
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| NS_IMETHODIMP_(MozExternalRefCountType) AsyncStatementJSHelper::AddRef() { return 2; }
 | |
| NS_IMETHODIMP_(MozExternalRefCountType) AsyncStatementJSHelper::Release() { return 1; }
 | |
| NS_INTERFACE_MAP_BEGIN(AsyncStatementJSHelper)
 | |
|   NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable)
 | |
|   NS_INTERFACE_MAP_ENTRY(nsISupports)
 | |
| NS_INTERFACE_MAP_END
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| //// nsIXPCScriptable
 | |
| 
 | |
| #define XPC_MAP_CLASSNAME         AsyncStatementJSHelper
 | |
| #define XPC_MAP_QUOTED_CLASSNAME "AsyncStatementJSHelper"
 | |
| #define XPC_MAP_FLAGS (XPC_SCRIPTABLE_WANT_GETPROPERTY | \
 | |
|                        XPC_SCRIPTABLE_ALLOW_PROP_MODS_DURING_RESOLVE)
 | |
| #include "xpc_map_end.h"
 | |
| 
 | |
| NS_IMETHODIMP
 | |
| AsyncStatementJSHelper::GetProperty(nsIXPConnectWrappedNative *aWrapper,
 | |
|                                     JSContext *aCtx,
 | |
|                                     JSObject *aScopeObj,
 | |
|                                     jsid aId,
 | |
|                                     JS::Value *_result,
 | |
|                                     bool *_retval)
 | |
| {
 | |
|   if (!JSID_IS_STRING(aId))
 | |
|     return NS_OK;
 | |
| 
 | |
|   // Cast to async via mozI* since direct from nsISupports is ambiguous.
 | |
|   JS::RootedObject scope(aCtx, aScopeObj);
 | |
|   JS::RootedId id(aCtx, aId);
 | |
|   mozIStorageAsyncStatement *iAsyncStmt =
 | |
|     static_cast<mozIStorageAsyncStatement *>(aWrapper->Native());
 | |
|   AsyncStatement *stmt = static_cast<AsyncStatement *>(iAsyncStmt);
 | |
| 
 | |
| #ifdef DEBUG
 | |
|   {
 | |
|     nsISupports *supp = aWrapper->Native();
 | |
|     nsCOMPtr<mozIStorageAsyncStatement> isStatement(do_QueryInterface(supp));
 | |
|     NS_ASSERTION(isStatement, "How is this not an async statement?!");
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   if (::JS_FlatStringEqualsAscii(JSID_TO_FLAT_STRING(id), "params"))
 | |
|     return getParams(stmt, aCtx, scope, _result);
 | |
| 
 | |
|   return NS_OK;
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
| //// AsyncStatementParamsHolder
 | |
| 
 | |
| NS_IMPL_ISUPPORTS(AsyncStatementParamsHolder, nsIXPConnectJSObjectHolder);
 | |
| 
 | |
| JSObject*
 | |
| AsyncStatementParamsHolder::GetJSObject()
 | |
| {
 | |
|   return mHolder->GetJSObject();
 | |
| }
 | |
| 
 | |
| AsyncStatementParamsHolder::AsyncStatementParamsHolder(nsIXPConnectJSObjectHolder* aHolder)
 | |
|   : mHolder(aHolder)
 | |
| {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   MOZ_ASSERT(mHolder);
 | |
| }
 | |
| 
 | |
| AsyncStatementParamsHolder::~AsyncStatementParamsHolder()
 | |
| {
 | |
|   MOZ_ASSERT(NS_IsMainThread());
 | |
|   // We are considered dead at this point, so any wrappers for row or params
 | |
|   // need to lose their reference to the statement.
 | |
|   nsCOMPtr<nsIXPConnectWrappedNative> wrapper = do_QueryInterface(mHolder);
 | |
|   nsCOMPtr<mozIStorageStatementParams> iObj = do_QueryWrappedNative(wrapper);
 | |
|   AsyncStatementParams *obj = static_cast<AsyncStatementParams *>(iObj.get());
 | |
|   obj->mStatement = nullptr;
 | |
| }
 | |
| 
 | |
| } // namespace storage
 | |
| } // namespace mozilla
 |