a problem with alien, primitive fail (primFFICallResult:withArguments:)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

a problem with alien, primitive fail (primFFICallResult:withArguments:)

EstebanLM
 
Hi, 
I'm trying to get the Alien ObjectiveC bridge to work, and I'm having a problem (right now no cog, just cocoa vm 5.7 with "regular" alien, NewspeakI32ABIPlugin), and I'm having a problem on sending a message with this form: 

someAlien
primFFICallResult: resultAlien
withArguments: {anAlien. aLargePositiveInteger}

so... it is answering primitiveFail (code 3), because the third argument is bad taken when converting... the primitive does this path: 

callIA32IntegralReturn,
...
long v = interpreterProxy->signed32BitValueOf(arg);
...
value = (((byteAt((oop + (BASE_HEADER_SIZE)) + 0)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 1)) << 8)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 2)) << 16)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 3)) << 24);

value here is negative, and of course, it throws an error. 

So... anybody has a clue of whats wrong? I know the number is actually a LargePositiveInteger, so it should be ok, and pass... so any idea?

Cheers,
Esteban



Reply | Threaded
Open this post in threaded view
|

Re: a problem with alien, primitive fail (primFFICallResult:withArguments:)

Igor Stasenko
 
On 28 December 2010 01:54, Esteban Lorenzano <[hidden email]> wrote:

>
> Hi,
> I'm trying to get the Alien ObjectiveC bridge to work, and I'm having a problem (right now no cog, just cocoa vm 5.7 with "regular" alien, NewspeakI32ABIPlugin), and I'm having a problem on sending a message with this form:
> someAlien
> primFFICallResult: resultAlien
> withArguments: {anAlien. aLargePositiveInteger}
> so... it is answering primitiveFail (code 3), because the third argument is bad taken when converting... the primitive does this path:
> callIA32IntegralReturn,
> ...
> long v = interpreterProxy->signed32BitValueOf(arg);
> ...
> value = (((byteAt((oop + (BASE_HEADER_SIZE)) + 0)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 1)) << 8)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 2)) << 16)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 3)) << 24);
> value here is negative, and of course, it throws an error.
> So... anybody has a clue of whats wrong? I know the number is actually a LargePositiveInteger, so it should be ok, and pass... so any idea?

sure, if your largePositiveInteger, which is 32bit unsigned integer,
then

 long v = interpreterProxy->signed32BitValueOf(arg);

should be

unsigned long v = interpreterProxy->positive32BitValueOf(arg);

> Cheers,
> Esteban
>
>
>
>



--
Best regards,
Igor Stasenko AKA sig.
Reply | Threaded
Open this post in threaded view
|

Re: a problem with alien, primitive fail (primFFICallResult:withArguments:)

EstebanLM
 
Hi,
so in dabusiness.h I changed 

} else {
long v = interpreterProxy->signed32BitValueOf(arg);
if (interpreterProxy->failed())
return PrimErrBadArgument;
*(long *)argvec = v;
argvec += sizeof(long);
}

for

} else {
long v;
sqInt argClass = interpreterProxy->fetchClassOf(arg);
if (argClass == (interpreterProxy->classLargePositiveInteger())) {
v = interpreterProxy->positive32BitValueOf(arg);
} else {
v = interpreterProxy->signed32BitValueOf(arg);
}


if (interpreterProxy->failed())
return PrimErrBadArgument;
*(long *)argvec = v;
argvec += sizeof(long);
}

now it seems to be working... maybe I need extend this for other integer possible values? well, one problem at a time... for now is working, but the Alien Bridge still don't, so I'll continue hacking that :)

Cheers and thanks
Esteban


El 28/12/2010, a las 5:37a.m., Igor Stasenko escribió:


On 28 December 2010 01:54, Esteban Lorenzano <[hidden email]> wrote:

Hi,
I'm trying to get the Alien ObjectiveC bridge to work, and I'm having a problem (right now no cog, just cocoa vm 5.7 with "regular" alien, NewspeakI32ABIPlugin), and I'm having a problem on sending a message with this form:
someAlien
primFFICallResult: resultAlien
withArguments: {anAlien. aLargePositiveInteger}
so... it is answering primitiveFail (code 3), because the third argument is bad taken when converting... the primitive does this path:
callIA32IntegralReturn,
...
long v = interpreterProxy->signed32BitValueOf(arg);
...
value = (((byteAt((oop + (BASE_HEADER_SIZE)) + 0)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 1)) << 8)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 2)) << 16)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 3)) << 24);
value here is negative, and of course, it throws an error.
So... anybody has a clue of whats wrong? I know the number is actually a LargePositiveInteger, so it should be ok, and pass... so any idea?

