blob: 9dc6d1c4f2144395fa410406f9fb0bc1134faff5 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O -finline-functions -finline-small-functions -Wuninitialized" } */
/* { dg-add-options bind_pic_locally } */
typedef int int32_t __attribute__((mode (__SI__)));
struct SQObjectPtr
{
int32_t _type;
SQObjectPtr operator = (long);
};
struct SQObjectPtrVec
{
SQObjectPtr fff (unsigned);
SQObjectPtr *_vals;
};
struct SQInstruction
{
int _arg1;
unsigned op;
unsigned _arg0;
unsigned _arg2;
};
struct SQVM
{
struct CallInfo
{
SQInstruction *_ip;
};
bool
Execute (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int);
bool
FOREACH_OP
(SQObjectPtr
&, SQObjectPtr &, SQObjectPtr &, SQObjectPtr &, long, int, int &);
SQObjectPtrVec _stack;
CallInfo *ci;
long _nnativecalls;
bool ShouldSuspend ();
};
struct AutoDec
{
AutoDec (long *);
~AutoDec ();
};
bool
SQVM::FOREACH_OP
(SQObjectPtr
&
o1,
SQObjectPtr & o2, SQObjectPtr &, SQObjectPtr & o4, long, int, int &jump)
{
long
nrefidx = 0;
switch (o1._type)
{
case 0x02000000L:
o4 = nrefidx;
jump = 1;
return true;
case 0x00000080L:
{
long
idx = 10;
o2 = idx;
jump = 0;
}
}
return false;
}
bool
SQVM::Execute
(SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int)
{
AutoDec
ad (&_nnativecalls);
for (;;)
{
if (ShouldSuspend ())
return true;
SQInstruction
_i_ = *ci->_ip;
switch (_i_.op)
{
case 0:
{
int
tojump;
FOREACH_OP
(_stack._vals
[_i_._arg0],
_stack._vals
[_i_._arg2],
_stack._vals
[_i_._arg2],
_stack._vals[_i_._arg2], _i_._arg2, _i_._arg1, tojump);
ci += tojump; /* { dg-warning "uninitialized" "warning" } */
}
case 1:
_stack.fff (_i_._arg1);
}
}
return true;
}