зеркало из https://github.com/mozilla/pjs.git
more tests and type conversion fixes
This commit is contained in:
Родитель
4cc5e0b9df
Коммит
5ad4f9874c
|
@ -99,15 +99,29 @@ public:
|
|||
NS_IMETHOD SetReciever(nsIEcho* aReciever) = 0 ;
|
||||
NS_IMETHOD SendOneString(const char* str) = 0 ;
|
||||
NS_IMETHOD In2OutOneInt(int input, int* output) = 0 ;
|
||||
|
||||
NS_IMETHOD In2OutAddTwoInts(int input1,
|
||||
int input2,
|
||||
int* output1,
|
||||
int* output2,
|
||||
int* result) = 0 ;
|
||||
|
||||
NS_IMETHOD In2OutOneString(const char* input, char** output) = 0 ;
|
||||
NS_IMETHOD SimpleCallNoEcho() = 0 ;
|
||||
NS_IMETHOD SendManyTypes(int8 p1,
|
||||
int16 p2,
|
||||
int32 p3,
|
||||
int64 p4,
|
||||
uint8 p5,
|
||||
uint16 p6,
|
||||
uint32 p7,
|
||||
uint64 p8,
|
||||
float p9,
|
||||
double p10,
|
||||
PRBool p11,
|
||||
char p12,
|
||||
uint16 p13,
|
||||
nsID* p14,
|
||||
char* p15,
|
||||
uint16* p16) = 0;
|
||||
};
|
||||
|
||||
/***************************************************************************/
|
||||
|
|
|
@ -256,7 +256,22 @@ public:
|
|||
int* result);
|
||||
NS_IMETHOD In2OutOneString(const char* input, char** output);
|
||||
NS_IMETHOD SimpleCallNoEcho();
|
||||
|
||||
NS_IMETHOD SendManyTypes(int8 p1,
|
||||
int16 p2,
|
||||
int32 p3,
|
||||
int64 p4,
|
||||
uint8 p5,
|
||||
uint16 p6,
|
||||
uint32 p7,
|
||||
uint64 p8,
|
||||
float p9,
|
||||
double p10,
|
||||
PRBool p11,
|
||||
char p12,
|
||||
uint16 p13,
|
||||
nsID* p14,
|
||||
char* p15,
|
||||
uint16* p16);
|
||||
MyEcho();
|
||||
private:
|
||||
nsIEcho* mReciever;
|
||||
|
@ -331,6 +346,31 @@ NS_IMETHODIMP MyEcho::SimpleCallNoEcho()
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
MyEcho::SendManyTypes(int8 p1,
|
||||
int16 p2,
|
||||
int32 p3,
|
||||
int64 p4,
|
||||
uint8 p5,
|
||||
uint16 p6,
|
||||
uint32 p7,
|
||||
uint64 p8,
|
||||
float p9,
|
||||
double p10,
|
||||
PRBool p11,
|
||||
char p12,
|
||||
uint16 p13,
|
||||
nsID* p14,
|
||||
char* p15,
|
||||
uint16* p16)
|
||||
{
|
||||
if(mReciever)
|
||||
return mReciever->SendManyTypes(p1, p2, p3, p4, p5, p6, p7, p8, p9,
|
||||
p10, p11, p12, p13, p14, p15, p16);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
FILE *gOutFile = NULL;
|
||||
|
|
|
@ -56,9 +56,17 @@ print("echo tests...");
|
|||
var reciever = new Object();
|
||||
reciever.SetReciever = function() {};
|
||||
reciever.SendOneString = function(str) {reciever_results[0] = str;};
|
||||
reciever.SendManyTypes = function()
|
||||
{
|
||||
for(var i = 0; i < arguments.length; i++)
|
||||
reciever_results[i] = arguments[i];
|
||||
};
|
||||
|
||||
echo.SetReciever(reciever);
|
||||
|
||||
////////////////////
|
||||
// SendOneString
|
||||
|
||||
var test_string = "some string";
|
||||
var reciever_results = new Object();
|
||||
echo.SendOneString(test_string);
|
||||
|
@ -66,10 +74,16 @@ print("SendOneString - "+(
|
|||
reciever_results[0] == test_string
|
||||
? "passed" : "failed"));
|
||||
|
||||
////////////////////
|
||||
// In2OutOneInt
|
||||
|
||||
print("In2OutOneInt - "+(
|
||||
echo.In2OutOneInt(102) == 102
|
||||
? "passed" : "failed"));
|
||||
|
||||
////////////////////
|
||||
// In2OutAddTwoInts
|
||||
|
||||
var in_out_results1 = new Object();
|
||||
var in_out_results2 = new Object();
|
||||
var in_out_results =
|
||||
|
@ -87,13 +101,47 @@ print("In2OutOneString - "+(
|
|||
? "passed" : "failed"));
|
||||
|
||||
|
||||
////////////////////
|
||||
// SendManyTypes
|
||||
|
||||
var reciever_results = new Object();
|
||||
var send_params = [-1,-2,-3,-102020,2,4,6,1023,1.5,2.000008,true,'a','b',NS_ITESTXPC_FOO_IID,"a string","another string"];
|
||||
echo.SendManyTypes(send_params[0],
|
||||
send_params[1],
|
||||
send_params[2],
|
||||
send_params[3],
|
||||
send_params[4],
|
||||
send_params[5],
|
||||
send_params[6],
|
||||
send_params[7],
|
||||
send_params[8],
|
||||
send_params[9],
|
||||
send_params[10],
|
||||
send_params[11],
|
||||
send_params[12],
|
||||
send_params[13],
|
||||
send_params[14],
|
||||
send_params[15],
|
||||
send_params[16],
|
||||
send_params[17]);
|
||||
|
||||
var all_ok = true;
|
||||
for(i = 0; i < 16; i++) {
|
||||
if((""+reciever_results[i]) != (""+send_params[i])) {
|
||||
if(all_ok)
|
||||
print("SendManyTypes - failed...");
|
||||
all_ok = false;
|
||||
print(" param number "+i+" diff: "+send_params[i]+" -> "+reciever_results[i])
|
||||
}
|
||||
}
|
||||
if(all_ok)
|
||||
print("SendManyTypes - passed");
|
||||
|
||||
|
||||
print(".......................................");
|
||||
print("simple speed tests...");
|
||||
|
||||
var iterations = 10000;
|
||||
|
||||
var iterations = 1000;
|
||||
|
||||
var reciever2 = new Object();
|
||||
reciever2.SetReciever = function() {};
|
||||
|
|
|
@ -173,10 +173,10 @@ XPCConvert::IsMethodReflectable(const nsXPTMethodInfo& info)
|
|||
// types
|
||||
|
||||
|
||||
#define JAM_DOUBLE(v,d) (d = (jsdouble)v, DOUBLE_TO_JSVAL(&d))
|
||||
#define FIT_32(i,d) (INT_FITS_IN_JSVAL(i) ? INT_TO_JSVAL(i) : JAM_DOUBLE(i,d))
|
||||
#define JAM_DOUBLE(cx,v,d) (d=JS_NewDouble(cx,(jsdouble)v),DOUBLE_TO_JSVAL(d))
|
||||
#define FIT_32(cx,i,d) (INT_FITS_IN_JSVAL(i)?INT_TO_JSVAL(i):JAM_DOUBLE(cx,i,d))
|
||||
// Win32 can't handle uint64 to double conversion
|
||||
#define JAM_DOUBLE_U64(v,d) JAM_DOUBLE(((int64)v),d)
|
||||
#define JAM_DOUBLE_U64(cx,v,d) JAM_DOUBLE(cx,((int64)v),d)
|
||||
|
||||
// static
|
||||
JSBool
|
||||
|
@ -186,23 +186,43 @@ XPCConvert::NativeData2JS(JSContext* cx, jsval* d, const void* s,
|
|||
NS_PRECONDITION(s, "bad param");
|
||||
NS_PRECONDITION(d, "bad param");
|
||||
|
||||
jsdouble dbl;
|
||||
jsdouble* dbl;
|
||||
|
||||
switch(type.TagPart())
|
||||
{
|
||||
case nsXPTType::T_I8 : *d = INT_TO_JSVAL((int32)*((int8*)s)); break;
|
||||
case nsXPTType::T_I16 : *d = INT_TO_JSVAL((int32)*((int16*)s)); break;
|
||||
case nsXPTType::T_I32 : *d = FIT_32(*((int32*)s),dbl); break;
|
||||
case nsXPTType::T_I64 : *d = JAM_DOUBLE(*((int64*)s),dbl); break;
|
||||
case nsXPTType::T_I32 : *d = FIT_32(cx,*((int32*)s),dbl); break;
|
||||
case nsXPTType::T_I64 : *d = JAM_DOUBLE(cx,*((int64*)s),dbl); break;
|
||||
case nsXPTType::T_U8 : *d = INT_TO_JSVAL((int32)*((uint8*)s)); break;
|
||||
case nsXPTType::T_U16 : *d = INT_TO_JSVAL((int32)*((uint16*)s)); break;
|
||||
case nsXPTType::T_U32 : *d = FIT_32(*((uint32*)s),dbl); break;
|
||||
case nsXPTType::T_U64 : *d = JAM_DOUBLE_U64(*((uint64*)s),dbl); break;
|
||||
case nsXPTType::T_FLOAT : *d = JAM_DOUBLE(*((float*)s),dbl); break;
|
||||
case nsXPTType::T_DOUBLE: *d = DOUBLE_TO_JSVAL(*((double*)s)); break;
|
||||
case nsXPTType::T_U32 : *d = FIT_32(cx,*((uint32*)s),dbl); break;
|
||||
case nsXPTType::T_U64 : *d = JAM_DOUBLE_U64(cx,*((uint64*)s),dbl); break;
|
||||
case nsXPTType::T_FLOAT : *d = JAM_DOUBLE(cx,*((float*)s),dbl); break;
|
||||
case nsXPTType::T_DOUBLE: *d = JAM_DOUBLE(cx,*((double*)s),dbl); break;
|
||||
case nsXPTType::T_BOOL : *d = *((PRBool*)s)?JSVAL_TRUE:JSVAL_FALSE; break;
|
||||
case nsXPTType::T_CHAR : *d = INT_TO_JSVAL((int32)*((char*)s)); break;
|
||||
case nsXPTType::T_WCHAR : *d = INT_TO_JSVAL((int32)*((wchar_t*)s)); break;
|
||||
case nsXPTType::T_CHAR :
|
||||
{
|
||||
char* p = (char*)s;
|
||||
if(!p)
|
||||
break;
|
||||
JSString* str;
|
||||
if(!(str = JS_NewStringCopyN(cx, p, 1)))
|
||||
break;
|
||||
*d = STRING_TO_JSVAL(str);
|
||||
break;
|
||||
}
|
||||
case nsXPTType::T_WCHAR :
|
||||
{
|
||||
jschar* p = (jschar*)s;
|
||||
if(!p)
|
||||
break;
|
||||
JSString* str;
|
||||
if(!(str = JS_NewUCStringCopyN(cx, p, 1)))
|
||||
break;
|
||||
*d = STRING_TO_JSVAL(str);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if(!type.IsPointer())
|
||||
{
|
||||
|
@ -381,13 +401,32 @@ XPCConvert::JSData2Native(JSContext* cx, void* d, jsval s,
|
|||
r = JS_ValueToBoolean(cx, s, (PRBool*)d);
|
||||
break;
|
||||
case nsXPTType::T_CHAR :
|
||||
r = JS_ValueToECMAUint32(cx, s, &tu);
|
||||
*((char*)d) = (char) tu;
|
||||
break;
|
||||
{
|
||||
char* bytes;
|
||||
JSString* str;
|
||||
|
||||
if(!(str = JS_ValueToString(cx, s))||
|
||||
!(bytes = JS_GetStringBytes(str)))
|
||||
{
|
||||
// XXX should report error
|
||||
return JS_FALSE;
|
||||
}
|
||||
*((char*)d) = bytes[0];
|
||||
break;
|
||||
}
|
||||
case nsXPTType::T_WCHAR :
|
||||
r = JS_ValueToECMAUint32(cx, s, &tu);
|
||||
*((uint16*)d) = (uint16) tu;
|
||||
break;
|
||||
{
|
||||
jschar* chars;
|
||||
JSString* str;
|
||||
if(!(str = JS_ValueToString(cx, s))||
|
||||
!(chars = JS_GetStringChars(str)))
|
||||
{
|
||||
// XXX should report error
|
||||
return JS_FALSE;
|
||||
}
|
||||
*((uint16*)d) = (uint16) chars[0];
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if(!type.IsPointer())
|
||||
{
|
||||
|
|
|
@ -1,142 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
/* Platform specific code to invoke XPCOM methods on native objects */
|
||||
|
||||
#include "xpcprivate.h"
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
// Remember that on Win32 these 'words' are 32bit DWORDS
|
||||
|
||||
static uint32 __stdcall
|
||||
invoke_count_words(uint32 paramCount, nsXPCVariant* s)
|
||||
{
|
||||
uint32 result = 0;
|
||||
for(uint32 i = 0; i < paramCount; i++, s++)
|
||||
{
|
||||
if(s->IsPtrData())
|
||||
{
|
||||
result++;
|
||||
continue;
|
||||
}
|
||||
switch(s->type)
|
||||
{
|
||||
case nsXPTType::T_I8 :
|
||||
case nsXPTType::T_I16 :
|
||||
case nsXPTType::T_I32 :
|
||||
case nsXPTType::T_I64 :
|
||||
case nsXPTType::T_U8 :
|
||||
case nsXPTType::T_U16 :
|
||||
case nsXPTType::T_U32 :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_U64 :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_FLOAT :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_DOUBLE :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_BOOL :
|
||||
case nsXPTType::T_CHAR :
|
||||
case nsXPTType::T_WCHAR :
|
||||
result++;
|
||||
break;
|
||||
default:
|
||||
// all the others are plain pointer types
|
||||
result++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void __stdcall
|
||||
invoke_copy_to_stack(uint32* d, uint32 paramCount, nsXPCVariant* s)
|
||||
{
|
||||
for(uint32 i = 0; i < paramCount; i++, d++, s++)
|
||||
{
|
||||
if(s->IsPtrData())
|
||||
{
|
||||
*((void**)d) = s->ptr;
|
||||
continue;
|
||||
}
|
||||
switch(s->type)
|
||||
{
|
||||
case nsXPTType::T_I8 : *((int8*) d) = s->val.i8; break;
|
||||
case nsXPTType::T_I16 : *((int16*) d) = s->val.i16; break;
|
||||
case nsXPTType::T_I32 : *((int32*) d) = s->val.i32; break;
|
||||
case nsXPTType::T_I64 : *((int64*) d) = s->val.i64; d++; break;
|
||||
case nsXPTType::T_U8 : *((uint8*) d) = s->val.u8; break;
|
||||
case nsXPTType::T_U16 : *((uint16*) d) = s->val.u16; break;
|
||||
case nsXPTType::T_U32 : *((uint32*) d) = s->val.u32; break;
|
||||
case nsXPTType::T_U64 : *((uint64*) d) = s->val.u64; d++; break;
|
||||
case nsXPTType::T_FLOAT : *((float*) d) = s->val.f; break;
|
||||
case nsXPTType::T_DOUBLE : *((double*) d) = s->val.d; d++; break;
|
||||
case nsXPTType::T_BOOL : *((PRBool*) d) = s->val.b; break;
|
||||
case nsXPTType::T_CHAR : *((char*) d) = s->val.c; break;
|
||||
case nsXPTType::T_WCHAR : *((wchar_t*)d) = s->val.wc; break;
|
||||
default:
|
||||
// all the others are plain pointer types
|
||||
*((void**)d) = s->val.p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning(disable : 4035) // OK to have no return value
|
||||
nsresult
|
||||
xpc_InvokeNativeMethod(void* that, PRUint32 index,
|
||||
uint32 paramCount, nsXPCVariant* params)
|
||||
{
|
||||
__asm {
|
||||
push params
|
||||
push paramCount
|
||||
call invoke_count_words // stdcall, result in eax
|
||||
shl eax,2 // *= 4
|
||||
sub esp,eax // make space for params
|
||||
mov edx,esp
|
||||
push params
|
||||
push paramCount
|
||||
push edx
|
||||
call invoke_copy_to_stack // stdcall
|
||||
mov ecx,that // instance in ecx
|
||||
push ecx // push this
|
||||
mov edx,[ecx] // vtable in edx
|
||||
mov eax,index
|
||||
shl eax,2 // *= 4
|
||||
add edx,eax
|
||||
call [edx] // stdcall, i.e. callee cleans up stack.
|
||||
}
|
||||
}
|
||||
#pragma warning(default : 4035) // restore default
|
||||
|
||||
#ifdef DEBUG
|
||||
nsresult
|
||||
XPC_TestInvoke(void* that, PRUint32 index,
|
||||
uint32 paramCount, nsXPCVariant* params)
|
||||
{
|
||||
return xpc_InvokeNativeMethod(that, index, paramCount, params);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -168,17 +168,37 @@ XPTParamDescriptor nsIEcho_In2OutOneStringParams[2] = {
|
|||
{XPT_PD_OUT|XPT_PD_RETVAL, {XPT_TDP_POINTER|TD_PSTRING,0}}
|
||||
};
|
||||
|
||||
XPTMethodDescriptor nsIEchoMethods[6] = {
|
||||
XPTParamDescriptor nsIEcho_SendManyTypesParams[16] = {
|
||||
{XPT_PD_IN, {TD_INT8 ,0}},
|
||||
{XPT_PD_IN, {TD_INT16 ,0}},
|
||||
{XPT_PD_IN, {TD_INT32 ,0}},
|
||||
{XPT_PD_IN, {TD_INT64 ,0}},
|
||||
{XPT_PD_IN, {TD_UINT8 ,0}},
|
||||
{XPT_PD_IN, {TD_UINT16 ,0}},
|
||||
{XPT_PD_IN, {TD_UINT32 ,0}},
|
||||
{XPT_PD_IN, {TD_UINT64 ,0}},
|
||||
{XPT_PD_IN, {TD_FLOAT ,0}},
|
||||
{XPT_PD_IN, {TD_DOUBLE ,0}},
|
||||
{XPT_PD_IN, {TD_BOOL ,0}},
|
||||
{XPT_PD_IN, {TD_CHAR ,0}},
|
||||
{XPT_PD_IN, {TD_WCHAR ,0}},
|
||||
{XPT_PD_IN, {XPT_TDP_POINTER|TD_PNSIID ,0}},
|
||||
{XPT_PD_IN, {XPT_TDP_POINTER|TD_PSTRING ,0}},
|
||||
{XPT_PD_IN, {XPT_TDP_POINTER|TD_PWSTRING ,0}}
|
||||
};
|
||||
|
||||
XPTMethodDescriptor nsIEchoMethods[7] = {
|
||||
{0, "SetReciever", 1, nsIEcho_SetRecieverParams, ResultParam},
|
||||
{0, "SendOneString", 1, nsIEcho_SendOneStringParams, ResultParam},
|
||||
{0, "In2OutOneInt", 2, nsIEcho_In2OutOneIntParams, ResultParam},
|
||||
{0, "In2OutAddTwoInts", 5, nsIEcho_In2OutAddTwoIntsParams, ResultParam},
|
||||
{0, "In2OutOneString", 2, nsIEcho_In2OutOneStringParams, ResultParam},
|
||||
{0, "SimpleCallNoEcho", 0, NULL, ResultParam}
|
||||
{0, "SimpleCallNoEcho", 0, NULL, ResultParam},
|
||||
{0, "SendManyTypes", 16, nsIEcho_SendManyTypesParams, ResultParam}
|
||||
};
|
||||
|
||||
XPTInterfaceDescriptor nsIEchoInterfaceDescriptor =
|
||||
{NULL, 6, nsIEchoMethods, 0, NULL};
|
||||
{NULL, 7, nsIEchoMethods, 0, NULL};
|
||||
|
||||
/***************/
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче