]> granicus.if.org Git - php/commitdiff
- Make new 'is' operator work with classes only and return false when
authorAndi Gutmans <andi@php.net>
Thu, 8 Aug 2002 16:32:34 +0000 (16:32 +0000)
committerAndi Gutmans <andi@php.net>
Thu, 8 Aug 2002 16:32:34 +0000 (16:32 +0000)
- the object isn't of the said class or the value isn't an object.

Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute.c
Zend/zend_language_parser.y
Zend/zend_language_scanner.l
Zend/zend_operators.c
Zend/zend_operators.h

index 99aa9709a76c32c15096eb6577aecf43370fdf11..1561c2b9bf7705fa778cb05943d855449bfd80de 100644 (file)
@@ -2724,23 +2724,16 @@ void zend_do_isset_or_isempty(int type, znode *result, znode *variable TSRMLS_DC
 }
 
 
-void zend_do_is_type(znode *result, znode *expr, znode *class, int type TSRMLS_DC)
+void zend_do_is_class(znode *result, znode *expr, znode *class, int type TSRMLS_DC)
 {
        zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
 
-       opline->opcode = ZEND_IS_TYPE;
+       opline->opcode = ZEND_IS_CLASS;
        opline->result.op_type = IS_TMP_VAR;
        opline->result.u.var = get_temporary_variable(CG(active_op_array));
        opline->op1 = *expr;
 
-       if (class) {
-               opline->op2 = *class;
-               opline->extended_value = 1;
-       } else {
-               opline->op2.u.constant.value.lval = type;
-               SET_UNUSED(opline->op2);
-               opline->extended_value = 0;
-       }
+       opline->op2 = *class;
 
        *result = opline->result;
 }
index b53d795920d9d29d1b24c4b8dc9d8fa22486d0dd..90e99d7b0384670e37aebf1cc1dfcb82e82d983f 100644 (file)
@@ -358,7 +358,7 @@ void zend_do_include_or_eval(int type, znode *result, znode *op1 TSRMLS_DC);
 void zend_do_unset(znode *variable TSRMLS_DC);
 void zend_do_isset_or_isempty(int type, znode *result, znode *variable TSRMLS_DC);
 
-void zend_do_is_type(znode *result, znode *expr, znode *class, int type TSRMLS_DC);
+void zend_do_is_class(znode *result, znode *expr, znode *class, int type TSRMLS_DC);
 
 void zend_do_foreach_begin(znode *foreach_token, znode *array, znode *open_brackets_token, znode *as_token, int variable TSRMLS_DC);
 void zend_do_foreach_cont(znode *value, znode *key, znode *as_token TSRMLS_DC);
@@ -598,7 +598,7 @@ int zendlex(znode *zendlval TSRMLS_DC);
 #define ZEND_ASSIGN_OBJ                                136
 #define ZEND_MAKE_VAR                          137
 
-#define ZEND_IS_TYPE                           138
+#define ZEND_IS_CLASS                          138
 
 /* end of block */
 
index 507435d855a797d1709fa8e8b97c7f46ac20c882..d397ccf38760bc37614f5c764312a3601b114647 100644 (file)
@@ -3123,16 +3123,10 @@ send_by_ref:
                                        }
                                }
                                NEXT_OPCODE();
-                       case ZEND_IS_TYPE: {
+                       case ZEND_IS_CLASS: {
                                        zval *expr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R);
-                                       if (EX(opline)->extended_value) {
-                                               is_type_function(&EX(Ts)[EX(opline)->result.u.var].tmp_var, expr,
-                                                                                EX(Ts)[EX(opline)->op2.u.var].EA.class_entry, 0 TSRMLS_CC);
-                                       } else {
-                                               is_type_function(&EX(Ts)[EX(opline)->result.u.var].tmp_var, expr,
-                                                                                NULL, EX(opline)->op2.u.constant.value.lval TSRMLS_CC);
-                                       }
-
+                                       is_class_function(&EX(Ts)[EX(opline)->result.u.var].tmp_var, expr,
+                                                                                EX(Ts)[EX(opline)->op2.u.var].EA.class_entry TSRMLS_CC);
                                        FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1));
                                }
                                NEXT_OPCODE();
index 5eced240b1441b917443851ee5004e31b656e61e..b90339bf3da6db0ea977f32a65db37f5fedf6c67 100644 (file)
@@ -67,7 +67,7 @@
 %left '*' '/' '%'
 %right '!' '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
 %right '['
-%nonassoc T_NEW T_IS_TYPE
+%nonassoc T_NEW T_IS_CLASS
 %token T_EXIT
 %token T_IF
 %left T_ELSEIF
@@ -94,7 +94,7 @@
 %token T_ENDFOREACH
 %token T_DECLARE
 %token T_ENDDECLARE
-%token T_IS_TYPE
+%token T_IS_CLASS
 %token T_AS
 %token T_SWITCH
 %token T_ENDSWITCH
@@ -529,14 +529,7 @@ expr_without_variable:
        |       expr T_IS_SMALLER_OR_EQUAL expr { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }
        |       expr '>' expr                                   { zend_do_binary_op(ZEND_IS_SMALLER, &$$, &$3, &$1 TSRMLS_CC); }
        |       expr T_IS_GREATER_OR_EQUAL expr { zend_do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$3, &$1 TSRMLS_CC); }
