else
nsMemory::Free(outS); } else
int main(){    InvokeTestTarget *test = new InvokeTestTarget();    /* here we make the global 'check for alloc failure' checker happy */    if(!test)        return 1;    PRInt32 out, tmp32 = 0;    PRInt64 out64;    printf("calling direct:\n");    if(NS_SUCCEEDED(test->AddTwoInts(1,1,&out)))        printf("\t1 + 1 = %d\n", out);    else        printf("\tFAILED");    PRInt64 one, two;    LL_I2L(one, 1);    LL_I2L(two, 2);    if(NS_SUCCEEDED(test->AddTwoLLs(one,one,&out64)))    {        LL_L2I(tmp32, out64);        printf("\t1L + 1L = %d\n", (int)tmp32);    }    else        printf("\tFAILED");    if(NS_SUCCEEDED(test->MultTwoInts(2,2,&out)))        printf("\t2 * 2 = %d\n", out);    else        printf("\tFAILED");    if(NS_SUCCEEDED(test->MultTwoLLs(two,two,&out64)))    {        LL_L2I(tmp32, out64);        printf("\t2L * 2L = %d\n", (int)tmp32);    }    else        printf("\tFAILED");    double outD;    float outF;    PRInt32 outI;    char *outS;    if(NS_SUCCEEDED(test->AddManyInts(1,2,3,4,5,6,7,8,9,10,&outI)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", outI);    else        printf("\tFAILED");    if(NS_SUCCEEDED(test->AddTwoFloats(1,2,&outF)))        printf("\t1 + 2 = %ff\n", (double)outF);    else        printf("\tFAILED");    if(NS_SUCCEEDED(test->AddManyDoubles(1,2,3,4,5,6,7,8,9,10,&outD)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", outD);    else        printf("\tFAILED");    if(NS_SUCCEEDED(test->AddManyFloats(1,2,3,4,5,6,7,8,9,10,&outF)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", (double)outF);    else        printf("\tFAILED");    if(NS_SUCCEEDED(test->AddManyManyFloats(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,&outF)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 +1 15 + 16 + 17 + 18 + 19 + 20 = %ff\n", (double)outF);    else        printf("\tFAILED");    if(NS_SUCCEEDED(test->PassTwoStrings("moo","cow",&outS)))        printf(" = %s\n", outS);    else        printf("\tFAILED");    printf("calling via invoke:\n");    nsXPTCVariant var[21];    var[0].val.i32 = 1;    var[0].type = nsXPTType::T_I32;    var[0].flags = 0;    var[1].val.i32 = 1;    var[1].type = nsXPTType::T_I32;    var[1].flags = 0;    var[2].val.i32 = 0;    var[2].type = nsXPTType::T_I32;    var[2].flags = nsXPTCVariant::PTR_IS_DATA;    var[2].ptr = &var[2].val.i32;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 3, 3, var)))        printf("\t1 + 1 = %d\n", var[2].val.i32);    else        printf("\tFAILED");    LL_I2L(var[0].val.i64, 1);    var[0].type = nsXPTType::T_I64;    var[0].flags = 0;    LL_I2L(var[1].val.i64, 1);    var[1].type = nsXPTType::T_I64;    var[1].flags = 0;    LL_I2L(var[2].val.i64, 0);    var[2].type = nsXPTType::T_I64;    var[2].flags = nsXPTCVariant::PTR_IS_DATA;    var[2].ptr = &var[2].val.i64;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 5, 3, var)))        printf("\t1L + 1L = %d\n", (int)var[2].val.i64);    else        printf("\tFAILED");    var[0].val.i32 = 2;    var[0].type = nsXPTType::T_I32;    var[0].flags = 0;    var[1].val.i32 = 2;    var[1].type = nsXPTType::T_I32;    var[1].flags = 0;    var[2].val.i32 = 0;    var[2].type = nsXPTType::T_I32;    var[2].flags = nsXPTCVariant::PTR_IS_DATA;    var[2].ptr = &var[2].val.i32;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 4, 3, var)))        printf("\t2 * 2 = %d\n", var[2].val.i32);    else        printf("\tFAILED");    LL_I2L(var[0].val.i64,2);    var[0].type = nsXPTType::T_I64;    var[0].flags = 0;    LL_I2L(var[1].val.i64,2);    var[1].type = nsXPTType::T_I64;    var[1].flags = 0;    LL_I2L(var[2].val.i64,0);    var[2].type = nsXPTType::T_I64;    var[2].flags = nsXPTCVariant::PTR_IS_DATA;    var[2].ptr = &var[2].val.i64;     if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 6, 3, var)))         printf("\t2L * 2L = %d\n", (int)var[2].val.i64);    else        printf("\tFAILED");    var[0].val.i32 = 1;    var[0].type = nsXPTType::T_I32;    var[0].flags = 0;    var[1].val.i32 = 2;    var[1].type = nsXPTType::T_I32;    var[1].flags = 0;    var[2].val.i32 = 3;    var[2].type = nsXPTType::T_I32;    var[2].flags = 0;    var[3].val.i32 = 4;    var[3].type = nsXPTType::T_I32;    var[3].flags = 0;    var[4].val.i32 = 5;    var[4].type = nsXPTType::T_I32;    var[4].flags = 0;    var[5].val.i32 = 6;    var[5].type = nsXPTType::T_I32;    var[5].flags = 0;    var[6].val.i32 = 7;    var[6].type = nsXPTType::T_I32;    var[6].flags = 0;    var[7].val.i32 = 8;    var[7].type = nsXPTType::T_I32;    var[7].flags = 0;    var[8].val.i32 = 9;    var[8].type = nsXPTType::T_I32;    var[8].flags = 0;    var[9].val.i32 = 10;    var[9].type = nsXPTType::T_I32;    var[9].flags = 0;    var[10].val.i32 = 0;    var[10].type = nsXPTType::T_I32;    var[10].flags = nsXPTCVariant::PTR_IS_DATA;    var[10].ptr = &var[10].val.i32;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 7, 11, var)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n",                var[10].val.i32);    var[0].val.f = 1.0f;    var[0].type = nsXPTType::T_FLOAT;    var[0].flags = 0;    var[1].val.f = 2.0f;    var[1].type = nsXPTType::T_FLOAT;    var[1].flags = 0;    var[2].val.f = 0.0f;    var[2].type = nsXPTType::T_FLOAT;    var[2].flags = nsXPTCVariant::PTR_IS_DATA;    var[2].ptr = &var[2].val.f;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 8, 3, var)))        printf("\t1 + 2 = %ff\n",                (double) var[2].val.f);    var[0].val.d = 1.0;    var[0].type = nsXPTType::T_DOUBLE;    var[0].flags = 0;    var[1].val.d = 2.0;    var[1].type = nsXPTType::T_DOUBLE;    var[1].flags = 0;    var[2].val.d = 3.0;    var[2].type = nsXPTType::T_DOUBLE;    var[2].flags = 0;    var[3].val.d = 4.0;    var[3].type = nsXPTType::T_DOUBLE;    var[3].flags = 0;    var[4].val.d = 5.0;    var[4].type = nsXPTType::T_DOUBLE;    var[4].flags = 0;    var[5].val.d = 6.0;    var[5].type = nsXPTType::T_DOUBLE;    var[5].flags = 0;    var[6].val.d = 7.0;    var[6].type = nsXPTType::T_DOUBLE;    var[6].flags = 0;    var[7].val.d = 8.0;    var[7].type = nsXPTType::T_DOUBLE;    var[7].flags = 0;    var[8].val.d = 9.0;    var[8].type = nsXPTType::T_DOUBLE;    var[8].flags = 0;    var[9].val.d = 10.0;    var[9].type = nsXPTType::T_DOUBLE;    var[9].flags = 0;    var[10].val.d = 0.0;    var[10].type = nsXPTType::T_DOUBLE;    var[10].flags = nsXPTCVariant::PTR_IS_DATA;    var[10].ptr = &var[10].val.d;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 9, 11, var)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n",                var[10].val.d);    else        printf("\tFAILED");    var[0].val.f = 1.0f;    var[0].type = nsXPTType::T_FLOAT;    var[0].flags = 0;    var[1].val.f = 2.0f;    var[1].type = nsXPTType::T_FLOAT;    var[1].flags = 0;    var[2].val.f = 3.0f;    var[2].type = nsXPTType::T_FLOAT;    var[2].flags = 0;    var[3].val.f = 4.0f;    var[3].type = nsXPTType::T_FLOAT;    var[3].flags = 0;    var[4].val.f = 5.0f;    var[4].type = nsXPTType::T_FLOAT;    var[4].flags = 0;    var[5].val.f = 6.0f;    var[5].type = nsXPTType::T_FLOAT;    var[5].flags = 0;    var[6].val.f = 7.0f;    var[6].type = nsXPTType::T_FLOAT;    var[6].flags = 0;    var[7].val.f = 8.0f;    var[7].type = nsXPTType::T_FLOAT;    var[7].flags = 0;    var[8].val.f = 9.0f;    var[8].type = nsXPTType::T_FLOAT;    var[8].flags = 0;    var[9].val.f = 10.0f;    var[9].type = nsXPTType::T_FLOAT;    var[9].flags = 0;    var[10].val.f = 0.0f;    var[10].type = nsXPTType::T_FLOAT;    var[10].flags = nsXPTCVariant::PTR_IS_DATA;    var[10].ptr = &var[10].val.f;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 10, 11, var)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n",                (double) var[10].val.f);    var[0].val.f = 1.0f;    var[0].type = nsXPTType::T_FLOAT;    var[0].flags = 0;    var[1].val.f = 2.0f;    var[1].type = nsXPTType::T_FLOAT;    var[1].flags = 0;    var[2].val.f = 3.0f;    var[2].type = nsXPTType::T_FLOAT;    var[2].flags = 0;    var[3].val.f = 4.0f;    var[3].type = nsXPTType::T_FLOAT;    var[3].flags = 0;    var[4].val.f = 5.0f;    var[4].type = nsXPTType::T_FLOAT;    var[4].flags = 0;    var[5].val.f = 6.0f;    var[5].type = nsXPTType::T_FLOAT;    var[5].flags = 0;    var[6].val.f = 7.0f;    var[6].type = nsXPTType::T_FLOAT;    var[6].flags = 0;    var[7].val.f = 8.0f;    var[7].type = nsXPTType::T_FLOAT;    var[7].flags = 0;    var[8].val.f = 9.0f;    var[8].type = nsXPTType::T_FLOAT;    var[8].flags = 0;    var[9].val.f = 10.0f;    var[9].type = nsXPTType::T_FLOAT;    var[9].flags = 0;    var[10].val.f = 11.0f;    var[10].type = nsXPTType::T_FLOAT;    var[10].flags = 0;    var[11].val.f = 12.0f;    var[11].type = nsXPTType::T_FLOAT;    var[11].flags = 0;    var[12].val.f = 13.0f;    var[12].type = nsXPTType::T_FLOAT;    var[12].flags = 0;    var[13].val.f = 14.0f;    var[13].type = nsXPTType::T_FLOAT;    var[13].flags = 0;    var[14].val.f = 15.0f;    var[14].type = nsXPTType::T_FLOAT;    var[14].flags = 0;    var[15].val.f = 16.0f;    var[15].type = nsXPTType::T_FLOAT;    var[15].flags = 0;    var[16].val.f = 17.0f;    var[16].type = nsXPTType::T_FLOAT;    var[16].flags = 0;    var[17].val.f = 18.0f;    var[17].type = nsXPTType::T_FLOAT;    var[17].flags = 0;    var[18].val.f = 19.0f;    var[18].type = nsXPTType::T_FLOAT;    var[18].flags = 0;    var[19].val.f = 20.0f;    var[19].type = nsXPTType::T_FLOAT;    var[19].flags = 0;    var[20].val.f = 0.0f;    var[20].type = nsXPTType::T_FLOAT;    var[20].flags = nsXPTCVariant::PTR_IS_DATA;    var[20].ptr = &var[20].val.f;    if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 11, 21, var)))        printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 = %ff\n",                (double) var[20].val.f);    var[0].val.p = (void*)"moo";    var[0].type = nsXPTType::T_CHAR_STR;    var[0].flags = 0;    var[1].val.p = (void*)"cow";    var[1].type = nsXPTType::T_CHAR_STR;    var[1].flags = 0;        var[2].val.p = 0;    var[2].type = nsXPTType::T_CHAR_STR;    var[2].flags = nsXPTCVariant::PTR_IS_DATA;    var[2].ptr = &var[2].val.p;        if(NS_SUCCEEDED(XPTC_InvokeByIndex(test, 12, 3, var)))        printf(" = %s\n", var[2].val.p);    else        printf("\tFAILED");    DoMultipleInheritenceTest();    DoMultipleInheritenceTest2();    // Disabled by default - takes too much time on slow machines    //DoSpeedTest();    return 0;}