📄 si_instr.c
字号:
}
enumErrorCode Exec_IDIV( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
result = Var_IDIV( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_REM( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL))
{
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) /* Change: WAP 1.1 spec changed from CONVERT_INTS_FLOATS to CONVERT_INTS */
{
result = Var_REM( op1, op2 );
}
else
{
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else
{
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
/* Bitwise instructions **************************************************************************/
enumErrorCode Exec_B_AND( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
result = Var_B_AND( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_B_OR( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
result = Var_B_OR( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_B_XOR( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
result = Var_B_XOR( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_B_NOT( pstructSI si )
{
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if (op1 == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
if (Var_ConvertMethod( CONVERT_INTS, op1, NULL )) {
result = Var_B_NOT( op1 );
Var_AssignVar( op1, result );
Var_Delete( &result );
}
else {
Var_AssignInvalid( op1 );
}
OpS_Push( si->RE->OpS, &op1 );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_B_LSHIFT( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
result = Var_B_LSHIFT( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_B_RSSHIFT( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
result = Var_B_RSSHIFT( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_B_RSZSHIFT( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
result = Var_B_RSZSHIFT( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
/* Comparison instructions *****************************************************************/
enumErrorCode Exec_EQ( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
result = Var_EQ( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_LE( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
result = Var_LE( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_LT( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
result = Var_LT( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_GE( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
result = Var_GE( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_GT( pstructSI si )
{
pstructVar op2 = RE_Pop( si->RE ); /* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if ((op1 != NULL) && (op2 != NULL)) {
if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
result = Var_GT( op1, op2 );
}
else {
result = Var_New();
Var_AssignInvalid( result );
}
Var_Delete( &op1 );
Var_Delete( &op2 );
OpS_Push( si->RE->OpS, &result );
return ERR_WAE_WMLS_NONE;
}
else {
Var_Delete( &op1 );
Var_Delete( &op2 );
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
enumErrorCode Exec_NE( pstructSI si )
{
if ((Exec_EQ(si) == ERR_WAE_WMLS_NONE) &&
(Exec_NOT(si) == ERR_WAE_WMLS_NONE)) {
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
/* the only fatal error from EQ and NOT is stack underflow */
}
}
/* Logical instructions ***********************************************************************/
enumErrorCode Exec_NOT( pstructSI si )
{
pstructVar var = RE_Pop( si->RE );
if (var == NULL) {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
if ( VCR_OK == Var_Convert( var, typeBool )) {
if (var->val.theInt == FALSE) {
Var_AssignBool( var, TRUE );
}
else {
Var_AssignBool( var, FALSE );
}
}
else {
Var_AssignInvalid( var );
}
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_SCAND( pstructSI si )
{
pstructVar var = RE_Pop( si->RE );
pstructVar var2 = NULL;
if (var == NULL) {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
if ( VCR_OK == Var_Convert( var, typeBool )) {
if (var->val.theInt == FALSE) {
var2 = Var_New();
Var_AssignBool( var2, FALSE );
}
}
else {
var2 = Var_New();
Var_AssignBool( var2, FALSE );
Var_AssignInvalid( var );
}
OpS_Push( si->RE->OpS, &var );
if (var2 != NULL) {
OpS_Push( si->RE->OpS, &var2 );
}
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_SCOR( pstructSI si )
{
pstructVar var = RE_Pop( si->RE );
pstructVar var2 = NULL;
if (var == NULL) {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
if ( VCR_OK == Var_Convert( var, typeBool )) {
if (var->val.theInt == FALSE) {
Var_AssignBool( var, TRUE );
}
else {
var2 = Var_New();
Var_AssignBool( var2, FALSE );
}
}
else {
var2 = Var_New();
Var_AssignBool( var2, FALSE );
Var_AssignInvalid( var );
}
OpS_Push( si->RE->OpS, &var );
if (var2 != NULL) {
OpS_Push( si->RE->OpS, &var2 );
}
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_TOBOOL( pstructSI si )
{
pstructVar var = RE_Pop( si->RE );
if (var == NULL) {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
if ( ! (VCR_OK == Var_Convert( var, typeBool ))) {
Var_AssignInvalid( var );
}
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
/* Stack instructions *****************************************************************************/
enumErrorCode Exec_POP( pstructSI si )
{
pstructVar var = RE_Pop( si->RE );
if (var == NULL) {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
else {
Var_Delete( &var );
return ERR_WAE_WMLS_NONE;
}
}
/* Access to operand type ************************************************************************/
enumErrorCode Exec_TYPEOF( pstructSI si )
{
pstructVar var = RE_Pop( si->RE );
pstructVar type;
if (var == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
type = Var_New();
Var_AssignInt( type, var->type );
Var_Delete( &var );
OpS_Push( si->RE->OpS, &type );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_ISVALID( pstructSI si )
{
pstructVar var = RE_Pop( si->RE );
pstructVar isValid;
if (var == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
isValid = Var_New();
if (var->type != typeInvalid) {
Var_AssignBool( isValid, TRUE );
}
else {
Var_AssignBool( isValid, FALSE );
}
Var_Delete( &var );
OpS_Push( si->RE->OpS, &isValid );
return ERR_WAE_WMLS_NONE;
}
/* Function return instructions ***************************************************************/
enumErrorCode Exec_RETURN( pstructSI si )
{
UINT16 topIndex = OpS_GetTopIndex( si->RE->OpS );
pstructVar funcResult = NULL;
pstructFrame returnFrame = si->RE->currF;
/* first make sure that the result is correctly placed on the stack */
if (topIndex != (si->RE->currF->returnSP + 1)) {
/* there is some scrap on the stack which must be disposed */
funcResult = RE_Pop( si->RE );
if ( ! OpS_ClearUntilIndex( si->RE->OpS, si->RE->currF->returnSP ) ) {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
OpS_Push( si->RE->OpS, &funcResult );
}
si->RE->currF = FS_Pop( si->RE->FS );
/* check if this was the last function to finish in this BP */
if( si->RE->currF != NULL ) {
/* not the last: restore the frame that called */
si->RE->IP = si->RE->currF->returnIP;
}
else {
/* the last: signal to to SI that this BP is done */
si->returnInfo = SI_RETURN_DONE;
}
Frame_Delete( &returnFrame, si->RE->BPI );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_RETURN_ES( pstructSI si )
{
pstructVar esVar = Var_New();
pstructFrame returnFrame = si->RE->currF;
/* first make sure that the result is correctly placed on the stack */
if ( ! OpS_ClearUntilIndex( si->RE->OpS, si->RE->currF->returnSP ) ) {
return ERR_WAE_WMLS_STACK_UNDERFLOW;
}
OpS_Push( si->RE->OpS, &esVar );
si->RE->currF = FS_Pop( si->RE->FS );
/* check if this was the last function to finish in this BP */
if( si->RE->currF != NULL ) {
/* not the last: restore the frame that called */
si->RE->IP = si->RE->currF->returnIP;
}
else {
/* the last: signal to to SI that this BP is done */
si->returnInfo = SI_RETURN_DONE;
}
Frame_Delete( &returnFrame, si->RE->BPI );
return ERR_WAE_WMLS_NONE;
}
/* Miscellaneous instructions *******************************************************************/
enumErrorCode Exec_DEBUG( pstructSI si )
{
si=si; /* just to get rid of a compiler warning */
return ERR_WAE_WMLS_NONE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -