zend comparison mismatch
Changed parts of tv_comparisons so certain comparisons to resource type matches zend
Esse commit está contido em:
@@ -139,7 +139,7 @@ bool cellRelOp(Op op, const Cell* cell, const StringData* val) {
|
||||
case KindOfObject:
|
||||
{
|
||||
auto const od = cell->m_data.pobj;
|
||||
if (od->isResource()) return op(true, false);
|
||||
if (od->isResource()) return op(od->o_toDouble(), val->toDouble());
|
||||
if (od->isCollection()) return op.collectionVsNonObj();
|
||||
try {
|
||||
String str(const_cast<ObjectData*>(od)->t___tostring());
|
||||
@@ -169,10 +169,13 @@ bool cellRelOp(Op op, const Cell* cell, const ArrayData* ad) {
|
||||
case KindOfStaticString:
|
||||
case KindOfString: return op(false, true);
|
||||
case KindOfObject:
|
||||
return cell->m_data.pobj->isCollection()
|
||||
? op.collectionVsNonObj()
|
||||
: op(true, false);
|
||||
|
||||
{
|
||||
auto const od = cell->m_data.pobj;
|
||||
if (od->isResource()) return op(false, true);
|
||||
return od->isCollection()
|
||||
? op.collectionVsNonObj()
|
||||
: op(true, false);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -196,19 +199,22 @@ bool cellRelOp(Op op, const Cell* cell, const ObjectData* od) {
|
||||
return od->isCollection() ? op.collectionVsNonObj()
|
||||
: op(cell->m_data.dbl, od->o_toDouble());
|
||||
case KindOfArray:
|
||||
return od->isCollection() ? op.collectionVsNonObj() : op(false, true);
|
||||
|
||||
if (od->isResource()) return op(true, false);
|
||||
return od->isCollection() ? op.collectionVsNonObj() : op(false, true);
|
||||
case KindOfString:
|
||||
case KindOfStaticString:
|
||||
if (od->isResource()) return op(false, true);
|
||||
if (od->isCollection()) return op.collectionVsNonObj();
|
||||
try {
|
||||
String str(const_cast<ObjectData*>(od)->t___tostring());
|
||||
return op(cell->m_data.pstr, str.get());
|
||||
} catch (BadTypeConversionException&) {
|
||||
return op(false, true);
|
||||
}
|
||||
{
|
||||
auto const str = cell->m_data.pstr;
|
||||
if (od->isResource()) return op(str->toDouble(), od->o_toDouble());
|
||||
|
||||
if (od->isCollection()) return op.collectionVsNonObj();
|
||||
try {
|
||||
String str(const_cast<ObjectData*>(od)->t___tostring());
|
||||
return op(cell->m_data.pstr, str.get());
|
||||
} catch (BadTypeConversionException&) {
|
||||
return op(false, true);
|
||||
}
|
||||
}
|
||||
case KindOfObject:
|
||||
return op(cell->m_data.pobj, od);
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
error_reporting(0);
|
||||
class C {
|
||||
public $a = 2;
|
||||
}
|
||||
class D {
|
||||
public $b = 1;
|
||||
}
|
||||
$c1 = new C;
|
||||
$c2 = new C;
|
||||
$c2->a = 3;
|
||||
$d = new D;
|
||||
$f = fopen('php://stdout', 'w');
|
||||
$arr = array('null' => null, 'false' => false, 'true' => true, 'int 0' => 0,
|
||||
'int 99' => 99, 'int -1' => -1, 'float 0' => 0.0,'double 99' => (double) 99,
|
||||
'float 99' => 99.0, 'float -1' => -1.0, 'INF' => INF,
|
||||
'-INF' => -INF, '""' => "", '"0"' => "0",
|
||||
'"99"' => "99", '"-1"' => "-1", '"0.0"' => "0.0",
|
||||
'"99.0"' => "99.0", '"-1.0"' => "-1.0", 'array()' => array(),
|
||||
'array(99)' => array(99), 'object c1' => $c1, 'object c2' => $c2,
|
||||
'object d' => $d, 'resource' => $f);
|
||||
echo " same lt lte eq ne nw2 gte gt\n\n";
|
||||
foreach ($arr as $k1 => $v1) {
|
||||
foreach ($arr as $k2 => $v2) {
|
||||
echo "$k1 cmp $k2:\n ";
|
||||
echo (($v1 === $v2) ? "T " : "F ");
|
||||
echo (($v1 < $v2) ? "T " : "F ");
|
||||
echo (($v1 <= $v2) ? "T " : "F ");
|
||||
echo (($v1 == $v2) ? "T " : "F ");
|
||||
echo (($v1 >= $v2) ? "T " : "F ");
|
||||
echo (($v1 > $v2) ? "T " : "F ");
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
fclose($f);
|
||||
?>
|
||||
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
Referência em uma Nova Issue
Bloquear um usuário