-       |       expr T_IS_TYPE is_type_expr { zend_do_is_type(&$$, &$1, &$3, 0 TSRMLS_CC); }
-       |       expr T_IS_TYPE T_INT_CAST { zend_do_is_type(&$$, &$1, NULL, IS_LONG TSRMLS_CC); }
-       |       expr T_IS_TYPE T_DOUBLE_CAST { zend_do_is_type(&$$, &$1, NULL, IS_DOUBLE TSRMLS_CC); }
-       |       expr T_IS_TYPE T_STRING_CAST { zend_do_is_type(&$$, &$1, NULL, IS_STRING TSRMLS_CC); }
-       |       expr T_IS_TYPE T_ARRAY_CAST { zend_do_is_type(&$$, &$1, NULL, IS_ARRAY TSRMLS_CC); }
-       |       expr T_IS_TYPE T_OBJECT_CAST { zend_do_is_type(&$$, &$1, NULL, IS_OBJECT TSRMLS_CC); }
-       |       expr T_IS_TYPE T_BOOL_CAST { zend_do_is_type(&$$, &$1, NULL, IS_BOOL TSRMLS_CC); }
-       |       expr T_IS_TYPE T_UNSET_CAST { zend_do_is_type(&$$, &$1, NULL, IS_NULL TSRMLS_CC); }
+       |       expr T_IS_CLASS is_class_expr { zend_do_is_class(&$$, &$1, &$3, 0 TSRMLS_CC); }
        |       '(' expr ')'    { $$ = $2; }
        |       expr '?' { zend_do_begin_qm_op(&$1, &$2 TSRMLS_CC); }
                expr ':' { zend_do_qm_true(&$4, &$2, &$5 TSRMLS_CC); }
@@ -594,7 +587,7 @@ static_or_variable_string:
        |       r_variable_without_static_member        { $$ = $1; }
 ;
 
-is_type_expr:
+is_class_expr:
                parse_class_entry T_STRING { do_fetch_class(&$$, &$1, &$2 TSRMLS_CC); }
        |       T_STRING { do_fetch_class(&$$, NULL, &$1 TSRMLS_CC); }
 ;
index 3f1cfa0566c1e07f8ee9f800e5436542bd43c2cd..599b87b58e77a1b8cebcb30b2ee2ba128334fd9a 100644 (file)
@@ -556,7 +556,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
 }
 
 <ST_IN_SCRIPTING>"is" {
-       return T_IS_TYPE;
+       return T_IS_CLASS;
 }
 
 <ST_IN_SCRIPTING>"as" {
index 2e8d79e52262e403a9951dd3e62326d6e71f92d2..897d8070204ffa7aac3930772ac0fadc1ffb781d 100644 (file)
@@ -1358,57 +1358,18 @@ ZEND_API int is_smaller_or_equal_function(zval *result, zval *op1, zval *op2 TSR
 }
 
 
-ZEND_API int is_type_function(zval *result, zval *op1, zend_class_entry *class, int type TSRMLS_DC)
+ZEND_API int is_class_function(zval *result, zval *op1, zend_class_entry *class TSRMLS_DC)
 {
-       if (class) {
-               if (Z_TYPE_P(op1) == IS_OBJECT) {
-                       zend_class_entry *ce;
-                       for (ce = Z_OBJCE_P(op1); ce != NULL; ce = ce->parent) {
-                               if (ce == class) {
-                                       ZVAL_BOOL(result, 1);
-                                       return SUCCESS;
-                               }
+       if (Z_TYPE_P(op1) == IS_OBJECT) {
+               zend_class_entry *ce;
+               for (ce = Z_OBJCE_P(op1); ce != NULL; ce = ce->parent) {
+                       if (ce == class) {
+                               ZVAL_BOOL(result, 1);
+                               return SUCCESS;
                        }
-                       ZVAL_BOOL(result, 0);
-               } else {
-                       ZVAL_BOOL(result, 0);
                }
-               return SUCCESS;
-       }
-
-       switch (type) {
-               case IS_NULL:
-                       ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_NULL);
-                       break;
-
-               case IS_LONG:
-                       ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_LONG);
-                       break;
-
-               case IS_DOUBLE:
-                       ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_DOUBLE);
-                       break;
-
-               case IS_STRING:
-                       ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_STRING);
-                       break;
-
-               case IS_ARRAY:
-                       ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_ARRAY);
-                       break;
-
-               case IS_OBJECT:
-                       ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_OBJECT);
-                       break;
-
-               case IS_BOOL:
-                       ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_BOOL);
-                       break;
-
-               default:
-                       zend_error(E_ERROR, "Unknown operand type");
-                       return FAILURE;
        }
+       ZVAL_BOOL(result, 0);
        return SUCCESS;
 }
 
index 37f2f6bb21b00f958cb165f5bd70dd53ff684269..c0fa057494a1b4c0e981bcf44b52f864bbc0988f 100644 (file)
@@ -58,7 +58,7 @@ ZEND_API int is_not_equal_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
 ZEND_API int is_smaller_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
 ZEND_API int is_smaller_or_equal_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
 
-ZEND_API int is_type_function(zval *result, zval *op1, zend_class_entry *ce, int type TSRMLS_DC);
+ZEND_API int is_class_function(zval *result, zval *op1, zend_class_entry *ce TSRMLS_DC);
 
 static inline zend_bool is_numeric_string(char *str, int length, long *lval, double *dval, zend_bool allow_errors)
 {