> On 16.11.2014, at 19:35, Igor Stasenko <[email protected]> wrote: > > > > On 16 November 2014 19:11, Max Leske <[email protected] > <mailto:[email protected]>> wrote: > >> On 15.11.2014, at 22:28, Igor Stasenko <[email protected] >> <mailto:[email protected]>> wrote: >> >> >> >> On 15 November 2014 15:53, Max Leske <[email protected] >> <mailto:[email protected]>> wrote: >> Once again I’m struggling with NativeBoost. I’m trying to use >> optCoerceNilToNull with this function: >> >> ^self call: #(LGitReturnCodeEnum git_commit_create( >> LGitId * theCommitId, >> LGitRepository repo, >> String update_ref, >> LGitSignature * theAuthor, >> LGitSignature * theCommitter, >> String message_encoding, >> String theMessage, >> LGitTree theTree, >> int parent_count, >> LGitCommit * parentsPointer)) options: #( optCoerceNilToNull ) >> >> The last argument can be NULL, per documentation, (no parents). >> LGitCommit is a subclass of NBExternalObject and apparently >> NBExternalObjctType>>pushAsPointer: does *not* use the optCoerceNilToNull >> option (the super implementation in NBExternalType>>pushAsPointer: however >> does). The upshot of course is that the call fails with “an instance of >> LGitCommit expected”. >> >> My questions: >> - The documentation says: >> >> "#optCoerceNilToNull" >> "passing nil as a pointer-type argument, converts it to C NULL “ >> >> but apparently this doesn’t apply to every pointer type. Should the >> documentation be updated? >> - Why does NBExternlObjectType not use optCoerceNilToNull? I don’t want to >> use tricks to pass null if I don’t have to. >> >> perhaps because it is not there? :) >> So, lets add it. > > Yay! :) I have zero assembly skills… I’ve tried the following but then get an > “undefined label done18” error: > > NBExternalObject>>pushAsPointer: gen > "push a pointer to handle value" > | asm proxy oop notNil done | > > proxy := gen proxy. > asm := gen asm. > > <<<<<<<<<<<<<< new > > done := asm uniqueLabelName: 'done’. > > >>>>>>>>>>>>>>> new > > oop := gen reserveTemp. > loader emitLoad: gen to: oop. > > <<<<<<<<<<<<<< new > > "handle nils, if we care" > gen optCoerceNilToNull > ifTrue: [ > notNil := asm uniqueLabelName: 'notNil'. > proxy nilObject. > asm cmp: asm EAX with: oop; > jne: notNil; > xor: asm EAX with: asm EAX; > jmp: done; > label: notNil ] > ifFalse: [ > "we can skip class verification, if loader loads > receiver, since nothing to fear there" > loader isReceiver ifFalse: [ > self verifyClassOf: oop is: objectClass > generator: gen. > ] ]. > > >>>>>>>>>>>>>>> new > > proxy fetchPointer: (self handleIvarIndex) ofObject: oop. "handle ivar" > proxy varBytesFirstFieldOf: asm EAX. "handle value ptr" > asm push: asm EAX. > > gen releaseTemps: 1. > > > please make an issue, so we can fix & integrate it.
Here you go: https://pharo.fogbugz.com/f/cases/14479/Enable-nil-to-NULL-coercion-for-NBExternalObjectType > >> >> - Related: there are instances where even non-pointer arguments are allowed >> to be NULL. Why does optCoerceNilToNull only work for pointer types? >> >> >> like what? Suppose the argument type is a structure, e.g >> "struct foo bar", that is non-pointer type. What in this case the NULL value >> for the structure? > > Ok, I think I understand. Are you saying that, since NULL is a macro, you > have no way of telling during runtime how NULL is defined? For a pointer it > is simply 0 or (void *) 0, but for a non pointer it depends on the context. > Is that about right? > > > I am saying that there is only 'NULL pointer' defined, > i never heard anything about 'NULL Float', or 'NULL struct', or 'NULL union'. > This is why there's only nil->NULL coercion provided. >> >> Igor! Help! :) >> >> Cheers, >> Max >> >> >> >> >> -- >> Best regards, >> Igor Stasenko. > > > > -- > Best regards, > Igor Stasenko.
