dbgsem.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,388 行 · 第 1/3 页
C
1,388 行
break;
case 21:
switch( parm ) {
case SSL_CASE_SENSITIVE:
_SwitchOff( SW_CASE_SENSITIVE );
break;
case SSL_SIDE_EFFECT:
_SwitchOff( SW_SIDE_EFFECT );
break;
//case SSL_32_BIT:
// _SwitchOff( SW_32_BIT );
// break;
}
break;
case 22:
switch( parm ) {
case SSL_CASE_SENSITIVE:
result = _IsOn( SW_CASE_SENSITIVE );
break;
case SSL_SIDE_EFFECT:
result = _IsOn( SW_SIDE_EFFECT );
break;
case SSL_32_BIT:
GetMADTypeDefault( MTK_INTEGER, &mti );
result = (mti.b.bits >= 32);
break;
}
break;
case 23: // nyi - end temp
MarkArrayOrder( parm );
break;
case 24:
StartSubscript();
break;
case 25:
AddSubscript();
break;
case 26:
EndSubscript();
break;
}
return( result );
}
static bool UserType( type_handle *th )
{
unsigned i;
unsigned len;
sym_info info;
//NYI:begin temp
if( ExprSP->flags & SF_NAME ) {
static const char * const TagIds[] = { "struct", "class", "union", "enum", NULL };
ExprSP->v.name.type = ST_TYPE;
for( i = 0; TagIds[i] != NULL; ++i ) {
len = strlen( TagIds[i] );
if( len == ExprSP->v.name.name.len
&& memcmp( ExprSP->v.name.name.start, TagIds[i], len ) == 0 ) {
ExprSP->v.name.type = ST_STRUCT_TAG + i;
ExprSP->v.name.name.start = NamePos();
ExprSP->v.name.name.len = NameLen();
Scan();
}
}
}
//NYI: end temp
NameResolve( ExprSP, TRUE );
if( !(ExprSP->flags & SF_SYM) ) return( FALSE );
if( ExprSP->th == NULL ) return( FALSE );
SymInfo( ExprSP->v.sh, ExprSP->lc, &info );
if( info.kind != SK_TYPE ) return( FALSE );
HDLAssign( type, th, ExprSP->th );
return( TRUE );
}
static void PushBaseSize( void )
{
DIPHDL( type, th );
type_info ti;
TypeBase( ExprSP->th, th, NULL, NULL );
TypeInfo( th, ExprSP->lc, &ti );
PushNum( ti.size );
}
static void ScaleInt( void )
{
MoveSP( 1 );
PushBaseSize();
MoveSP( -1 );
DoMul();
}
static void DoPlusScaled( void )
{
stack_entry *left;
left = StkEntry( 1 );
LRValue( left );
RValue( ExprSP );
switch( left->info.kind ) {
case TK_POINTER:
ScaleInt();
break;
default:
switch( ExprSP->info.kind ) {
case TK_POINTER:
SwapStack( 1 );
ScaleInt();
break;
}
}
DoPlus();
}
static void DoMinusScaled( void )
{
stack_entry *left;
left = StkEntry( 1 );
LRValue( left );
RValue( ExprSP );
switch( left->info.kind ) {
case TK_POINTER:
switch( ExprSP->info.kind ) {
case TK_POINTER:
/* Have to check if base type sizes are the same */
PushBaseSize();
DupStack();
SwapStack( 3 );
PushBaseSize();
MoveSP( 1 );
SwapStack( 3 );
MoveSP( -1 );
if( !TstEQ( 1 ) ) {
Error( ERR_NONE, LIT( ERR_ILL_TYPE ) );
}
PopEntry();
MoveSP( 1 );
DoMinus();
MoveSP( -1 );
DoDiv();
return;
default:
ScaleInt();
break;
}
break;
default:
switch( ExprSP->info.kind ) {
case TK_POINTER:
Error( ERR_NONE, LIT( ERR_ILL_TYPE ) );
break;
}
}
DoMinus();
}
static unsigned MechDo( unsigned select, unsigned parm )
{
unsigned long size;
unsigned result;
DIPHDL( type, th );
type_info info;
mad_type_info mti;
switch( select ) {
case 0:
DoAssign();
break;
case 1:
DoMul();
break;
case 2:
DoDiv();
break;
case 3:
DoMod();
break;
case 4:
DoMinus();
break;
case 5:
DoShift();
break;
case 6:
DoAnd();
break;
case 7:
DoXor();
break;
case 8:
DoOr();
break;
case 9:
DoAddr();
break;
case 10:
ClassToTypeInfo( parm, &info );
DoPoints( info.kind );
break;
case 11:
DoField();
break;
case 12:
DoCall( Num, parm );
break;
case 13:
DoConvert();
break;
case 14:
DoPlus();
break;
case 15:
MakeAddr();
break;
case 16:
result = TstEQ( parm );
break;
case 17:
result = TstLT( parm );
break;
case 18:
result = TstTrue( parm );
break;
case 19:
result = TstExist( parm );
break;
case 20:
size = ExprSP->info.size;
PopEntry();
PushNum( size );
break;
case 21:
TypeBase( ExprSP->th, th, NULL, NULL );
PopEntry();
PushType( th );
break;
case 22:
GetMADTypeDefault( MTK_ADDRESS, &mti );
size = (mti.b.bits - mti.a.seg.bits) / BITS_PER_BYTE;
if( parm ) {
size += sizeof( addr_seg );
TypePointer( ExprSP->th, TM_FAR, size, th );
} else {
TypePointer( ExprSP->th, TM_NEAR, size, th );
}
PopEntry();
PushType( th );
break;
case 23:
result = UserType( th );
if( result ) {
PopEntry();
PushType( th );
}
break;
case 24:
DoMakeComplex();
break;
case 25:
DoStringConcat();
break;
case 26:
DoLConvert();
break;
case 27:
DoPlusScaled();
break;
case 28:
DoMinusScaled();
break;
case 29:
DoPoints( TI_KIND_EXTRACT( parm ) );
break;
case 30:
info.kind = TK_POINTER;
info.size = TI_SIZE_EXTRACT( parm );
info.modifier = TI_MOD_EXTRACT( parm );
FillInDefaults( &info );
TypePointer( ExprSP->th, info.modifier, info.size, th );
PopEntry();
PushType( th );
break;
case 31:
if( parm ) {
/* file scope */
if( ExprSP->flags & SF_NAME ) {
ExprSP->v.name.file_scope = TRUE;
} else {
Error( ERR_LOC, LIT( ERR_WANT_NAME ) );
}
} else {
/* in a namespace */
DoScope();
}
break;
}
return( result );
}
struct internal_mod {
mod_handle mh;
};
OVL_EXTERN walk_result FindInternalMod( mod_handle mh, void *d )
{
if( !IsInternalMod( mh ) ) return( WR_CONTINUE );
((struct internal_mod *)d)->mh = mh;
return( WR_STOP );
}
static void BasicType( unsigned basic_type )
{
struct internal_mod mod_srch;
struct imp_type_handle *internal;
type_info info;
DIPHDL( type, th );
WalkModList( NO_MOD, FindInternalMod, &mod_srch );
internal = TypeCreate( th, mod_srch.mh );
info.kind = TI_KIND_EXTRACT( basic_type );
info.modifier = TI_MOD_EXTRACT( basic_type );
info.size = TI_SIZE_EXTRACT( basic_type );
FillInDefaults( &info );
internal->t.k = info.kind;
internal->t.m = info.modifier;
internal->t.s = info.size;
internal->ri = NULL;
PushType( th );
}
static unsigned MechPush_n_Pop( unsigned select, unsigned parm )
{
location_list ll;
type_info ti;
unsigned result;
const static unsigned TypeTbl[] = {
TI_CREATE( TK_VOID, TM_NONE, 0 ),
TI_CREATE( TK_INTEGER, TM_UNSIGNED, 1 ),
TI_CREATE( TK_INTEGER, TM_SIGNED, 1 ),
TI_CREATE( TK_INTEGER, TM_UNSIGNED, 2 ),
TI_CREATE( TK_INTEGER, TM_SIGNED, 2 ),
TI_CREATE( TK_INTEGER, TM_UNSIGNED, 4 ),
TI_CREATE( TK_INTEGER, TM_SIGNED, 4 ),
TI_CREATE( TK_REAL, TM_NONE, 4 ),
TI_CREATE( TK_REAL, TM_NONE, 8 ),
TI_CREATE( TK_COMPLEX, TM_NONE, 8 ),
TI_CREATE( TK_COMPLEX, TM_NONE, 16 ),
};
result = FALSE;
switch( select ) {
case 0:
PushInt( parm );
break;
case 1:
PushAddr( GetDotAddr() );
break;
case 2:
ParseRegSet( TRUE, &ll, &ti );
if( ti.size != 0 ) {
if( ti.kind == TK_NONE ) Error( ERR_NONE, LIT( ERR_ILL_TYPE ) );
PushLocation( &ll, &ti );
result = TRUE;
}
break;
case 3:
if( CurrToken == T_INT_NUM ) {
PushNum64( IntNumVal() );
Scan();
result = TRUE;
} else if( CurrToken == T_REAL_NUM ) {
PushRealNum( RealNumVal() );
Scan();
result = TRUE;
} else {
result = FALSE;
}
break;
case 4:
BasicType( TypeTbl[ parm ] );
break;
case 5:
DupStack();
break;
case 6:
PopEntry();
break;
case 7:
PushString();
break;
case 8:
/* here because old debuggers will always return FALSE */
switch( parm & SSL_VERSION_MAJOR_MASK ) {
case SSL_VERSION_MAJOR_CURR:
break;
default:
return( FALSE );
}
#if SSL_VERSION_MINOR_CURR != 0
if( (parm & SSL_VERSION_MINOR_MASK) > SS_MINOR_VERSION_CURR ) {
return( FALSE );
}
#endif
result = TRUE;
break;
case 9:
BasicType( parm );
break;
}
return( result );
}
static unsigned MechStack( unsigned select, unsigned parm )
{
unsigned result;
stack_entry *entry;
sym_info info;
switch( select ) {
case 0:
SwapStack( parm );
break;
case 1:
MoveSP( parm );
break;
case 2:
entry = StkEntry( parm );
LValue( entry );
result = TypeInfoToClass( &entry->info ) & (BASE_TYPE | STK_UNSIGNED);
break;
case 3:
ExprValue( StkEntry( parm ) );
break;
case 4:
LValue( StkEntry( parm ) );
break;
case 5:
RValue( StkEntry( parm ) );
break;
case 6:
LRValue( StkEntry( parm ) );
break;
case 7:
entry = StkEntry( parm );
LValue( entry );
result = TI_CREATE( entry->info.kind, TM_NONE, 0 );
break;
case 8:
entry = StkEntry( parm );
NameResolve( entry, FALSE );
if( entry->flags & SF_SYM ) {
SymInfo( entry->v.sh, entry->lc, &info );
result = info.kind;
} else {
result = SK_NONE;
}
break;
case 9:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?