After a short discussion on the zend-engine-2 list about handling unsigned values I decided to write a quick patch (Attached) that adds an unsigned right shift operator, and an unsigned right shift assign operator (Similar to Java).
The following code/output displays the difference: Code: <?php $signed = 1 << 31 >> 31; $unsigned = 1 << 31 >>> 31; print "Signed: $signed\n"; print "Unsigned: $unsigned\n"; ?> Output: Signed: -1 Unsigned: 1
Index: zend_compile.h =================================================================== RCS file: /repository/Zend/zend_compile.h,v retrieving revision 1.141 diff -u -r1.141 zend_compile.h --- zend_compile.h 10 Feb 2002 12:52:45 -0000 1.141 +++ zend_compile.h 18 Mar 2002 05:12:02 -0000 @@ -396,6 +396,7 @@ #define ZEND_MOD 5 #define ZEND_SL 6 #define ZEND_SR 7 +#define ZEND_USR 107 #define ZEND_CONCAT 8 #define ZEND_BW_OR 9 #define ZEND_BW_AND 10 @@ -419,6 +420,7 @@ #define ZEND_ASSIGN_MOD 27 #define ZEND_ASSIGN_SL 28 #define ZEND_ASSIGN_SR 29 +#define ZEND_ASSIGN_USR 108 #define ZEND_ASSIGN_CONCAT 30 #define ZEND_ASSIGN_BW_OR 31 #define ZEND_ASSIGN_BW_AND 32 @@ -521,7 +523,6 @@ #define ZEND_TICKS 105 #define ZEND_SEND_VAR_NO_REF 106 - /* end of block */ Index: zend_execute.c =================================================================== RCS file: /repository/Zend/zend_execute.c,v retrieving revision 1.293 diff -u -r1.293 zend_execute.c --- zend_execute.c 6 Jan 2002 15:21:09 -0000 1.293 +++ zend_execute.c 18 Mar 2002 05:12:08 -0000 @@ -1077,6 +1077,9 @@ case ZEND_SR: EG(binary_op) = shift_right_function; goto binary_op_addr; + case ZEND_USR: + EG(binary_op) = ushift_right_function; + goto binary_op_addr; case ZEND_CONCAT: EG(binary_op) = concat_function; goto binary_op_addr; @@ -1144,6 +1147,9 @@ goto binary_assign_op_addr; case ZEND_ASSIGN_SR: EG(binary_op) = shift_right_function; + goto binary_assign_op_addr; + case ZEND_ASSIGN_USR: + EG(binary_op) = ushift_right_function; goto binary_assign_op_addr; case ZEND_ASSIGN_CONCAT: EG(binary_op) = concat_function; Index: zend_language_parser.y =================================================================== RCS file: /repository/Zend/zend_language_parser.y,v retrieving revision 1.17 diff -u -r1.17 zend_language_parser.y --- zend_language_parser.y 19 Jan 2002 10:28:26 -0000 1.17 +++ zend_language_parser.y 18 Mar 2002 05:12:10 -0000 @@ -53,7 +53,7 @@ %left T_LOGICAL_XOR %left T_LOGICAL_AND %right T_PRINT -%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL +%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL +T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_USR_EQUAL %left '?' ':' %left T_BOOLEAN_OR %left T_BOOLEAN_AND @@ -62,7 +62,7 @@ %left '&' %nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL %nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL -%left T_SL T_SR +%left T_SL T_SR T_USR %left '+' '-' '.' %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 '@' @@ -430,8 +430,9 @@ | cvar T_AND_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_AND, &$$, &$1, &$3 TSRMLS_CC); } | cvar T_OR_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_OR, &$$, &$1, &$3 TSRMLS_CC); } | cvar T_XOR_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_BW_XOR, &$$, &$1, &$3 TSRMLS_CC); } - | cvar T_SL_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SL, &$$, &$1, &$3 TSRMLS_CC); } - | cvar T_SR_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SR, &$$, &$1, &$3 TSRMLS_CC); } + | cvar T_SL_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 +TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SL, &$$, &$1, &$3 TSRMLS_CC); } + | cvar T_SR_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 +TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_SR, &$$, &$1, &$3 TSRMLS_CC); } + | cvar T_USR_EQUAL expr { zend_do_end_variable_parse(BP_VAR_RW, 0 +TSRMLS_CC); zend_do_binary_assign_op(ZEND_ASSIGN_USR, &$$, &$1, &$3 TSRMLS_CC); } | rw_cvar T_INC { zend_do_post_incdec(&$$, &$1, ZEND_POST_INC TSRMLS_CC); } | T_INC rw_cvar { zend_do_pre_incdec(&$$, &$2, ZEND_PRE_INC TSRMLS_CC); } | rw_cvar T_DEC { zend_do_post_incdec(&$$, &$1, ZEND_POST_DEC TSRMLS_CC); } @@ -452,6 +453,7 @@ | expr '%' expr { zend_do_binary_op(ZEND_MOD, &$$, &$1, &$3 TSRMLS_CC); } | expr T_SL expr { zend_do_binary_op(ZEND_SL, &$$, &$1, &$3 TSRMLS_CC); } | expr T_SR expr { zend_do_binary_op(ZEND_SR, &$$, &$1, &$3 TSRMLS_CC); } + | expr T_USR expr { zend_do_binary_op(ZEND_USR, &$$, &$1, &$3 +TSRMLS_CC); } | '+' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); zend_do_binary_op(ZEND_ADD, &$$, &$1, &$2 TSRMLS_CC); } | '-' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); zend_do_binary_op(ZEND_SUB, &$$, &$1, &$2 TSRMLS_CC); } | '!' expr { zend_do_unary_op(ZEND_BOOL_NOT, &$$, &$2 TSRMLS_CC); } Index: zend_language_scanner.l =================================================================== RCS file: /repository/Zend/zend_language_scanner.l,v retrieving revision 1.43 diff -u -r1.43 zend_language_scanner.l --- zend_language_scanner.l 6 Jan 2002 15:21:09 -0000 1.43 +++ zend_language_scanner.l 18 Mar 2002 05:12:12 -0000 @@ -765,6 +765,10 @@ return T_SR_EQUAL; } +<ST_IN_SCRIPTING>">>>=" { + return T_USR_EQUAL; +} + <ST_IN_SCRIPTING>"&=" { return T_AND_EQUAL; } @@ -803,6 +807,10 @@ <ST_IN_SCRIPTING>">>" { return T_SR; +} + +<ST_IN_SCRIPTING>">>>" { + return T_USR; } <ST_IN_SCRIPTING>{TOKENS} { Index: zend_operators.c =================================================================== RCS file: /repository/Zend/zend_operators.c,v retrieving revision 1.117 diff -u -r1.117 zend_operators.c --- zend_operators.c 6 Jan 2002 15:21:09 -0000 1.117 +++ zend_operators.c 18 Mar 2002 05:12:16 -0000 @@ -983,6 +983,17 @@ return SUCCESS; } +ZEND_API int ushift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) +{ + zval op1_copy, op2_copy; + + zendi_convert_to_long(op1, op1_copy, result); + zendi_convert_to_long(op2, op2_copy, result); + result->value.lval = (unsigned long) op1->value.lval >> op2->value.lval; + result->type = IS_LONG; + return SUCCESS; +} + /* must support result==op1 */ Index: zend_operators.h =================================================================== RCS file: /repository/Zend/zend_operators.h,v retrieving revision 1.50 diff -u -r1.50 zend_operators.h --- zend_operators.h 6 Jan 2002 15:21:09 -0000 1.50 +++ zend_operators.h 18 Mar 2002 05:12:16 -0000 @@ -49,6 +49,7 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); +ZEND_API int ushift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API int is_equal_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php