Hello,
Alien adds a new primitive pragma:
<primitive: 'foo' error: tempName module: 'bar' >
where tempName is auto-declared during parsing as a special temp which will be used to retrieve primitive error code. i.e.
myMethod <primitive: 'foo' error: code module: 'bar' > "prim failed , check the error code" code = 5 ifTrue: [ self error: 'you wrong' ] code = 666 ifTrue: [ self error: 'you are wrong as hell' ]
The problem is, that i found that while its integrated in parser (through Alien package overrides), it leads to nowhere in current Interpreter. :(
The sole reference to primFailCode is only in #primitiveFailFor: , which actually should be used by prims to set the failure code:
Interpreter>>primitiveFailFor: reasonCode "Set specific primitive failure." primFailCode := reasonCode. self primitiveFail.
I'd like to propose an alternative implementation:
- at VM side , add only a single primitive: primitiveLastFailureCode self export: true. self pop: 1 thenPush: (self integerObjectOf: primFailCode). "reset the code" primFailCode := 0.
At language side, we can support both, old and new format:
Add the method , which will retrieve the code:
Object>>lastFailureCode "Primitive: answer the last primitive failure code. Resets the failure code. Note: it can fail only if we're running on older VMs, which has no support of this primitive, if so, answer the generic failure code" <primitive: 'primitiveLastFailureCode' module: ''> ^ 0
And then, to handle things manually, one could use:
Myclass>> foo <primitive: 'myprimitive' module: 'mymodule> "we're failed" | code | code := self lastFailureCode. ... handle the error code...
And to support the Alien's new pragma pattern (primitive:error:module:) it can simply instruct the encoder to generate an implicit bytecode sequence (at method's beginning), which equals to: temp := self lastFailureCode. (where temp, is one, which used in pragma)
What you think?