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 {
|
||||
|
||||
/*******************************************************************************
|
||||
** JSAPI callback function prototypes
|
||||
** JSAPI function prototypes
|
||||
*******************************************************************************/
|
||||
|
||||
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);
|
||||
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
|
||||
*******************************************************************************/
|
||||
|
|
@ -4019,6 +4162,28 @@ StructType::AddressOfField(JSContext* cx, uintN argc, jsval *vp)
|
|||
** 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
|
||||
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* obj2 = JSVAL_TO_OBJECT(argv[1]);
|
||||
|
||||
PRInt64 i1 = GetInt(cx, obj1);
|
||||
PRInt64 i2 = GetInt(cx, obj2);
|
||||
PRInt64 i1 = Int64Base::GetInt(cx, obj1);
|
||||
PRInt64 i2 = Int64Base::GetInt(cx, obj2);
|
||||
|
||||
if (i1 == i2)
|
||||
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]);
|
||||
PRInt64 u = GetInt(cx, obj);
|
||||
PRInt64 u = Int64Base::GetInt(cx, obj);
|
||||
jsdouble d = PRUint32(INT64_LO(u));
|
||||
|
||||
jsval result;
|
||||
|
|
@ -5317,7 +5482,7 @@ Int64::Hi(JSContext* cx, uintN argc, jsval* vp)
|
|||
}
|
||||
|
||||
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
||||
PRInt64 u = GetInt(cx, obj);
|
||||
PRInt64 u = Int64Base::GetInt(cx, obj);
|
||||
jsdouble d = PRInt32(INT64_HI(u));
|
||||
|
||||
jsval result;
|
||||
|
|
@ -5440,8 +5605,8 @@ UInt64::Compare(JSContext* cx, uintN argc, jsval* vp)
|
|||
JSObject* obj1 = JSVAL_TO_OBJECT(argv[0]);
|
||||
JSObject* obj2 = JSVAL_TO_OBJECT(argv[1]);
|
||||
|
||||
PRUint64 u1 = GetInt(cx, obj1);
|
||||
PRUint64 u2 = GetInt(cx, obj2);
|
||||
PRUint64 u1 = Int64Base::GetInt(cx, obj1);
|
||||
PRUint64 u2 = Int64Base::GetInt(cx, obj2);
|
||||
|
||||
if (u1 == u2)
|
||||
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]);
|
||||
PRUint64 u = GetInt(cx, obj);
|
||||
PRUint64 u = Int64Base::GetInt(cx, obj);
|
||||
jsdouble d = PRUint32(INT64_LO(u));
|
||||
|
||||
jsval result;
|
||||
|
|
@ -5486,7 +5651,7 @@ UInt64::Hi(JSContext* cx, uintN argc, jsval* vp)
|
|||
}
|
||||
|
||||
JSObject* obj = JSVAL_TO_OBJECT(argv[0]);
|
||||
PRUint64 u = GetInt(cx, obj);
|
||||
PRUint64 u = Int64Base::GetInt(cx, obj);
|
||||
jsdouble d = PRUint32(INT64_HI(u));
|
||||
|
||||
jsval result;
|
||||
|
|
|
|||
|
|
@ -48,6 +48,10 @@
|
|||
namespace mozilla {
|
||||
namespace ctypes {
|
||||
|
||||
/*******************************************************************************
|
||||
** Function and struct API definitions
|
||||
*******************************************************************************/
|
||||
|
||||
// for JS error reporting
|
||||
enum ErrorNum {
|
||||
#define MSG_DEF(name, number, count, exception, format) \
|
||||
|
|
@ -126,12 +130,19 @@ struct ClosureInfo
|
|||
|
||||
JSBool InitTypeClasses(JSContext* cx, JSObject* parent);
|
||||
|
||||
JSBool ConvertToJS(JSContext* cx, JSObject* typeObj, JSObject* dataObj, void* data, bool wantPrimitive, bool ownResult, jsval* result);
|
||||
JSBool ImplicitConvert(JSContext* cx, jsval val, JSObject* targetType, void* buffer, bool isArgument, bool* freePointer);
|
||||
JSBool ExplicitConvert(JSContext* cx, jsval val, JSObject* targetType, void* buffer);
|
||||
JSBool ConvertToJS(JSContext* cx, JSObject* typeObj, JSObject* dataObj,
|
||||
void* data, bool wantPrimitive, bool ownResult, jsval* result);
|
||||
|
||||
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 {
|
||||
SLOT_ABICODE = 0, // ABICode of the CABI object
|
||||
CABI_SLOTS
|
||||
|
|
@ -201,195 +212,88 @@ enum Int64FunctionSlot {
|
|||
// JSFunction objects always get exactly two slots.
|
||||
};
|
||||
|
||||
class CType {
|
||||
public:
|
||||
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);
|
||||
/*******************************************************************************
|
||||
** Object API definitions
|
||||
*******************************************************************************/
|
||||
|
||||
static JSBool ConstructAbstract(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
||||
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);
|
||||
namespace CType {
|
||||
JSObject* Create(JSContext* cx, JSObject* typeProto, JSObject* dataProto,
|
||||
TypeCode type, JSString* name, jsval size, jsval align, ffi_type* ffiType,
|
||||
PropertySpec* ps);
|
||||
|
||||
static bool IsCType(JSContext* cx, JSObject* obj);
|
||||
static TypeCode GetTypeCode(JSContext* cx, JSObject* typeObj);
|
||||
static bool TypesEqual(JSContext* cx, JSObject* t1, JSObject* t2);
|
||||
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);
|
||||
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 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);
|
||||
};
|
||||
bool IsCType(JSContext* cx, JSObject* obj);
|
||||
TypeCode GetTypeCode(JSContext* cx, JSObject* typeObj);
|
||||
bool TypesEqual(JSContext* cx, JSObject* t1, JSObject* t2);
|
||||
size_t GetSize(JSContext* cx, JSObject* obj);
|
||||
bool GetSafeSize(JSContext* cx, JSObject* obj, size_t* result);
|
||||
bool IsSizeDefined(JSContext* cx, JSObject* obj);
|
||||
size_t GetAlignment(JSContext* cx, JSObject* obj);
|
||||
ffi_type* GetFFIType(JSContext* cx, JSObject* obj);
|
||||
JSString* GetName(JSContext* cx, JSObject* obj);
|
||||
JSObject* GetProtoFromCtor(JSContext* cx, JSObject* obj, CTypeProtoSlot slot);
|
||||
JSObject* GetProtoFromType(JSContext* cx, JSObject* obj, CTypeProtoSlot slot);
|
||||
}
|
||||
|
||||
class PointerType {
|
||||
public:
|
||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||
static JSObject* CreateInternal(JSContext* cx, JSObject* ctor, JSObject* baseType, JSString* name);
|
||||
namespace PointerType {
|
||||
JSObject* CreateInternal(JSContext* cx, JSObject* ctor, JSObject* baseType,
|
||||
JSString* name);
|
||||
|
||||
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
||||
JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
||||
}
|
||||
|
||||
static JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
||||
namespace ArrayType {
|
||||
JSObject* CreateInternal(JSContext* cx, JSObject* baseType, size_t length,
|
||||
bool lengthDefined);
|
||||
|
||||
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);
|
||||
};
|
||||
JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
||||
size_t GetLength(JSContext* cx, JSObject* obj);
|
||||
bool GetSafeLength(JSContext* cx, JSObject* obj, size_t* result);
|
||||
}
|
||||
|
||||
class ArrayType {
|
||||
public:
|
||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||
static JSObject* CreateInternal(JSContext* cx, JSObject* baseType, size_t length, bool lengthDefined);
|
||||
namespace StructType {
|
||||
nsTArray<FieldInfo>* GetFieldInfo(JSContext* cx, JSObject* obj);
|
||||
FieldInfo* LookupField(JSContext* cx, JSObject* obj, jsval idval);
|
||||
}
|
||||
|
||||
static JSBool ConstructData(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 JSObject* GetBaseType(JSContext* cx, JSObject* obj);
|
||||
static size_t GetLength(JSContext* cx, JSObject* obj);
|
||||
static bool GetSafeLength(JSContext* cx, JSObject* obj, size_t* result);
|
||||
JSObject* ConstructWithObject(JSContext* cx, JSObject* typeObj,
|
||||
JSObject* refObj, PRFuncPtr fnptr, JSObject* 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);
|
||||
};
|
||||
FunctionInfo* GetFunctionInfo(JSContext* cx, JSObject* obj);
|
||||
JSObject* GetLibrary(JSContext* cx, JSObject* obj);
|
||||
}
|
||||
|
||||
class StructType {
|
||||
public:
|
||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||
namespace CClosure {
|
||||
JSObject* Create(JSContext* cx, JSObject* typeObj, JSObject* fnObj,
|
||||
JSObject* thisObj, PRFuncPtr* fnptr);
|
||||
}
|
||||
|
||||
static JSBool ConstructData(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
||||
namespace CData {
|
||||
JSObject* Create(JSContext* cx, JSObject* typeObj, JSObject* refObj,
|
||||
void* data, bool ownResult);
|
||||
|
||||
static nsTArray<FieldInfo>* GetFieldInfo(JSContext* cx, JSObject* obj);
|
||||
static FieldInfo* LookupField(JSContext* cx, JSObject* obj, jsval idval);
|
||||
JSObject* GetCType(JSContext* cx, JSObject* dataObj);
|
||||
void* GetData(JSContext* cx, JSObject* dataObj);
|
||||
bool IsCData(JSContext* cx, JSObject* obj);
|
||||
|
||||
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);
|
||||
};
|
||||
// Attached by JSAPI as the function 'ctypes.cast'
|
||||
JSBool Cast(JSContext* cx, uintN argc, jsval* vp);
|
||||
}
|
||||
|
||||
// Helper class for handling allocation of function arguments.
|
||||
struct AutoValue
|
||||
{
|
||||
AutoValue() : mData(NULL) { }
|
||||
namespace Int64 {
|
||||
bool IsInt64(JSContext* cx, JSObject* obj);
|
||||
}
|
||||
|
||||
~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;
|
||||
};
|
||||
|
||||
class FunctionType {
|
||||
public:
|
||||
static JSBool Create(JSContext* cx, uintN argc, jsval* vp);
|
||||
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);
|
||||
static JSObject* ConstructWithObject(JSContext* cx, JSObject* typeObj, JSObject* refObj, PRFuncPtr fnptr, JSObject* result);
|
||||
|
||||
static JSBool Call(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
|
||||
|
||||
static FunctionInfo* GetFunctionInfo(JSContext* cx, JSObject* obj);
|
||||
static JSObject* GetLibrary(JSContext* cx, JSObject* obj);
|
||||
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 {
|
||||
public:
|
||||
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);
|
||||
};
|
||||
|
||||
class CData {
|
||||
public:
|
||||
static JSObject* Create(JSContext* cx, JSObject* typeObj, JSObject* refObj, void* data, bool ownResult);
|
||||
static void Finalize(JSContext* cx, JSObject* obj);
|
||||
|
||||
static JSObject* GetCType(JSContext* cx, JSObject* dataObj);
|
||||
static void* GetData(JSContext* cx, JSObject* dataObj);
|
||||
static bool IsCData(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 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 {
|
||||
public:
|
||||
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);
|
||||
|
||||
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);
|
||||
};
|
||||
namespace UInt64 {
|
||||
bool IsUInt64(JSContext* cx, JSObject* obj);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,6 +49,18 @@
|
|||
namespace mozilla {
|
||||
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
|
||||
*******************************************************************************/
|
||||
|
|
|
|||
|
|
@ -50,24 +50,15 @@ enum LibrarySlot {
|
|||
LIBRARY_SLOTS
|
||||
};
|
||||
|
||||
class Library
|
||||
namespace Library
|
||||
{
|
||||
public:
|
||||
static JSObject* Create(JSContext* cx, jsval aPath);
|
||||
static void Finalize(JSContext* cx, JSObject* obj);
|
||||
JSObject* Create(JSContext* cx, jsval aPath);
|
||||
|
||||
static bool IsLibrary(JSContext* cx, JSObject* obj);
|
||||
static PRLibrary* GetLibrary(JSContext* cx, JSObject* obj);
|
||||
bool IsLibrary(JSContext* cx, JSObject* obj);
|
||||
PRLibrary* GetLibrary(JSContext* cx, JSObject* obj);
|
||||
|
||||
// JSFastNative functions
|
||||
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();
|
||||
};
|
||||
JSBool Open(JSContext* cx, uintN argc, jsval* vp);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue