gecko-dev/xpcom/ds/nsIVariant.idl
Nika Layzell 1c2a9c2b07 Bug 1526382 - Part 1: Split nsID& and nsID* in xpconnect, r=mccr8
Currently the [ref] and [ptr] types share the same underlying
implementation. This is unfortunate, and can cause correctness problems
with outparam refs (as an example).

By using the same tools used to allow other larger objects (such as
jsid, nsTArray, and nsString) to be stored directly in the nsXPTCVariant
object, this patch directly stores the nsID in the nsXPTCVariant object
when calling from JS into C++.

Using this new strategy avoids an nsID* allocation every time we pass
one over XPConnect, and should also allow us to simplify callers.

In addition, some special casing is added to xpidl to make it possible
to use the nsid reference type objects directly inside of Array<T>,
which will allow us to remove `[array] nsIIDPtr` callers.

Differential Revision: https://phabricator.services.mozilla.com/D19175

--HG--
extra : moz-landing-system : lando
2019-02-13 21:42:00 +00:00

163 lines
6.1 KiB
Plaintext

/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* 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/. */
/* The long avoided variant support for xpcom. */
#include "nsISupports.idl"
%{C++
#include "xptinfo.h"
// This enum class used to be a const-only XPIDL interface, containing literal
// integer descriptions of the different fields. Instead, it now directly
// references the nsXPTTypeTag variants VTYPE_ are intended to match.
struct nsIDataType
{
enum {
// These MUST match the declarations in xptinfo.h.
// Otherwise the world is likely to explode.
VTYPE_INT8 = TD_INT8 ,
VTYPE_INT16 = TD_INT16 ,
VTYPE_INT32 = TD_INT32 ,
VTYPE_INT64 = TD_INT64 ,
VTYPE_UINT8 = TD_UINT8 ,
VTYPE_UINT16 = TD_UINT16 ,
VTYPE_UINT32 = TD_UINT32 ,
VTYPE_UINT64 = TD_UINT64 ,
VTYPE_FLOAT = TD_FLOAT ,
VTYPE_DOUBLE = TD_DOUBLE ,
VTYPE_BOOL = TD_BOOL ,
VTYPE_CHAR = TD_CHAR ,
VTYPE_WCHAR = TD_WCHAR ,
VTYPE_VOID = TD_VOID ,
VTYPE_ID = TD_NSIDPTR ,
VTYPE_CHAR_STR = TD_PSTRING ,
VTYPE_WCHAR_STR = TD_PWSTRING ,
VTYPE_INTERFACE = TD_INTERFACE_TYPE ,
VTYPE_INTERFACE_IS = TD_INTERFACE_IS_TYPE,
VTYPE_ARRAY = TD_LEGACY_ARRAY ,
VTYPE_STRING_SIZE_IS = TD_PSTRING_SIZE_IS ,
VTYPE_WSTRING_SIZE_IS = TD_PWSTRING_SIZE_IS ,
VTYPE_UTF8STRING = TD_UTF8STRING ,
VTYPE_CSTRING = TD_CSTRING ,
VTYPE_ASTRING = TD_ASTRING ,
// Non-xpt variant types
VTYPE_EMPTY_ARRAY = 254 ,
VTYPE_EMPTY = 255
};
};
%}
/**
* XPConnect has magic to transparently convert between nsIVariant and JS types.
* We mark the interface [scriptable] so that JS can use methods
* that refer to this interface. But we mark all the methods and attributes
* [noscript] since any nsIVariant object will be automatically converted to a
* JS type anyway.
*/
[scriptable, uuid(81e4c2de-acac-4ad6-901a-b5fb1b851a0d)]
interface nsIVariant : nsISupports
{
[notxpcom,nostdcall] readonly attribute uint16_t dataType;
[noscript] uint8_t getAsInt8();
[noscript] int16_t getAsInt16();
[noscript] int32_t getAsInt32();
[noscript] int64_t getAsInt64();
[noscript] uint8_t getAsUint8();
[noscript] uint16_t getAsUint16();
[noscript] uint32_t getAsUint32();
[noscript] uint64_t getAsUint64();
[noscript] float getAsFloat();
[noscript] double getAsDouble();
[noscript] boolean getAsBool();
[noscript] char getAsChar();
[noscript] wchar getAsWChar();
[notxpcom] nsresult getAsID(out nsID retval);
[noscript] AString getAsAString();
[noscript] ACString getAsACString();
[noscript] AUTF8String getAsAUTF8String();
[noscript] string getAsString();
[noscript] wstring getAsWString();
[noscript] nsISupports getAsISupports();
[noscript] jsval getAsJSVal();
[noscript] void getAsInterface(out nsIIDPtr iid,
[iid_is(iid), retval] out nsQIResult iface);
[notxpcom] nsresult getAsArray(out uint16_t type, out nsIID iid,
out uint32_t count, out voidPtr ptr);
[noscript] void getAsStringWithSize(out uint32_t size,
[size_is(size), retval] out string str);
[noscript] void getAsWStringWithSize(out uint32_t size,
[size_is(size), retval] out wstring str);
};
/**
* An object that implements nsIVariant may or may NOT also implement this
* nsIWritableVariant.
*
* If the 'writable' attribute is false then attempts to call any of the 'set'
* methods can be expected to fail. Setting the 'writable' attribute may or
* may not succeed.
*
*/
[scriptable, uuid(5586a590-8c82-11d5-90f3-0010a4e73d9a)]
interface nsIWritableVariant : nsIVariant
{
attribute boolean writable;
void setAsInt8(in uint8_t aValue);
void setAsInt16(in int16_t aValue);
void setAsInt32(in int32_t aValue);
void setAsInt64(in int64_t aValue);
void setAsUint8(in uint8_t aValue);
void setAsUint16(in uint16_t aValue);
void setAsUint32(in uint32_t aValue);
void setAsUint64(in uint64_t aValue);
void setAsFloat(in float aValue);
void setAsDouble(in double aValue);
void setAsBool(in boolean aValue);
void setAsChar(in char aValue);
void setAsWChar(in wchar aValue);
void setAsID(in nsIDRef aValue);
void setAsAString(in AString aValue);
void setAsACString(in ACString aValue);
void setAsAUTF8String(in AUTF8String aValue);
void setAsString(in string aValue);
void setAsWString(in wstring aValue);
void setAsISupports(in nsISupports aValue);
void setAsInterface(in nsIIDRef iid,
[iid_is(iid)] in nsQIResult iface);
[noscript] void setAsArray(in uint16_t type, in nsIIDPtr iid,
in uint32_t count, in voidPtr ptr);
void setAsStringWithSize(in uint32_t size,
[size_is(size)] in string str);
void setAsWStringWithSize(in uint32_t size,
[size_is(size)] in wstring str);
void setAsVoid();
void setAsEmpty();
void setAsEmptyArray();
void setFromVariant(in nsIVariant aValue);
};
%{C++
// The contractID for the generic implementation built in to xpcom.
#define NS_VARIANT_CONTRACTID "@mozilla.org/variant;1"
%}