88 lines
2.3 KiB
C
88 lines
2.3 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2007 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#include "mdef.h"
|
|
#include "zstep.h"
|
|
#include "rtnhdr.h"
|
|
#include "stack_frame.h"
|
|
#include "xfer_enum.h"
|
|
#include "indir_enum.h"
|
|
#include "op.h"
|
|
#include "fix_xfer_entry.h"
|
|
|
|
GBLREF xfer_entry_t xfer_table[];
|
|
GBLREF stack_frame *frame_pointer;
|
|
GBLDEF unsigned char *zstep_level;
|
|
GBLREF mval zstep_action;
|
|
GBLREF mval dollar_zstep;
|
|
GBLREF bool neterr_pending;
|
|
GBLREF int4 outofband;
|
|
GBLREF int iott_write_error;
|
|
IA64_ONLY(int function_type(char*);)
|
|
|
|
void op_zstep(uint4 code, mval *action)
|
|
{
|
|
stack_frame *fp;
|
|
int4 status;
|
|
|
|
if (!action)
|
|
zstep_action = dollar_zstep;
|
|
else
|
|
{ op_commarg(action,indir_linetail);
|
|
op_unwind();
|
|
zstep_action = *action;
|
|
}
|
|
switch(code)
|
|
{
|
|
case ZSTEP_INTO:
|
|
if (!neterr_pending && 0 == outofband && 0 == iott_write_error)
|
|
{
|
|
FIX_XFER_ENTRY(xf_linefetch, op_zstepfetch);
|
|
FIX_XFER_ENTRY(xf_linestart, op_zstepstart);
|
|
FIX_XFER_ENTRY(xf_zbfetch, op_zstzbfetch);
|
|
FIX_XFER_ENTRY(xf_zbstart, op_zstzbstart);
|
|
}
|
|
break;
|
|
case ZSTEP_OVER:
|
|
case ZSTEP_OUTOF:
|
|
|
|
fp = frame_pointer;
|
|
for (fp = frame_pointer; fp ; fp = fp->old_frame_pointer)
|
|
{ if (fp->type & SFT_COUNT)
|
|
{ break;
|
|
}
|
|
}
|
|
zstep_level = (unsigned char *) fp;
|
|
if (!neterr_pending && 0 == outofband && 0 == iott_write_error)
|
|
{
|
|
if (code == ZSTEP_OVER)
|
|
{
|
|
FIX_XFER_ENTRY(xf_linefetch, op_zst_fet_over);
|
|
FIX_XFER_ENTRY(xf_linestart, op_zst_st_over);
|
|
FIX_XFER_ENTRY(xf_zbfetch, op_zstzb_fet_over);
|
|
FIX_XFER_ENTRY(xf_zbstart, op_zstzb_st_over);
|
|
}
|
|
else
|
|
{
|
|
FIX_XFER_ENTRY(xf_ret, opp_zstepret);
|
|
FIX_XFER_ENTRY(xf_retarg, opp_zstepretarg);
|
|
FIX_XFER_ENTRY(xf_linefetch, op_linefetch);
|
|
FIX_XFER_ENTRY(xf_linestart, op_linestart);
|
|
FIX_XFER_ENTRY(xf_zbfetch, op_zbfetch);
|
|
FIX_XFER_ENTRY(xf_zbstart, op_zbstart);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
GTMASSERT;
|
|
}
|
|
}
|