/** * Determines the type for the given type name, which is used, e.g., for return specifications. * * @param string $name the name * @return PC_Obj_MultiType the type */ public function get_type_by_name($name) { switch ($name) { case 'array': return PC_Obj_MultiType::create_array(); case 'callable': return PC_Obj_MultiType::create_callable(); case 'bool': return PC_Obj_MultiType::create_bool(); case 'float': return PC_Obj_MultiType::create_float(); case 'int': return PC_Obj_MultiType::create_int(); case 'string': return PC_Obj_MultiType::create_string(); case 'self': // TODO get class name return PC_Obj_MultiType::create_object(); default: return PC_Obj_MultiType::create_object($name); } }
function yy_r393() { $this->_retvalue = PC_Obj_MultiType::create_float($this->yystack[$this->yyidx + 0]->minor); }
/** * Creates a variable with type FLOAT and given value * * @param string $file the file of the def * @param int $line the line of the def * @param float $value the value * @param string $varname optionally, the variable-name * @return PC_Obj_Variable the variable */ public static function create_float($file, $line, $value = null, $varname = '') { return new self($file, $line, $varname, PC_Obj_MultiType::create_float($value)); }
public function test_conversion() { $code = '<?php /** @return float */ function getfloat() { return 1.0; } /** @return int */ function getint() { return 0; } /** @return bool */ function getbool() { return true; } // unknown -> float|int $a = $_; $a += 1; // unknown -> string $b = $_; $b .= "foo"; // unknown -> int $c = $_; $c |= 1; // float -> float $d = getfloat(); $d *= 2; // int -> int $e = getint(); $e *= 2; // float x int -> float $f = $d * $e; // string(mystr) + unknown -> string $g = "mystr" . $_; $g .= "foo"; // int -> int $h = getint(); $h++; ++$h; $h--; --$h; // float -> float $i = getfloat(); $i++; ++$i; $i--; --$i; // bool -> bool $j = getbool(); $j = $j || true; // unknown -> bool $k = $_; $k = ($k and false); // unknown -> bool $l = $_ === $__; $m = $_ > 3; // unknown -> type by cast $n = (int)$_; $o = (double)$_; $p = (string)$_; $q = (array)$_; $r = (object)$_; $s = (bool)$_; $t = (unset)$_; ?>'; list(, , $vars, , $errors) = $this->analyze($code); self::assert_equals(0, count($errors)); $global = $vars[PC_Obj_Variable::SCOPE_GLOBAL]; self::assert_equals((string) new PC_Obj_MultiType(), (string) $global['a']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_string(), (string) $global['b']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_int(), (string) $global['c']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(), (string) $global['d']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_int(), (string) $global['e']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(), (string) $global['f']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_string(), (string) $global['g']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_int(), (string) $global['h']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(), (string) $global['i']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(), (string) $global['j']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(), (string) $global['k']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(), (string) $global['l']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(), (string) $global['m']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_int(), (string) $global['n']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(), (string) $global['o']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_string(), (string) $global['p']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_array(), (string) $global['q']->get_type()); self::assert_equals((string) new PC_Obj_MultiType(), (string) $global['r']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(), (string) $global['s']->get_type()); self::assert_equals((string) new PC_Obj_MultiType(), (string) $global['t']->get_type()); }
public function test_vars() { $code = '<?php define("MYCONST",123); $i1 = +1; $i2 = -412; $i3 = MYCONST; $i4 = (int)"abc"; $f1 = 0.5; $f2 = 0.123; $f3 = 1.0; $f4 = (float)(string)2; $s1="my\'str"; $s2 = \'str2\'; $s3 = "ab $b c\'a\\\\\\""."bla"; $s4 = "ab c\'a\\\\\\""."bla"; $b1 = true; $b2 = false; $a1 = array(); $a2 = array(1); $a3 = ARRAY(1,2,3); $a4 = array(1 => 2,3 => 4,5 => 6); $a5 = array(\'a\' => 1,2,3,\'4\'); $a6 = array(array(array(1,2,3),4),5); $a7 = (array)1; $a8 = 4; unset($a8); $a9 = "foo"; $a10 = 123; unset($a9,$a10); /** * @param array $a * @param MyClass $b * @return int */ function x($a,MyClass $b) { global $b1; $i1 = $a; $i2 = $i1; return 1; } ?>'; $options = new PC_Engine_Options(); $options->add_project(PC_Project::PHPREF_ID); $options->add_min_req('PHP', '5'); list(, , $vars, , $errors) = $this->analyze($code, $options); self::assert_equals(0, count($errors)); $global = $vars[PC_Obj_Variable::SCOPE_GLOBAL]; self::assert_equals((string) PC_Obj_MultiType::create_int(1), (string) $global['i1']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_int(-412), (string) $global['i2']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_int(123), (string) $global['i3']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_int(0), (string) $global['i4']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(0.5), (string) $global['f1']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(0.123), (string) $global['f2']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(1.0), (string) $global['f3']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_float(2.0), (string) $global['f4']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_string('my\'str'), (string) $global['s1']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_string('str2'), (string) $global['s2']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_string(), (string) $global['s3']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_string('ab c\'a\\\\\\"bla'), (string) $global['s4']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(true), (string) $global['b1']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(false), (string) $global['b2']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_array(array()), (string) $global['a1']->get_type()); $array = new PC_Obj_MultiType(PC_Obj_Type::get_type_by_value(array(1))); self::assert_equals((string) $array, (string) $global['a2']->get_type()); $array = new PC_Obj_MultiType(PC_Obj_Type::get_type_by_value(array(1, 2, 3))); self::assert_equals((string) $array, (string) $global['a3']->get_type()); $array = new PC_Obj_MultiType(PC_Obj_Type::get_type_by_value(array(1 => 2, 3 => 4, 5 => 6))); self::assert_equals((string) $array, (string) $global['a4']->get_type()); $array = new PC_Obj_MultiType(PC_Obj_Type::get_type_by_value(array('a' => 1, 2, 3, '4'))); self::assert_equals((string) $array, (string) $global['a5']->get_type()); $array = new PC_Obj_MultiType(PC_Obj_Type::get_type_by_value(array(array(array(1, 2, 3), 4), 5))); self::assert_equals((string) $array, (string) $global['a6']->get_type()); $array = new PC_Obj_MultiType(PC_Obj_Type::get_type_by_value((array) 1)); self::assert_equals((string) $array, (string) $global['a7']->get_type()); self::assert_equals(false, isset($global['a8'])); self::assert_equals(false, isset($global['a9'])); self::assert_equals(false, isset($global['a10'])); $x = $vars['x']; self::assert_equals((string) PC_Obj_MultiType::create_array(), (string) $x['a']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_object('MyClass'), (string) $x['b']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_array(), (string) $x['i1']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_array(), (string) $x['i2']->get_type()); self::assert_equals((string) PC_Obj_MultiType::create_bool(true), (string) $x['b1']->get_type()); }