sure, if your largePositiveInteger, which is 32bit unsigned integer,
then

long v = interpreterProxy->signed32BitValueOf(arg);

should be

unsigned long v = interpreterProxy->positive32BitValueOf(arg);

Cheers,
Esteban







--
Best regards,
Igor Stasenko AKA sig.

Reply | Threaded
Open this post in threaded view
|

Re: a problem with alien, primitive fail (primFFICallResult:withArguments:)

Igor Stasenko

hmm i should probably check the code by myself,
because in given context it doesn't makes too much sense to me.

if you need to convert from integer object to unsigned 32-bit integer,
then any negative integer passed from smalltalk should raise and error
(a primitive failure)
which actually positive32BitValueOf() does.

But if you don't care about sign of integer value, and care only that
it  should fit in 32-bit word,
then of course, you could do like you did:
> if (argClass == (interpreterProxy->classLargePositiveInteger())) {
> v = interpreterProxy->positive32BitValueOf(arg);
> } else {
> v = interpreterProxy->signed32BitValueOf(arg);
> }
>

Squeak integer -> C unsigned long
use positive32BitValueOf()

Squeak integer -> C signed long
use signed32BitValueOf()

in any case, a caller of callout should state explicitly, which value
type (signed or unsigned)
he wants to pass as argument, not "i don't care". :)


On 28 December 2010 14:45, Esteban Lorenzano <[hidden email]> wrote:

>
> Hi,
> so in dabusiness.h I changed
> } else {
> long v = interpreterProxy->signed32BitValueOf(arg);
> if (interpreterProxy->failed())
> return PrimErrBadArgument;
> *(long *)argvec = v;
> argvec += sizeof(long);
> }
> for
> } else {
> long v;
> sqInt argClass = interpreterProxy->fetchClassOf(arg);
> if (argClass == (interpreterProxy->classLargePositiveInteger())) {
> v = interpreterProxy->positive32BitValueOf(arg);
> } else {
> v = interpreterProxy->signed32BitValueOf(arg);
> }
>
> if (interpreterProxy->failed())
> return PrimErrBadArgument;
> *(long *)argvec = v;
> argvec += sizeof(long);
> }
> now it seems to be working... maybe I need extend this for other integer possible values? well, one problem at a time... for now is working, but the Alien Bridge still don't, so I'll continue hacking that :)
> Cheers and thanks
> Esteban
>
> El 28/12/2010, a las 5:37a.m., Igor Stasenko escribió:
>
> On 28 December 2010 01:54, Esteban Lorenzano <[hidden email]> wrote:
>
> Hi,
>
> I'm trying to get the Alien ObjectiveC bridge to work, and I'm having a problem (right now no cog, just cocoa vm 5.7 with "regular" alien, NewspeakI32ABIPlugin), and I'm having a problem on sending a message with this form:
>
> someAlien
>
> primFFICallResult: resultAlien
>
> withArguments: {anAlien. aLargePositiveInteger}
>
> so... it is answering primitiveFail (code 3), because the third argument is bad taken when converting... the primitive does this path:
>
> callIA32IntegralReturn,
>
> ...
>
> long v = interpreterProxy->signed32BitValueOf(arg);
>
> ...
>
> value = (((byteAt((oop + (BASE_HEADER_SIZE)) + 0)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 1)) << 8)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 2)) << 16)) + ((byteAt((oop + (BASE_HEADER_SIZE)) + 3)) << 24);
>
> value here is negative, and of course, it throws an error.
>
> So... anybody has a clue of whats wrong? I know the number is actually a LargePositiveInteger, so it should be ok, and pass... so any idea?
>
> sure, if your largePositiveInteger, which is 32bit unsigned integer,
> then
>
> long v = interpreterProxy->signed32BitValueOf(arg);
>
> should be
>
> unsigned long v = interpreterProxy->positive32BitValueOf(arg);
>
> Cheers,
>
> Esteban
>
>
>
>
>
>
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
>
>



--
Best regards,
Igor Stasenko AKA sig.