#include "../../dyncall/dyncall.h"
#include "config.h"
#include "../../dyncall/dyncall_value.h"
#include <math.h>
#include "../common/platformInit.h"
#include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
int
getId();
DCpointer getFunc(
int
x);
DCValue* getArg(
int
pos);
static
DCbool valueBool [NARGS];
static
DCshort valueShort [NARGS];
static
DCchar valueChar [NARGS];
static
DCint valueInt [NARGS];
static
DClonglong valueLongLong[NARGS];
static
DCdouble valueDouble [NARGS];
static
DCpointer valuePointer [NARGS];
static
DCfloat valueFloat [NARGS];
bool
equals(
int
select,
int
pos,
void
* data)
{
switch
(select)
{
case
0:
return
( getArg(pos)->B == valueBool[pos] );
break
;
case
1:
return
( getArg(pos)->i == valueInt[pos] );
break
;
case
2:
return
( getArg(pos)->L == valueLongLong[pos] );
break
;
case
3:
return
( getArg(pos)->d == valueDouble[pos] );
break
;
case
4:
return
( getArg(pos)->p == valuePointer[pos] );
break
;
case
5:
return
( getArg(pos)->f == valueFloat[pos] );
break
;
}
return
false
;
}
void
clearValues();
void
init()
{
for
(
int
i = 0 ; i < NARGS ; ++i ) {
valueBool[i] = DCbool( (i % 1) ? DC_TRUE : DC_FALSE );
valueInt[i] = DCint(i);
valueLongLong[i] = DClonglong(i);
valueDouble[i] = DCdouble(i);
valuePointer[i] = DCpointer(i);
valueFloat[i] = DCfloat(i);
}
}
void
push(DCCallVM* pCall,
int
select,
int
pos)
{
switch
(select)
{
case
0: dcArgBool( pCall, valueBool[pos] );
break
;
case
1: dcArgInt( pCall, valueInt[pos] );
break
;
case
2: dcArgLongLong( pCall, valueLongLong[pos] );
break
;
case
3: dcArgDouble( pCall, valueDouble[pos] );
break
;
case
4: dcArgPointer( pCall, valuePointer[pos] );
break
;
case
5: dcArgFloat( pCall, valueFloat[pos] );
break
;
}
}
#define test(x) if (!(x)) return false
bool
test_case(
int
x)
{
clearValues();
DCCallVM* pCall = dcNewCallVM(4096);
dcMode(pCall, DC_CALL_C_X86_WIN32_STD);
dcReset(pCall);
int
y = x;
int
selects[NARGS] = { 0, };
int
pos = 0;
for
(pos = 0;y>0;++pos)
{
int
select = (y-1) % NTYPES;
selects[pos] = select;
push(pCall,select,pos);
y = (y-1) / NTYPES;
}
dcCallVoid(pCall,getFunc(x));
test( getId() == x );
for
(
int
i = 0;i<pos;++i) {
test( equals( selects[i], i, getArg(i) ) );
}
dcFree(pCall);
return
true
;
}
int
powerfact(
int
x,
int
n)
{
if
(n==0)
return
0;
return
static_cast
<
int
>(
pow
((
double
)x,n)+powerfact(x,n-1) );
}
#include <stdio.h>
#include <stdlib.h>
bool
run_range(
int
from,
int
to)
{
bool
tr =
true
;
for
(
int
i = from ; i < to ; ++i ) {
printf
(
"%d:"
,i);
bool
r = test_case(i);
printf
(
"%d\n"
, r);
tr &= r;
}
return
tr;
}
extern
"C"
{
int
main(
int
argc,
char
* argv[])
{
dcTest_initPlatform();
bool
success =
false
;
init();
if
(argc == 2) {
int
index =
atoi
(argv[1]);
success = run_range( index, index+1 );
}
else
if
(argc == 3) {
int
from =
atoi
(argv[1]);
int
to =
atoi
(argv[2])+1;
success = run_range(from,to);
}
else
{
int
ncalls = powerfact(NTYPES,NARGS)+1;
success = run_range(0,ncalls);
}
printf
(
"result: suite_x86win32std: %d\n"
, success);
dcTest_deInitPlatform();
return
!success;
}
}