forked from mirrors/gecko-dev
Bug 552525 - Get rid of container classes with static functions in CTypes.h/cpp. r=benjamn
This commit is contained in:
parent
e633660798
commit
c5e94efd8d
4 changed files with 273 additions and 201 deletions
|
|
@ -58,12 +58,155 @@ namespace mozilla {
|
||||||
namespace ctypes {
|
namespace ctypes {
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** JSAPI callback function prototypes
|
** JSAPI function prototypes
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
static JSBool ConstructAbstract(JSContext* cx, JSObject* obj, uintN argc,
|
static JSBool ConstructAbstract(JSContext* cx, JSObject* obj, uintN argc,
|
||||||
jsval* argv, jsval* rval);
|
jsval* argv, jsval* rval);
|
||||||
|
|
||||||
|
namespace CType {
|
||||||
|
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc,
|
||||||
|
jsval* argv, jsval* rval);
|
||||||
|
static JSBool ConstructBasic(JSContext* cx, JSObject* obj, uintN argc,
|
||||||
|
jsval* argv, jsval* rval);
|
||||||
|
|
||||||
|
static void Trace(JSTracer* trc, JSObject* obj);
|
||||||
|
static void Finalize(JSContext* cx, JSObject* obj);
|
||||||
|
static void FinalizeProtoClass(JSContext* cx, JSObject* obj);
|
||||||
|
|
||||||
|
static JSBool PrototypeGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool NameGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool SizeGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool PtrGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
||||||
|
static JSBool Array(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ToString(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool HasInstance(JSContext* cx, JSObject* obj, jsval v, JSBool* bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PointerType {
|
||||||
|
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc,
|
||||||
|
jsval* argv, jsval* rval);
|
||||||
|
|
||||||
|
static JSBool TargetTypeGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool ContentsGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool ContentsSetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool IsNull(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace ArrayType {
|
||||||
|
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc,
|
||||||
|
jsval* argv, jsval* rval);
|
||||||
|
|
||||||
|
static JSBool ElementTypeGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool LengthGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool Getter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
||||||
|
static JSBool Setter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
||||||
|
static JSBool AddressOfElement(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace StructType {
|
||||||
|
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc,
|
||||||
|
jsval* argv, jsval* rval);
|
||||||
|
|
||||||
|
static JSBool FieldsArrayGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool FieldGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool FieldSetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool AddressOfField(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace FunctionType {
|
||||||
|
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc,
|
||||||
|
jsval* argv, jsval* rval);
|
||||||
|
|
||||||
|
static JSBool Call(JSContext* cx, JSObject* obj, uintN argc, jsval* argv,
|
||||||
|
jsval* rval);
|
||||||
|
|
||||||
|
static JSBool ArgTypesGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool ReturnTypeGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool ABIGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CClosure {
|
||||||
|
static void Trace(JSTracer* trc, JSObject* obj);
|
||||||
|
static void Finalize(JSContext* cx, JSObject* obj);
|
||||||
|
|
||||||
|
// libffi callback
|
||||||
|
static void ClosureStub(ffi_cif* cif, void* result, void** args,
|
||||||
|
void* userData);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CData {
|
||||||
|
static void Finalize(JSContext* cx, JSObject* obj);
|
||||||
|
|
||||||
|
static JSBool ValueGetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool ValueSetter(JSContext* cx, JSObject* obj, jsval idval,
|
||||||
|
jsval* vp);
|
||||||
|
static JSBool Address(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ReadString(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64Base provides functions common to Int64 and UInt64.
|
||||||
|
namespace Int64Base {
|
||||||
|
JSObject* Construct(JSContext* cx, JSObject* proto, PRUint64 data,
|
||||||
|
bool isUnsigned);
|
||||||
|
|
||||||
|
PRUint64 GetInt(JSContext* cx, JSObject* obj);
|
||||||
|
|
||||||
|
JSBool ToString(JSContext* cx, JSObject* obj, uintN argc, jsval* vp,
|
||||||
|
bool isUnsigned);
|
||||||
|
|
||||||
|
JSBool ToSource(JSContext* cx, JSObject* obj, uintN argc, jsval* vp,
|
||||||
|
bool isUnsigned);
|
||||||
|
|
||||||
|
static void Finalize(JSContext* cx, JSObject* obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Int64 {
|
||||||
|
static JSBool Construct(JSContext* cx, JSObject* obj, uintN argc, jsval* argv,
|
||||||
|
jsval* rval);
|
||||||
|
|
||||||
|
static JSBool ToString(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
|
||||||
|
static JSBool Compare(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool Lo(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool Hi(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool Join(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace UInt64 {
|
||||||
|
static JSBool Construct(JSContext* cx, JSObject* obj, uintN argc, jsval* argv,
|
||||||
|
jsval* rval);
|
||||||
|
|
||||||
|
static JSBool ToString(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
|
||||||
|
static JSBool Compare(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool Lo(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool Hi(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool Join(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** JSClass definitions and initialization functions
|
** JSClass definitions and initialization functions
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
@ -4019,6 +4162,28 @@ StructType::AddressOfField(JSContext* cx, uintN argc, jsval *vp)
|
||||||
** FunctionType implementation
|
** FunctionType implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
// Helper class for handling allocation of function arguments.
|
||||||
|
struct AutoValue
|
||||||
|
{
|
||||||
|
AutoValue() : mData(NULL) { }
|
||||||
|
|
||||||
|
~AutoValue()
|
||||||
|
{
|
||||||
|
delete[] static_cast<char*>(mData);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SizeToType(JSContext* cx, JSObject* type)
|
||||||
|
{
|
||||||
|
size_t size = CType::GetSize(cx, type);
|
||||||
|
mData = new char[size];
|
||||||
|
if (mData)
|
||||||
|
memset(mData, 0, size);
|
||||||
|
return mData != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* mData;
|
||||||
|
};
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
GetABI(JSContext* cx, jsval abiType, ffi_abi& result)
|
GetABI(JSContext* cx, jsval abiType, ffi_abi& result)
|
||||||
{
|
{
|
||||||
|
|
@ -5267,8 +5432,8 @@ Int64::Compare(JSContext* cx, uintN argc, jsval* vp)
|
||||||
JSObject* obj1 = JSVAL_TO_OBJECT(argv[0]);
|
JSObject* obj1 = JSVAL_TO_OBJECT(argv[0]);
|
||||||
JSObject* obj2 = JSVAL_TO_OBJECT(argv[1]);
|
JSObject* obj2 = JSVAL_TO_OBJECT(argv[1]);
|
||||||
|
|
||||||
PRInt64 i1 = GetInt(cx, obj1);
|
PRInt64 i1 = Int64Base::GetInt(cx, obj1);
|
||||||
PRInt64 i2 = GetInt(cx, obj2);
|
PRInt64 i2 = Int64Base::GetInt(cx, obj2);
|
||||||
|
|
||||||
if (i1 == i2)
|
if (i1 == i2)
|
||||||
JS_SET_RVAL(cx, vp, INT_TO_JSVAL(0));
|
JS_SET_RVAL(cx, vp, INT_TO_JSVAL(0));
|
||||||
|
|
@ -5295,7 +5460,7 @@ Int64::Lo(JSContext* cx, uintN argc, jsval* vp)
|
||||||
}
|
}
|
||||||
|
|
||||||
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
||||||
PRInt64 u = GetInt(cx, obj);
|
PRInt64 u = Int64Base::GetInt(cx, obj);
|
||||||
jsdouble d = PRUint32(INT64_LO(u));
|
jsdouble d = PRUint32(INT64_LO(u));
|
||||||
|
|
||||||
jsval result;
|
jsval result;
|
||||||
|
|
@ -5317,7 +5482,7 @@ Int64::Hi(JSContext* cx, uintN argc, jsval* vp)
|
||||||
}
|
}
|
||||||
|
|
||||||
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
||||||
PRInt64 u = GetInt(cx, obj);
|
PRInt64 u = Int64Base::GetInt(cx, obj);
|
||||||
jsdouble d = PRInt32(INT64_HI(u));
|
jsdouble d = PRInt32(INT64_HI(u));
|
||||||
|
|
||||||
jsval result;
|
jsval result;
|
||||||
|
|
@ -5440,8 +5605,8 @@ UInt64::Compare(JSContext* cx, uintN argc, jsval* vp)
|
||||||
JSObject* obj1 = JSVAL_TO_OBJECT(argv[0]);
|
JSObject* obj1 = JSVAL_TO_OBJECT(argv[0]);
|
||||||
JSObject* obj2 = JSVAL_TO_OBJECT(argv[1]);
|
JSObject* obj2 = JSVAL_TO_OBJECT(argv[1]);
|
||||||
|
|
||||||
PRUint64 u1 = GetInt(cx, obj1);
|
PRUint64 u1 = Int64Base::GetInt(cx, obj1);
|
||||||
PRUint64 u2 = GetInt(cx, obj2);
|
PRUint64 u2 = Int64Base::GetInt(cx, obj2);
|
||||||
|
|
||||||
if (u1 == u2)
|
if (u1 == u2)
|
||||||
JS_SET_RVAL(cx, vp, INT_TO_JSVAL(0));
|
JS_SET_RVAL(cx, vp, INT_TO_JSVAL(0));
|
||||||
|
|
@ -5464,7 +5629,7 @@ UInt64::Lo(JSContext* cx, uintN argc, jsval* vp)
|
||||||
}
|
}
|
||||||
|
|
||||||
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
||||||
PRUint64 u = GetInt(cx, obj);
|
PRUint64 u = Int64Base::GetInt(cx, obj);
|
||||||
jsdouble d = PRUint32(INT64_LO(u));
|
jsdouble d = PRUint32(INT64_LO(u));
|
||||||
|
|
||||||
jsval result;
|
jsval result;
|
||||||
|
|
@ -5486,7 +5651,7 @@ UInt64::Hi(JSContext* cx, uintN argc, jsval* vp)
|
||||||
}
|
}
|
||||||
|
|
||||||
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
||||||
PRUint64 u = GetInt(cx, obj);
|
PRUint64 u = Int64Base::GetInt(cx, obj);
|
||||||
jsdouble d = PRUint32(INT64_HI(u));
|
jsdouble d = PRUint32(INT64_HI(u));
|
||||||
|
|
||||||
jsval result;
|
jsval result;
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,10 @@
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace ctypes {
|
namespace ctypes {
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** Function and struct API definitions
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
// for JS error reporting
|
// for JS error reporting
|
||||||
enum ErrorNum {
|
enum ErrorNum {
|
||||||
#define MSG_DEF(name, number, count, exception, format) \
|
#define MSG_DEF(name, number, count, exception, format) \
|
||||||
|
|
@ -126,12 +130,19 @@ struct ClosureInfo
|
||||||
|
|
||||||
JSBool InitTypeClasses(JSContext* cx, JSObject* parent);
|
JSBool InitTypeClasses(JSContext* cx, JSObject* parent);
|
||||||
|
|
||||||
JSBool ConvertToJS(JSContext* cx, JSObject* typeObj, JSObject* dataObj, void* data, bool wantPrimitive, bool ownResult, jsval* result);
|
JSBool ConvertToJS(JSContext* cx, JSObject* typeObj, JSObject* dataObj,
|
||||||
JSBool ImplicitConvert(JSContext* cx, jsval val, JSObject* targetType, void* buffer, bool isArgument, bool* freePointer);
|
void* data, bool wantPrimitive, bool ownResult, jsval* result);
|
||||||
JSBool ExplicitConvert(JSContext* cx, jsval val, JSObject* targetType, void* buffer);
|
|
||||||
|
JSBool ImplicitConvert(JSContext* cx, jsval val, JSObject* targetType,
|
||||||
|
void* buffer, bool isArgument, bool* freePointer);
|
||||||
|
|
||||||
|
JSBool ExplicitConvert(JSContext* cx, jsval val, JSObject* targetType,
|
||||||
|
void* buffer);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** JSClass reserved slot definitions
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
// Contents of the various slots on each JSClass. The slot indexes are given
|
|
||||||
// enumerated names for readability.
|
|
||||||
enum CABISlot {
|
enum CABISlot {
|
||||||
SLOT_ABICODE = 0, // ABICode of the CABI object
|
SLOT_ABICODE = 0, // ABICode of the CABI object
|
||||||
CABI_SLOTS
|
CABI_SLOTS
|
||||||
|
|
@ -201,195 +212,88 @@ enum Int64FunctionSlot {
|
||||||
// JSFunction objects always get exactly two slots.
|
// JSFunction objects always get exactly two slots.
|
||||||
};
|
};
|
||||||
|
|
||||||
class CType {
|
/*******************************************************************************
|
||||||
public:
|
** Object API definitions
|
||||||
static JSObject* Create(JSContext* cx, JSObject* typeProto, JSObject* dataProto, TypeCode type, JSString* name, jsval size, jsval align, ffi_type* ffiType, PropertySpec* ps);
|
*******************************************************************************/
|
||||||
static JSObject* DefineBuiltin(JSContext* cx, JSObject* parent, const char* propName, JSObject* typeProto, JSObject* dataProto, const char* name, TypeCode type, jsval size, jsval align, ffi_type* ffiType);
|
|
||||||
static void Trace(JSTracer* trc, JSObject* obj);
|
|
||||||
static void Finalize(JSContext* cx, JSObject* obj);
|
|
||||||
static void FinalizeProtoClass(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static JSBool ConstructAbstract(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
namespace CType {
|
||||||
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
JSObject* Create(JSContext* cx, JSObject* typeProto, JSObject* dataProto,
|
||||||
static JSBool ConstructBasic(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
TypeCode type, JSString* name, jsval size, jsval align, ffi_type* ffiType,
|
||||||
|
PropertySpec* ps);
|
||||||
|
|
||||||
static bool IsCType(JSContext* cx, JSObject* obj);
|
JSObject* DefineBuiltin(JSContext* cx, JSObject* parent, const char* propName,
|
||||||
static TypeCode GetTypeCode(JSContext* cx, JSObject* typeObj);
|
JSObject* typeProto, JSObject* dataProto, const char* name, TypeCode type,
|
||||||
static bool TypesEqual(JSContext* cx, JSObject* t1, JSObject* t2);
|
jsval size, jsval align, ffi_type* ffiType);
|
||||||
static size_t GetSize(JSContext* cx, JSObject* obj);
|
|
||||||
static bool GetSafeSize(JSContext* cx, JSObject* obj, size_t* result);
|
|
||||||
static bool IsSizeDefined(JSContext* cx, JSObject* obj);
|
|
||||||
static size_t GetAlignment(JSContext* cx, JSObject* obj);
|
|
||||||
static ffi_type* GetFFIType(JSContext* cx, JSObject* obj);
|
|
||||||
static JSString* GetName(JSContext* cx, JSObject* obj);
|
|
||||||
static JSObject* GetProtoFromCtor(JSContext* cx, JSObject* obj, CTypeProtoSlot slot);
|
|
||||||
static JSObject* GetProtoFromType(JSContext* cx, JSObject* obj, CTypeProtoSlot slot);
|
|
||||||
|
|
||||||
static JSBool PrototypeGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
bool IsCType(JSContext* cx, JSObject* obj);
|
||||||
static JSBool NameGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
TypeCode GetTypeCode(JSContext* cx, JSObject* typeObj);
|
||||||
static JSBool SizeGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
bool TypesEqual(JSContext* cx, JSObject* t1, JSObject* t2);
|
||||||
static JSBool PtrGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
size_t GetSize(JSContext* cx, JSObject* obj);
|
||||||
static JSBool Array(JSContext* cx, uintN argc, jsval* vp);
|
bool GetSafeSize(JSContext* cx, JSObject* obj, size_t* result);
|
||||||
static JSBool ToString(JSContext* cx, uintN argc, jsval* vp);
|
bool IsSizeDefined(JSContext* cx, JSObject* obj);
|
||||||
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
size_t GetAlignment(JSContext* cx, JSObject* obj);
|
||||||
static JSBool HasInstance(JSContext* cx, JSObject* obj, jsval v, JSBool* bp);
|
ffi_type* GetFFIType(JSContext* cx, JSObject* obj);
|
||||||
};
|
JSString* GetName(JSContext* cx, JSObject* obj);
|
||||||
|
JSObject* GetProtoFromCtor(JSContext* cx, JSObject* obj, CTypeProtoSlot slot);
|
||||||
class PointerType {
|
JSObject* GetProtoFromType(JSContext* cx, JSObject* obj, CTypeProtoSlot slot);
|
||||||
public:
|
|
||||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSObject* CreateInternal(JSContext* cx, JSObject* ctor, JSObject* baseType, JSString* name);
|
|
||||||
|
|
||||||
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
|
||||||
|
|
||||||
static JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static JSBool TargetTypeGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool IsNull(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool ContentsGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool ContentsSetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
};
|
|
||||||
|
|
||||||
class ArrayType {
|
|
||||||
public:
|
|
||||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSObject* CreateInternal(JSContext* cx, JSObject* baseType, size_t length, bool lengthDefined);
|
|
||||||
|
|
||||||
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
|
||||||
|
|
||||||
static JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
|
||||||
static size_t GetLength(JSContext* cx, JSObject* obj);
|
|
||||||
static bool GetSafeLength(JSContext* cx, JSObject* obj, size_t* result);
|
|
||||||
|
|
||||||
static JSBool ElementTypeGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool LengthGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool Getter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool Setter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool AddressOfElement(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
};
|
|
||||||
|
|
||||||
class StructType {
|
|
||||||
public:
|
|
||||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
|
|
||||||
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
|
||||||
|
|
||||||
static nsTArray<FieldInfo>* GetFieldInfo(JSContext* cx, JSObject* obj);
|
|
||||||
static FieldInfo* LookupField(JSContext* cx, JSObject* obj, jsval idval);
|
|
||||||
|
|
||||||
static JSBool FieldsArrayGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool FieldGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool FieldSetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool AddressOfField(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Helper class for handling allocation of function arguments.
|
|
||||||
struct AutoValue
|
|
||||||
{
|
|
||||||
AutoValue() : mData(NULL) { }
|
|
||||||
|
|
||||||
~AutoValue()
|
|
||||||
{
|
|
||||||
delete[] static_cast<char*>(mData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SizeToType(JSContext* cx, JSObject* type)
|
namespace PointerType {
|
||||||
{
|
JSObject* CreateInternal(JSContext* cx, JSObject* ctor, JSObject* baseType,
|
||||||
size_t size = CType::GetSize(cx, type);
|
JSString* name);
|
||||||
mData = new char[size];
|
|
||||||
if (mData)
|
JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
||||||
memset(mData, 0, size);
|
|
||||||
return mData != NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* mData;
|
namespace ArrayType {
|
||||||
};
|
JSObject* CreateInternal(JSContext* cx, JSObject* baseType, size_t length,
|
||||||
|
bool lengthDefined);
|
||||||
|
|
||||||
class FunctionType {
|
JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
||||||
public:
|
size_t GetLength(JSContext* cx, JSObject* obj);
|
||||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
bool GetSafeLength(JSContext* cx, JSObject* obj, size_t* result);
|
||||||
static JSObject* CreateInternal(JSContext* cx, jsval abi, jsval rtype, jsval* argtypes, jsuint arglen);
|
}
|
||||||
|
|
||||||
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
namespace StructType {
|
||||||
static JSObject* ConstructWithObject(JSContext* cx, JSObject* typeObj, JSObject* refObj, PRFuncPtr fnptr, JSObject* result);
|
nsTArray<FieldInfo>* GetFieldInfo(JSContext* cx, JSObject* obj);
|
||||||
|
FieldInfo* LookupField(JSContext* cx, JSObject* obj, jsval idval);
|
||||||
|
}
|
||||||
|
|
||||||
static JSBool Call(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
namespace FunctionType {
|
||||||
|
JSObject* CreateInternal(JSContext* cx, jsval abi, jsval rtype,
|
||||||
|
jsval* argtypes, jsuint arglen);
|
||||||
|
|
||||||
static FunctionInfo* GetFunctionInfo(JSContext* cx, JSObject* obj);
|
JSObject* ConstructWithObject(JSContext* cx, JSObject* typeObj,
|
||||||
static JSObject* GetLibrary(JSContext* cx, JSObject* obj);
|
JSObject* refObj, PRFuncPtr fnptr, JSObject* result);
|
||||||
static JSBool ArgTypesGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool ReturnTypeGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
static JSBool ABIGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
|
||||||
};
|
|
||||||
|
|
||||||
class CClosure {
|
FunctionInfo* GetFunctionInfo(JSContext* cx, JSObject* obj);
|
||||||
public:
|
JSObject* GetLibrary(JSContext* cx, JSObject* obj);
|
||||||
static JSObject* Create(JSContext* cx, JSObject* typeObj, JSObject* fnObj, JSObject* thisObj, PRFuncPtr* fnptr);
|
}
|
||||||
static void Trace(JSTracer* trc, JSObject* obj);
|
|
||||||
static void Finalize(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static void ClosureStub(ffi_cif* cif, void* result, void** args, void* userData);
|
namespace CClosure {
|
||||||
};
|
JSObject* Create(JSContext* cx, JSObject* typeObj, JSObject* fnObj,
|
||||||
|
JSObject* thisObj, PRFuncPtr* fnptr);
|
||||||
|
}
|
||||||
|
|
||||||
class CData {
|
namespace CData {
|
||||||
public:
|
JSObject* Create(JSContext* cx, JSObject* typeObj, JSObject* refObj,
|
||||||
static JSObject* Create(JSContext* cx, JSObject* typeObj, JSObject* refObj, void* data, bool ownResult);
|
void* data, bool ownResult);
|
||||||
static void Finalize(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static JSObject* GetCType(JSContext* cx, JSObject* dataObj);
|
JSObject* GetCType(JSContext* cx, JSObject* dataObj);
|
||||||
static void* GetData(JSContext* cx, JSObject* dataObj);
|
void* GetData(JSContext* cx, JSObject* dataObj);
|
||||||
static bool IsCData(JSContext* cx, JSObject* obj);
|
bool IsCData(JSContext* cx, JSObject* obj);
|
||||||
|
|
||||||
static JSBool ValueGetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
// Attached by JSAPI as the function 'ctypes.cast'
|
||||||
static JSBool ValueSetter(JSContext* cx, JSObject* obj, jsval idval, jsval* vp);
|
JSBool Cast(JSContext* cx, uintN argc, jsval* vp);
|
||||||
static JSBool Address(JSContext* cx, uintN argc, jsval* vp);
|
}
|
||||||
static JSBool Cast(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool ReadString(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
};
|
|
||||||
|
|
||||||
class Int64Base {
|
namespace Int64 {
|
||||||
public:
|
bool IsInt64(JSContext* cx, JSObject* obj);
|
||||||
static JSObject* Construct(JSContext* cx, JSObject* proto, PRUint64 data, bool isUnsigned);
|
}
|
||||||
static void Finalize(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static PRUint64 GetInt(JSContext* cx, JSObject* obj);
|
namespace UInt64 {
|
||||||
|
bool IsUInt64(JSContext* cx, JSObject* obj);
|
||||||
static JSBool ToString(JSContext* cx, JSObject* obj, uintN argc, jsval* vp, bool isUnsigned);
|
}
|
||||||
static JSBool ToSource(JSContext* cx, JSObject* obj, uintN argc, jsval* vp, bool isUnsigned);
|
|
||||||
};
|
|
||||||
|
|
||||||
class Int64 : public Int64Base {
|
|
||||||
public:
|
|
||||||
static JSBool Construct(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
|
||||||
|
|
||||||
static bool IsInt64(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static JSBool ToString(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
|
|
||||||
// ctypes.Int64 static functions
|
|
||||||
static JSBool Compare(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool Lo(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool Hi(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool Join(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
};
|
|
||||||
|
|
||||||
class UInt64 : public Int64Base {
|
|
||||||
public:
|
|
||||||
static JSBool Construct(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
|
||||||
|
|
||||||
static bool IsUInt64(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static JSBool ToString(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool ToSource(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
|
|
||||||
// ctypes.UInt64 static functions
|
|
||||||
static JSBool Compare(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool Lo(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool Hi(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool Join(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,18 @@
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace ctypes {
|
namespace ctypes {
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
** JSAPI function prototypes
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
namespace Library
|
||||||
|
{
|
||||||
|
static void Finalize(JSContext* cx, JSObject* obj);
|
||||||
|
|
||||||
|
static JSBool Close(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
static JSBool Declare(JSContext* cx, uintN argc, jsval* vp);
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
** JSObject implementation
|
** JSObject implementation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
|
||||||
|
|
@ -50,24 +50,15 @@ enum LibrarySlot {
|
||||||
LIBRARY_SLOTS
|
LIBRARY_SLOTS
|
||||||
};
|
};
|
||||||
|
|
||||||
class Library
|
namespace Library
|
||||||
{
|
{
|
||||||
public:
|
JSObject* Create(JSContext* cx, jsval aPath);
|
||||||
static JSObject* Create(JSContext* cx, jsval aPath);
|
|
||||||
static void Finalize(JSContext* cx, JSObject* obj);
|
|
||||||
|
|
||||||
static bool IsLibrary(JSContext* cx, JSObject* obj);
|
bool IsLibrary(JSContext* cx, JSObject* obj);
|
||||||
static PRLibrary* GetLibrary(JSContext* cx, JSObject* obj);
|
PRLibrary* GetLibrary(JSContext* cx, JSObject* obj);
|
||||||
|
|
||||||
// JSFastNative functions
|
JSBool Open(JSContext* cx, uintN argc, jsval* vp);
|
||||||
static JSBool Open(JSContext* cx, uintN argc, jsval* vp);
|
}
|
||||||
static JSBool Close(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
static JSBool Declare(JSContext* cx, uintN argc, jsval* vp);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// nothing to instantiate here!
|
|
||||||
Library();
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue