more tests and type conversion fixes

This commit is contained in:
jband%netscape.com 1999-02-17 09:24:12 +00:00
Родитель 4cc5e0b9df
Коммит 5ad4f9874c
6 изменённых файлов: 187 добавлений и 168 удалений

Просмотреть файл

@ -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};
/***************/