📄 si_instr.c
字号:
return ERR_WAE_WMLS_VERIFICATION;
}
if ( ! RE_Read16bOperand( si->RE, &cindexFUNC )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if ( ! RE_Read8bOperand( si->RE, &nbrOfArgs )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if (BPI_GetConstantType( si->RE->BPI, cindexURL, &constType ))
{
utf8_funcName = BPI_GetRawUTF8Constant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindexFUNC );
if ((constType >= CONST_TYPE_UTF8) && (constType <= CONST_TYPE_EXT_CHARSET) && (utf8_funcName != NULL) )
{
url = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindexURL );
if (url != NULL)
{
if (w_Resolve (si->baseURL, url->val.theString, &resolvedUrl))
{
si->returnInfo = SI_RETURN_EXTERNAL;
if ( SI_NewReturnParams( si ) )
{
/* the SIs returnparams struct is to be filled in */
si->returnParams->islibCall = FALSE;
si->returnParams->bpUrl = resolvedUrl;
resolvedUrl = NULL;
si->returnParams->funcName = utf8_funcName;
utf8_funcName = NULL;
si->returnParams->argOpS = OpS_NewFromOpS( si->RE->OpS, nbrOfArgs );
if (si->returnParams->argOpS != NULL)
{
error = ERR_WAE_WMLS_NONE;
}
else
{
error = ERR_WAE_WMLS_STACK_UNDERFLOW;
}
}
}
/* else ERR_WAE_WMLS_VERIFICATION (the init value of error) */
}
}
}
DEALLOC( &resolvedUrl );
Var_Delete( &url );
DEALLOC( &utf8_funcName );
return error;
}
/* Variable access and manipulation *****************************************************/
enumErrorCode Exec_LOAD_VAR_S( BYTE instr, pstructSI si )
{
UINT8 vindex = 0;
pstructVar var;
vindex = Read5bFrom8b( instr );
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
var = Var_New();
if (var == NULL)
return ERR_WAE_OUT_OF_MEMORY;
Var_AssignVar( var, si->RE->currF->variables[ vindex ] );
/* copies the vindex value to var */
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_LOAD_VAR( pstructSI si )
{
UINT8 vindex = 0;
pstructVar var;
if ( ! RE_Read8bOperand( si->RE, &vindex )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
var = Var_New();
if (var == NULL)
return ERR_WAE_OUT_OF_MEMORY;
Var_AssignVar( var, si->RE->currF->variables[ vindex ] );
/* copies the vindex value to var */
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_STORE_VAR_S( BYTE instr, pstructSI si )
{
UINT8 vindex = 0;
pstructVar var;
vindex = Read4bFrom8b( instr );
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
var = RE_Pop( si->RE );
if (var == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
Var_AssignVar( si->RE->currF->variables[ vindex ], var );
/* stores the var value in the correct variable specified by vindex */
Var_Delete( &var );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_STORE_VAR( pstructSI si )
{
UINT8 vindex = 0;
pstructVar var;
if ( ! RE_Read8bOperand( si->RE, &vindex )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
var = RE_Pop( si->RE );
if (var == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
Var_AssignVar( si->RE->currF->variables[ vindex ], var );
/* stores the var value in the correct variable specified by vindex */
Var_Delete( &var );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_INCR_VAR_S( BYTE instr, pstructSI si )
{
UINT8 vindex = 0;
vindex = Read3bFrom8b( instr );
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
if ( Var_ConvertMethod(CONVERT_INT_FLOAT, si->RE->currF->variables[ vindex ], NULL) )
{
Var_INCR( si->RE->currF->variables[ vindex ] );
}
else
{
Var_AssignInvalid( si->RE->currF->variables[ vindex ] );
}
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_INCR_VAR( pstructSI si )
{
UINT8 vindex = 0;
if ( ! RE_Read8bOperand( si->RE, &vindex )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
if ( Var_ConvertMethod(CONVERT_INT_FLOAT, si->RE->currF->variables[ vindex ], NULL) )
{
Var_INCR( si->RE->currF->variables[ vindex ] );
}
else
{
Var_AssignInvalid( si->RE->currF->variables[ vindex ] );
}
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_DECR_VAR( pstructSI si )
{
UINT8 vindex = 0;
if ( ! RE_Read8bOperand( si->RE, &vindex )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
if ( Var_ConvertMethod(CONVERT_INT_FLOAT, si->RE->currF->variables[ vindex ], NULL) )
{
Var_DECR( si->RE->currF->variables[ vindex ] );
}
else
{
Var_AssignInvalid( si->RE->currF->variables[ vindex ] );
}
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
/* Access to constants *****************************************************************/
enumErrorCode Exec_LOAD_CONST_S( BYTE instr, pstructSI si )
{
UINT8 cindex = 0;
pstructVar var;
cindex = Read4bFrom8b( instr );
if (cindex < si->RE->BPI->nbrOfConstants ) {
/* valid constant index */
var = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindex );
if (var == NULL)
return ERR_WAE_OUT_OF_MEMORY;
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_LOAD_CONST( pstructSI si )
{
UINT8 cindex = 0;
pstructVar var;
if ( ! RE_Read8bOperand( si->RE, &cindex )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if (cindex < si->RE->BPI->nbrOfConstants ) {
/* valid constant index */
var = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindex );
if (var == NULL)
return ERR_WAE_OUT_OF_MEMORY;
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_LOAD_CONST_W( pstructSI si )
{
UINT16 cindex = 0;
pstructVar var;
if ( ! RE_Read16bOperand( si->RE, &cindex )) {
return ERR_WAE_WMLS_VERIFICATION;
}
if (cindex < si->RE->BPI->nbrOfConstants ) {
/* valid constant index */
var = BPI_GetConstant( si->RE->BPI, si->RE->BP, si->RE->BPend, cindex );
if (var == NULL)
return ERR_WAE_OUT_OF_MEMORY;
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_CONST_0( pstructSI si )
{
pstructVar var = Var_New();
Var_AssignInt( var, 0 );
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_CONST_1( pstructSI si )
{
pstructVar var = Var_New();
Var_AssignInt( var, 1 );
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_CONST_M1( pstructSI si )
{
pstructVar var = Var_New();
Var_AssignInt( var, -1 );
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_CONST_ES( pstructSI si )
{
pstructVar var = Var_New();
/* A new var is by default an empty string (ES) */
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_CONST_INVALID( pstructSI si )
{
pstructVar var = Var_New();
Var_AssignInvalid( var );
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_CONST_TRUE( pstructSI si )
{
pstructVar var = Var_New();
Var_AssignBool( var, TRUE );
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_CONST_FALSE( pstructSI si )
{
pstructVar var = Var_New();
Var_AssignBool( var, FALSE );
OpS_Push( si->RE->OpS, &var );
return ERR_WAE_WMLS_NONE;
}
/* Arithmetic instructions **************************************************************/
enumErrorCode Exec_INCR( pstructSI si )
{
pstructVar op1 = RE_Pop( si->RE );
if (op1 == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
if (Var_ConvertMethod( CONVERT_INT_FLOAT, op1, NULL )) {
Var_INCR( op1 );
}
else {
Var_AssignInvalid( op1 );
}
OpS_Push( si->RE->OpS, &op1 );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_DECR( pstructSI si )
{
pstructVar op1 = RE_Pop( si->RE );
if (op1 == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
if (Var_ConvertMethod( CONVERT_INT_FLOAT, op1, NULL )) {
Var_DECR( op1 );
}
else {
Var_AssignInvalid( op1 );
}
OpS_Push( si->RE->OpS, &op1 );
return ERR_WAE_WMLS_NONE;
}
enumErrorCode Exec_ADD_ASG( pstructSI si )
{
UINT8 vindex;
pstructVar op1 = NULL;
pstructVar op2 = NULL;
pstructVar result = NULL;
if ( ! RE_Read8bOperand( si->RE, &vindex ))
return ERR_WAE_WMLS_VERIFICATION;
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
op1 = si->RE->currF->variables[ vindex ];
op2 = RE_Pop( si->RE );
if (op2 == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
result = Var_ADD( op1, op2 );
Var_AssignVar( op1, result );
}
else {
Var_AssignInvalid( op1 );
}
Var_Delete( &op2 );
Var_Delete( &result );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_SUB_ASG( pstructSI si )
{
UINT8 vindex;
pstructVar op1 = NULL;
pstructVar op2 = NULL;
pstructVar result = NULL;
if ( ! RE_Read8bOperand( si->RE, &vindex ))
return ERR_WAE_WMLS_VERIFICATION;
if (vindex < (si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfArgs +
si->RE->BPI->functions[ si->RE->currF->funcIndex ].nbrOfVars) ) {
/* valid variable index */
op1 = si->RE->currF->variables[ vindex ];
op2 = RE_Pop( si->RE );
if (op2 == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
if ( Var_ConvertMethod(CONVERT_INTS_FLOATS, op1, op2) ) {
result = Var_SUB( op1, op2 );
Var_AssignVar( op1, result );
}
else {
Var_AssignInvalid( op1 );
}
Var_Delete( &op2 );
Var_Delete( &result );
return ERR_WAE_WMLS_NONE;
}
else {
return ERR_WAE_WMLS_VERIFICATION;
}
}
enumErrorCode Exec_UMINUS( pstructSI si )
{
pstructVar op1 = RE_Pop( si->RE );
pstructVar result = NULL;
if (op1 == NULL)
return ERR_WAE_WMLS_STACK_UNDERFLOW;
if (Var_ConvertMethod( CONVERT_INT_FLOAT, op1, NULL )) {
result = Var_UMINUS( 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_ADD( 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_ADD( 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_SUB( 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, op1, op2) ) {
result = Var_SUB( 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_MUL( 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, op1, op2) ) {
result = Var_MUL( 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_DIV( 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, op1, op2) ) {
result = Var_DIV( 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -