%left '|'
%left '^'
%left '&'
-%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL
+%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL
%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
%left T_SL T_SR
%left '+' '-' '.'
| '-' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); do_binary_op(ZEND_SUB, &$$, &$1, &$2 CLS_CC); }
| '!' expr { do_unary_op(ZEND_BOOL_NOT, &$$, &$2 CLS_CC); }
| '~' expr { do_unary_op(ZEND_BW_NOT, &$$, &$2 CLS_CC); }
+ | expr T_IS_IDENTICAL expr { do_binary_op(ZEND_IS_IDENTICAL, &$$, &$1, &$3 CLS_CC); }
| expr T_IS_EQUAL expr { do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr T_IS_NOT_EQUAL expr { do_binary_op(ZEND_IS_NOT_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr '<' expr { do_binary_op(ZEND_IS_SMALLER, &$$, &$1, &$3 CLS_CC); }
return T_DEC;
}
+<ST_IN_SCRIPTING>"===" {
+ return T_IS_IDENTICAL;
+}
+
<ST_IN_SCRIPTING>"==" {
return T_IS_EQUAL;
}
#define ZEND_EXT_FCALL_END 98
#define ZEND_EXT_NOP 99
+#define ZEND_IS_IDENTICAL 100
/* end of block */
case ZEND_CONCAT:
EG(binary_op) = concat_function;
goto binary_op_addr;
+ case ZEND_IS_IDENTICAL:
+ EG(binary_op) = is_identical_function;
+ goto binary_op_addr;
case ZEND_IS_EQUAL:
EG(binary_op) = is_equal_function;
goto binary_op_addr;
case ZEND_ASSIGN_CONCAT:
return (void *) concat_function;
break;
+ case ZEND_IS_IDENTICAL:
+ return (void *) is_identical_function;
+ break;
case ZEND_IS_EQUAL:
return (void *) is_equal_function;
break;
}
+ZEND_API int is_identical_function(zval *result, zval *op1, zval *op2)
+{
+ if (op1->type != op2->type) {
+ convert_to_boolean(result);
+ result->value.lval = 0;
+ return SUCCESS;
+ }
+ if (compare_function(result, op1, op2) == FAILURE) {
+ return FAILURE;
+ }
+ convert_to_boolean(result);
+ if (result->value.lval == 0) {
+ result->value.lval = 1;
+ } else {
+ result->value.lval = 0;
+ }
+ return SUCCESS;
+}
+
ZEND_API int is_equal_function(zval *result, zval *op1, zval *op2)
{
if (compare_function(result, op1, op2) == FAILURE) {
ZEND_API int concat_function(zval *result, zval *op1, zval *op2);
ZEND_API int is_equal_function(zval *result, zval *op1, zval *op2);
+ZEND_API int is_identical_function(zval *result, zval *op1, zval *op2);
ZEND_API int is_not_equal_function(zval *result, zval *op1, zval *op2);
ZEND_API int is_smaller_function(zval *result, zval *op1, zval *op2);
ZEND_API int is_smaller_or_equal_function(zval *result, zval *op1, zval *op2);