summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2002-08-08 16:32:34 +0000
committerAndi Gutmans <andi@php.net>2002-08-08 16:32:34 +0000
commit52406cb37c3b62a93cff0d15ae7d7a85cd7fd419 (patch)
treea0f531428218e3e49d72736711dfa3ffd30be9f1
parent7904787f950ea7b95f53d64af341c0a88393b748 (diff)
downloadphp-git-52406cb37c3b62a93cff0d15ae7d7a85cd7fd419.tar.gz
- 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.
-rw-r--r--Zend/zend_compile.c13
-rw-r--r--Zend/zend_compile.h4
-rw-r--r--Zend/zend_execute.c12
-rw-r--r--Zend/zend_language_parser.y15
-rw-r--r--Zend/zend_language_scanner.l2
-rw-r--r--Zend/zend_operators.c55
-rw-r--r--Zend/zend_operators.h2
7 files changed, 22 insertions, 81 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 99aa9709a7..1561c2b9bf 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -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;
}
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index b53d795920..90e99d7b03 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -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 */
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 507435d855..d397ccf387 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -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();
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 5eced240b1..b90339bf3d 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -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); }
;
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 3f1cfa0566..599b87b58e 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -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" {
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 2e8d79e522..897d807020 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -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;
}
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index 37f2f6bb21..c0fa057494 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -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)
{