Example #1
0
 /**
  * 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);
     }
 }
Example #2
0
 function yy_r393()
 {
     $this->_retvalue = PC_Obj_MultiType::create_float($this->yystack[$this->yyidx + 0]->minor);
 }
Example #3
0
 /**
  * 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));
 }
Example #4
0
    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());
    }
Example #5
0
    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());
    }