started correcting ensure: implementation
This commit is contained in:
parent
f22b896ed2
commit
67275b3ef3
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#class(#pointer) Context(Apex)
|
#class(#pointer) Context(Apex)
|
||||||
{
|
{
|
||||||
#dcl sender ip sp ntmprs.
|
#dcl sender ip sp ntmprs ensure_block.
|
||||||
|
|
||||||
#method sender
|
#method sender
|
||||||
{
|
{
|
||||||
@ -75,6 +75,8 @@
|
|||||||
|
|
||||||
#method findExceptionHandlerBlock: anExceptionClass
|
#method findExceptionHandlerBlock: anExceptionClass
|
||||||
{
|
{
|
||||||
|
## find an exception handler block for a given exception class.
|
||||||
|
##
|
||||||
## for this to work, self must be an exception handler context.
|
## for this to work, self must be an exception handler context.
|
||||||
## For a single on:do: call,
|
## For a single on:do: call,
|
||||||
## self class specNumInstVars must return 8.
|
## self class specNumInstVars must return 8.
|
||||||
@ -85,7 +87,9 @@
|
|||||||
| bound exc |
|
| bound exc |
|
||||||
## NOTE: if on:do: has a temporary varible, bound must be adjusted to reflect it.
|
## NOTE: if on:do: has a temporary varible, bound must be adjusted to reflect it.
|
||||||
bound := self basicSize - 1.
|
bound := self basicSize - 1.
|
||||||
8 to: bound by: 2 do: [ :i |
|
## TODO: change 9 to a constant when stix is enhanced to support constant definition
|
||||||
|
## or calcuate the minimum size using the class information.
|
||||||
|
9 to: bound by: 2 do: [ :i |
|
||||||
exc := self basicAt: i.
|
exc := self basicAt: i.
|
||||||
((anExceptionClass == exc) or: [anExceptionClass inheritsFrom: exc]) ifTrue: [^self basicAt: (i + 1)].
|
((anExceptionClass == exc) or: [anExceptionClass inheritsFrom: exc]) ifTrue: [^self basicAt: (i + 1)].
|
||||||
]
|
]
|
||||||
@ -330,6 +334,7 @@ thisContext isExceptionHandlerContext dump.
|
|||||||
{
|
{
|
||||||
## TODO: ensure that the ensured block is executed after exception handler...
|
## TODO: ensure that the ensured block is executed after exception handler...
|
||||||
| v |
|
| v |
|
||||||
|
self.ensure_block := aBlock.
|
||||||
v := self on: Exception do: [:ex |
|
v := self on: Exception do: [:ex |
|
||||||
aBlock value.
|
aBlock value.
|
||||||
ex pass
|
ex pass
|
||||||
|
@ -112,6 +112,24 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#method(#class) aaa_123
|
||||||
|
{
|
||||||
|
| v1 |
|
||||||
|
v1 := [
|
||||||
|
| k |
|
||||||
|
k := 99.
|
||||||
|
[
|
||||||
|
[
|
||||||
|
##[ Exception signal: 'simulated error' ] ensure: [('ensure 1 ', (k asString)) dump ].
|
||||||
|
[ ^20 ] ensure: [('ensure 1 ', (k asString)) dump ].
|
||||||
|
] ensure: ['ensure 2' dump ].
|
||||||
|
] ensure: ['ensure 3' dump ].
|
||||||
|
] on: Exception do: [:ex |
|
||||||
|
('EXCETION - ' , ex messageText) dump.
|
||||||
|
## Exception signal: 'qqq'.
|
||||||
|
].
|
||||||
|
^v1
|
||||||
|
}
|
||||||
#method(#class) main
|
#method(#class) main
|
||||||
{
|
{
|
||||||
| v1 |
|
| v1 |
|
||||||
@ -131,17 +149,21 @@
|
|||||||
|
|
||||||
"[1 xxx] ifCurtailed: ['XXXXXXXX CURTAILED XXXXXXXXX' dump. Exception signal: 'jjjj']."
|
"[1 xxx] ifCurtailed: ['XXXXXXXX CURTAILED XXXXXXXXX' dump. Exception signal: 'jjjj']."
|
||||||
|
|
||||||
v1 := [
|
" v1 := [
|
||||||
| k |
|
| k |
|
||||||
k := 99.
|
k := 99.
|
||||||
[
|
[
|
||||||
[ Exception signal: 'simulated error' ] ensure: [('ensure 1 ', (k asString)) dump ].
|
[
|
||||||
] ensure: ['ensure 2' dump ].
|
##[ Exception signal: 'simulated error' ] ensure: [('ensure 1 ', (k asString)) dump ].
|
||||||
|
[ ^20 ] ensure: [('ensure 1 ', (k asString)) dump ].
|
||||||
|
] ensure: ['ensure 2' dump ].
|
||||||
|
] ensure: ['ensure 3' dump ].
|
||||||
] on: Exception do: [:ex |
|
] on: Exception do: [:ex |
|
||||||
('EXCETION - ' , ex messageText) dump.
|
('EXCETION - ' , ex messageText) dump.
|
||||||
## Exception signal: 'qqq'.
|
## Exception signal: 'qqq'.
|
||||||
].
|
].
|
||||||
|
"
|
||||||
|
v1 := self aaa_123.
|
||||||
'--------------------------------' dump.
|
'--------------------------------' dump.
|
||||||
v1 dump.
|
v1 dump.
|
||||||
'END OF MAIN' dump.
|
'END OF MAIN' dump.
|
||||||
|
@ -1672,6 +1672,7 @@ printf ("PRIM BlockContext value FAIL - NARGS MISMATCH\n");
|
|||||||
#else
|
#else
|
||||||
blkctx->ip = rcv_blkctx->ip;
|
blkctx->ip = rcv_blkctx->ip;
|
||||||
blkctx->ntmprs = rcv_blkctx->ntmprs;
|
blkctx->ntmprs = rcv_blkctx->ntmprs;
|
||||||
|
blkctx->ensure_block = rcv_blkctx->ensure_block;
|
||||||
blkctx->method_or_nargs = rcv_blkctx->method_or_nargs;
|
blkctx->method_or_nargs = rcv_blkctx->method_or_nargs;
|
||||||
blkctx->receiver_or_source = (stix_oop_t)rcv_blkctx;
|
blkctx->receiver_or_source = (stix_oop_t)rcv_blkctx;
|
||||||
blkctx->home = rcv_blkctx->home;
|
blkctx->home = rcv_blkctx->home;
|
||||||
@ -3838,7 +3839,23 @@ return -1;
|
|||||||
*/
|
*/
|
||||||
stix->ip--;
|
stix->ip--;
|
||||||
#else
|
#else
|
||||||
if (stix->active_context->origin == stix->processor->active->initial_context->origin)
|
if ((stix_oop_t)stix->active_context->ensure_block != stix->_nil)
|
||||||
|
{
|
||||||
|
STIX_LOG0 (stix, STIX_LOG_ERROR, "ABOUT TO EVALUATE ENSURE BLOCK ....\n");
|
||||||
|
STIX_STACK_PUSH (stix, (stix_oop_t)stix->active_context->ensure_block);
|
||||||
|
|
||||||
|
stix->active_context->ensure_block = (stix_oop_context_t)stix->_nil;
|
||||||
|
stix->ip--;
|
||||||
|
if (prim_block_value (stix, 0) <= 0)
|
||||||
|
{
|
||||||
|
/* TODO: problems in evaluating an ensure-block */
|
||||||
|
/* TODO: ..... */
|
||||||
|
STIX_STACK_POP (stix);
|
||||||
|
STIX_LOG0 (stix, STIX_LOG_ERROR, "ERROR ENSURE BLOCK FAILURE....\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (stix->active_context->origin == stix->processor->active->initial_context->origin)
|
||||||
{
|
{
|
||||||
/* method return from a processified block
|
/* method return from a processified block
|
||||||
*
|
*
|
||||||
@ -3924,7 +3941,7 @@ return -1;
|
|||||||
/* NOTE: this condition is true for the processified block context also.
|
/* NOTE: this condition is true for the processified block context also.
|
||||||
* stix->active_context->origin == stix->processor->active->initial_context->origin
|
* stix->active_context->origin == stix->processor->active->initial_context->origin
|
||||||
* however, the check here is done after context switching and the
|
* however, the check here is done after context switching and the
|
||||||
* processified block check is done against the context before switching */
|
* processified block check has been done against the context before switching */
|
||||||
|
|
||||||
/* the stack contains the final return value so the stack pointer must be 0. */
|
/* the stack contains the final return value so the stack pointer must be 0. */
|
||||||
STIX_ASSERT (stix->sp == 0);
|
STIX_ASSERT (stix->sp == 0);
|
||||||
|
@ -513,7 +513,7 @@ struct stix_method_t
|
|||||||
#define STIX_METHOD_PREAMBLE_INDEX_MAX 0xFFFF
|
#define STIX_METHOD_PREAMBLE_INDEX_MAX 0xFFFF
|
||||||
#define STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(num) ((num) >= STIX_METHOD_PREAMBLE_INDEX_MIN && (num) <= STIX_METHOD_PREAMBLE_INDEX_MAX)
|
#define STIX_OOI_IN_METHOD_PREAMBLE_INDEX_RANGE(num) ((num) >= STIX_METHOD_PREAMBLE_INDEX_MIN && (num) <= STIX_METHOD_PREAMBLE_INDEX_MAX)
|
||||||
|
|
||||||
#define STIX_CONTEXT_NAMED_INSTVARS 8
|
#define STIX_CONTEXT_NAMED_INSTVARS 9
|
||||||
typedef struct stix_context_t stix_context_t;
|
typedef struct stix_context_t stix_context_t;
|
||||||
typedef struct stix_context_t* stix_oop_context_t;
|
typedef struct stix_context_t* stix_oop_context_t;
|
||||||
struct stix_context_t
|
struct stix_context_t
|
||||||
@ -540,6 +540,9 @@ struct stix_context_t
|
|||||||
* defined its 'home'. */
|
* defined its 'home'. */
|
||||||
stix_oop_t ntmprs;
|
stix_oop_t ntmprs;
|
||||||
|
|
||||||
|
/* **** */
|
||||||
|
stix_oop_context_t ensure_block;
|
||||||
|
|
||||||
/* CompiledMethod for a method context,
|
/* CompiledMethod for a method context,
|
||||||
* SmallInteger for a block context */
|
* SmallInteger for a block context */
|
||||||
stix_oop_t method_or_nargs;
|
stix_oop_t method_or_nargs;
|
||||||
|
Loading…
Reference in New Issue
Block a user