cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l zend_operators.c zend_operators.h

From: Date: Thu, 08 Aug 2002 16:32:35 +0000
Subject: cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l zend_operators.c zend_operators.h
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-302@lists.php.net to get a copy of this message
andi Thu Aug 8 12:32:35 2002 EDT Modified files: /ZendEngine2 zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l zend_operators.c zend_operators.h Log: - Make new 'is' operator work with classes only and return false when - the object isn't of the said class or the value isn't an object. Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.300 ZendEngine2/zend_compile.c:1.301 --- ZendEngine2/zend_compile.c:1.300 Tue Jul 30 18:19:50 2002 +++ ZendEngine2/zend_compile.c Thu Aug 8 12:32:34 2002 @@ -2724,23 +2724,16 @@ } -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: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.179 ZendEngine2/zend_compile.h:1.180 --- ZendEngine2/zend_compile.h:1.179 Tue Jul 30 00:07:15 2002 +++ ZendEngine2/zend_compile.h Thu Aug 8 12:32:34 2002 @@ -358,7 +358,7 @@ 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 @@ #define ZEND_ASSIGN_OBJ 136 #define ZEND_MAKE_VAR 137 -#define ZEND_IS_TYPE 138 +#define ZEND_IS_CLASS 138 /* end of block */ Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.358 ZendEngine2/zend_execute.c:1.359 --- ZendEngine2/zend_execute.c:1.358 Sat Aug 3 05:44:27 2002 +++ ZendEngine2/zend_execute.c Thu Aug 8 12:32:34 2002 @@ -3123,16 +3123,10 @@ } } 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: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.65 ZendEngine2/zend_language_parser.y:1.66 --- ZendEngine2/zend_language_parser.y:1.65 Tue Jul 30 00:07:15 2002 +++ ZendEngine2/zend_language_parser.y Thu Aug 8 12:32:34 2002 @@ -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 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 @@ | 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: ZendEngine2/zend_language_scanner.l diff -u ZendEngine2/zend_language_scanner.l:1.55 ZendEngine2/zend_language_scanner.l:1.56 --- ZendEngine2/zend_language_scanner.l:1.55 Tue Jul 30 00:07:15 2002 +++ ZendEngine2/zend_language_scanner.l Thu Aug 8 12:32:34 2002 @@ -556,7 +556,7 @@ } <ST_IN_SCRIPTING>"is" { - return T_IS_TYPE; + return T_IS_CLASS; } <ST_IN_SCRIPTING>"as" { Index: ZendEngine2/zend_operators.c diff -u ZendEngine2/zend_operators.c:1.130 ZendEngine2/zend_operators.c:1.131 --- ZendEngine2/zend_operators.c:1.130 Wed Aug 7 10:47:41 2002 +++ ZendEngine2/zend_operators.c Thu Aug 8 12:32:34 2002 @@ -1358,57 +1358,18 @@ } -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: ZendEngine2/zend_operators.h diff -u ZendEngine2/zend_operators.h:1.57 ZendEngine2/zend_operators.h:1.58 --- ZendEngine2/zend_operators.h:1.57 Tue Jul 30 00:07:15 2002 +++ ZendEngine2/zend_operators.h Thu Aug 8 12:32:34 2002 @@ -58,7 +58,7 @@ 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) {

« previous php.zend-engine.cvs (#302) next »