/*
* Copyright (C)2005-2017 Haxe Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
package php;
@:dox(hide)
@:keep
class Boot {
static var qtypes;
static var ttypes;
static var tpaths;
static var skip_constructor = false;
static function __init__() : Void {
var _hx_class_prefix = untyped __prefix__();
untyped __php__("
function _hx_add($a, $b) {
if (!_hx_is_numeric($a) || !_hx_is_numeric($b)) {
return _hx_string_or_null($a) . _hx_string_or_null($b);
} else {
return $a + $b;
}
}
function _hx_anonymous($arr = array()) {
$o = new _hx_anonymous();
foreach($arr as $k => $v)
$o->$k = $v;
return $o;
}
class _hx_array implements ArrayAccess, IteratorAggregate {
var $a;
var $length;
function __construct($a = array()) {
$this->a = $a;
$this->length = count($a);
}
function concat($a) {
return new _hx_array(array_merge($this->a, $a->a));
}
function copy() {
return new _hx_array($this->a);
}
function &get($index) {
if(isset($this->a[$index])) return $this->a[$index];
return null;
}
function insert($pos, $x) {
array_splice($this->a, $pos, 0, array($x));
$this->length++;
}
function iterator() {
return new _hx_array_iterator($this->a);
}
function getIterator() {
return $this->iterator();
}
function join($sep) {
return implode($sep, array_map('_hx_string_rec',$this->a,array()));
}
function pop() {
$r = array_pop($this->a);
$this->length = count($this->a);
return $r;
}
function push($x) {
$this->a[] = $x;
return ++$this->length;
}
function remove($x) {
foreach($this->a as $i => $val)
if($val === $x) {
unset($this->a[$i]);
$this->a = array_values($this->a);
$this->length--;
return true;
}
return false;
}
function indexOf($x, $fromIndex) {
$i = ($fromIndex === null) ? 0 : $fromIndex;
$len = $this->length;
$a = $this->a;
if ($i < 0) {
$i += $len;
if ($i < 0) $i = 0;
}
while ($i < $len) {
if ($a[$i] === $x)
return $i;
$i++;
}
return -1;
}
function lastIndexOf($x, $fromIndex) {
$len = $this->length;
$i = ($fromIndex === null) ? $len - 1 : $fromIndex;
$a = $this->a;
if ($i >= $len)
$i = $len - 1;
else if ($i < 0)
$i += $len;
while ($i >= 0) {
if ($a[$i] === $x)
return $i;
$i--;
}
return -1;
}
function removeAt($pos) {
if(array_key_exists($pos, $this->a)) {
unset($this->a[$pos]);
$this->length--;
return true;
} else
return false;
}
function reverse() {
$this->a = array_reverse($this->a, false);
}
function shift() {
$r = array_shift($this->a);
$this->length = count($this->a);
return $r;
}
function slice($pos, $end) {
if($end === null)
return new _hx_array(array_slice($this->a, $pos));
else
return new _hx_array(array_slice($this->a, $pos, $end-$pos));
}
function sort($f) {
usort($this->a, $f);
}
function splice($pos, $len) {
if($len < 0) $len = 0;
$nh = new _hx_array(array_splice($this->a, $pos, $len));
$this->length = count($this->a);
return $nh;
}
function toString() {
return '['.implode(',', array_map('_hx_string_rec',$this->a,array())).']';
}
function __toString() {
return $this->toString();
}
function unshift($x) {
array_unshift($this->a, $x);
$this->length++;
}
function map($f) {
return new _hx_array(array_map($f, $this->a));
}
function filter($f) {
return new _hx_array(array_values(array_filter($this->a,$f)));
}
// ArrayAccess methods:
function offsetExists($offset) {
return isset($this->a[$offset]);
}
function offsetGet($offset) {
if(isset($this->a[$offset])) return $this->a[$offset];
return null;
}
function offsetSet($offset, $value) {
if($this->length <= $offset) {
$this->a = array_merge($this->a, array_fill(0, $offset+1-$this->length, null));
$this->length = $offset+1;
}
return $this->a[$offset] = $value;
}
function offsetUnset($offset) {
return $this->removeAt($offset);
}
}
class _hx_array_iterator implements Iterator {
private $a;
private $i;
public function __construct($a) {
$this->a = $a;
$this->i = 0;
}
public function next() {
if(!$this->hasNext()) return null;
return $this->a[$this->i++];
}
public function hasNext() {
return $this->i < count($this->a);
}
public function current() {
if (!$this->hasNext()) return false;
return $this->a[$this->i];
}
public function key() {
return $this->i;
}
public function valid() {
return $this->current() !== false;
}
public function rewind() {
$this->i = 0;
}
public function size() {
return count($this->a);
}
}
function _hx_array_get($a, $pos) { return $a[$pos]; }
function _hx_array_increment($a, $pos) { return $a[$pos] += 1; }
function _hx_array_decrement($a, $pos) { return $a[$pos] -= 1; }
function _hx_array_assign($a, $i, $v) { return $a[$i] = $v; }
class _hx_break_exception extends Exception {}
function _hx_cast($v, $type) {
if(_hx_instanceof($v, $type)) {
return $v;
} else {
throw new HException('Class cast error');
}
}
function _hx_char_at($o, $i) {
if ($i < 0)
return '';
$c = substr($o, $i, 1);
return FALSE === $c ? '' : $c;
}
function _hx_char_code_at($s, $pos) {
if($pos < 0 || $pos >= strlen($s)) return null;
return ord($s{$pos});
}
function _hx_deref($o) { return $o; }
function _hx_equal($x, $y) {
if(is_null($x)) {
return is_null($y);
} else {
if(is_null($y)) {
return false;
} else {
if((is_float($x) || is_int($x)) && (is_float($y) || is_int($y))) {
return $x == $y;
} else {
return $x === $y;
}
}
}
}
function _hx_mod($x, $y) {
if (is_int($x) && is_int($y)) {
if ($y == 0) return 0;
return $x % $y;
}
if (!is_nan($x) && !is_nan($y) && !is_finite($y) && is_finite($x)) {
return $x;
}
return fmod($x, $y);
}
function _hx_error_handler($errno, $errmsg, $filename, $linenum, $vars) {
if (!(error_reporting() & $errno)) {
return false;
}
$msg = $errmsg . ' (errno: ' . $errno . ')';
$e = new HException($msg, '', $errno, _hx_anonymous(array('fileName' => 'Boot.hx', 'lineNumber' => __LINE__, 'className' => 'php.Boot', 'methodName' => '_hx_error_handler')));
$e->setFile($filename);
$e->setLine($linenum);
throw $e;
return null;
}
function _hx_exception_handler($e) {
if(0 == strncasecmp(PHP_SAPI, 'cli', 3)) {
$msg = $e-> getMessage();
$nl = \"\\n\";
$pre = '';
$post = '';
} else {
$msg = '' . $e-> getMessage() . '';
$nl = \"
\";
$pre = '
'; $post = ''; } if(isset($GLOBALS['%s'])) { $stack = ''; $i = $GLOBALS['%s']->length; while(--$i >= 0) $stack .= 'Called from '.$GLOBALS['%s'][$i].$nl; echo $pre.'uncaught exception: '.$msg.$nl.$nl.$stack.$post; } else echo $pre.'uncaught exception: '.$msg.$nl.$nl.'in file: '.$e->getFile().' line '.$e->getLine().$nl.$e->getTraceAsString().$post; exit(1); } function _hx_explode($delimiter, $s) { if($delimiter == '') return new _hx_array(str_split($s, 1)); return new _hx_array(explode($delimiter, $s)); } function _hx_explode2($s, $delimiter) { if($delimiter == '') return new _hx_array(str_split($s, 1)); return new _hx_array(explode($delimiter, $s)); } function _hx_field($o, $field) { if(_hx_has_field($o, $field)) { if($o instanceof _hx_type) { if(is_callable($c = array($o->__tname__, $field)) && !property_exists($o->__tname__, $field)) { return $c; } else { $name = $o->__tname__; return eval('return '.$name.'::$'.$field.';'); } } else { if(is_string($o)) { if($field == 'length') { return strlen($o); } else { switch($field) { case 'charAt' : return array(new _hx_lambda(array(&$o), '_hx_char_at'), 'execute'); case 'charCodeAt' : return array(new _hx_lambda(array(&$o), '_hx_char_code_at'), 'execute'); case 'indexOf' : return array(new _hx_lambda(array(&$o), '_hx_index_of'), 'execute'); case 'lastIndexOf': return array(new _hx_lambda(array(&$o), '_hx_last_index_of'), 'execute'); case 'split' : return array(new _hx_lambda(array(&$o), '_hx_explode2'), 'execute'); case 'substr' : return array(new _hx_lambda(array(&$o), '_hx_substr'), 'execute'); case 'toUpperCase': return array(new _hx_lambda(array(&$o), 'strtoupper'), 'execute'); case 'toLowerCase': return array(new _hx_lambda(array(&$o), 'strtolower'), 'execute'); case 'toString' : return array(new _hx_lambda(array(&$o), '_hx_deref'), 'execute'); } return null; } } else { if(property_exists($o, $field)) { if(is_array($o->$field) && is_callable($o->$field)) { return $o->$field; } else { if(is_string($o->$field) && _hx_is_lambda($o->$field)) { return array($o, $field); } else { return $o->$field; } } } else if(isset($o->__dynamics) && isset($o->__dynamics[$field])) { return $o->__dynamics[$field]; } else { return array($o, $field); } } } } else { return null; } } function _hx_get_object_vars($o) { $a = array_keys(get_object_vars($o)); if(isset($o->__dynamics)) $a = array_merge($a, array_keys($o->__dynamics)); $arr = array(); foreach($a as $val) $arr[] = '' . $val; return $arr; } function _hx_has_field($o, $field) { return (is_object($o) && (method_exists($o, $field) || isset($o->$field) || property_exists($o, $field) || isset($o->__dynamics[$field]))) || (is_string($o) && (in_array($field, array('toUpperCase', 'toLowerCase', 'charAt', 'charCodeAt', 'indexOf', 'lastIndexOf', 'split', 'substr', 'toString', 'length')))) ; } function _hx_index_of($s, $value, $startIndex = null) { $x = strpos($s, $value, $startIndex); if($x === false) return -1; else return $x; } function _hx_instanceof($v, $t) { if($t === null) { return false; } switch($t->__tname__) { case 'Array' : return is_array($v); case 'String' : return is_string($v) && !_hx_is_lambda($v); case 'Bool' : return is_bool($v); case 'Int' : return (is_int($v) || (is_float($v) && intval($v) == $v && !is_nan($v))) && abs($v) <= 0x80000000; case 'Float' : return is_float($v) || is_int($v); case 'Dynamic': return true; case 'Class' : return ($v instanceof _hx_class || $v instanceof _hx_interface) && $v->__tname__ != 'Enum'; case 'Enum' : return $v instanceof _hx_enum; case 'php.NativeArray': return is_array($v); default : return is_a($v, $t->__tname__); } } function _hx_is_lambda($s) { return (is_string($s) && substr($s, 0, 8) == chr(0).'lambda_') || (is_array($s) && count($s) > 0 && (is_a($s[0], '_hx_lambda') || is_a($s[0], '_hx_lambda2'))); } function _hx_is_numeric($v) { return is_numeric($v) && !is_string($v); } function _hx_last_index_of($s, $value, $startIndex = null) { $x = strrpos($s, $value, $startIndex === null ? 0 : $startIndex-strlen($s)); if($x === false) return -1; else return $x; } function _hx_len($o) { return is_string($o) ? strlen($o) : $o->length; } class _hx_list_iterator implements Iterator { private $h; private $list; private $counter; public function __construct($list) { $this->list = $list; $this->rewind(); } public function next() { if($this->h == null) return null; $this->counter++; $x = $this->h[0]; $this->h = $this->h[1]; return $x; } public function hasNext() { return $this->h != null; } public function current() { if (!$this->hasNext()) return null; return $this->h[0]; } public function key() { return $this->counter; } public function valid() { return $this->current() !== null; } public function rewind() { $this->counter = -1; $this->h = $this->list->h; } public function size() { return $this->list->length; } } function _hx_null() { return null; } class _hx_nullob { function _throw() { throw new HException('Null object'); } function __call($f, $a) { $this->_throw(); } function __get($f) { $this->_throw(); } function __set($f, $v) { $this->_throw(); } function __isset($f) { $this->_throw(); } function __unset($f) { $this->_throw(); } function __toString() { return 'null'; } static $inst; } _hx_nullob::$inst = new _hx_nullob(); function _hx_nullob() { return _hx_nullob::$inst; } function _hx_qtype($n) { if(!isset(php_Boot::$qtypes[$n])) { php_Boot::$qtypes[$n] = new _hx_type($n, null); } return php_Boot::$qtypes[$n]; } function _hx_register_type($t) { php_Boot::$qtypes[$t->__qname__] = $t; php_Boot::$ttypes[$t->__tname__] = $t; if($t->__path__ !== null) php_Boot::$tpaths[$t->__tname__] = $t->__path__; } function _hx_set_method($o, $field, $func) { $value[0]->scope = $o; $o->$field = $func; } function _hx_shift_right($v, $n) { return ($n == 0) ? $v : ($v >= 0) ? ($v >> $n) : ($v >> $n) & (0x7fffffff >> ($n-1)); } function _hx_string_call($s, $method, $params) { if(!is_string($s)) return call_user_func_array(array($s, $method), $params); switch($method) { case 'toUpperCase': return strtoupper($s); case 'toLowerCase': return strtolower($s); case 'charAt' : return substr($s, $params[0], 1); case 'charCodeAt' : return _hx_char_code_at($s, $params[0]); case 'indexOf' : return _hx_index_of($s, $params[0], (count($params) > 1 ? $params[1] : null)); case 'lastIndexOf': return _hx_last_index_of($s, $params[0], (count($params) > 1 ? $params[1] : null)); case 'split' : return _hx_explode($params[0], $s); case 'substr' : return _hx_substr($s, $params[0], (count($params) > 1 ? $params[1] : null)); case 'toString' : return $s; default : throw new HException('Invalid Operation: ' . $method); } } function _hx_string_or_null($s) { return $s === null ? 'null' : $s; } function _hx_string_rec($o, $s) { if($o === null) return 'null'; if(strlen($s) >= 5) return '<...>'; if(is_int($o) || is_float($o)) return '' . $o; if(is_bool($o)) return $o ? 'true' : 'false'; if(is_object($o)) { $c = get_class($o); if($o instanceof Enum) { $b = $o->tag; if(!empty($o->params)) { $s .= \"\t\"; $b .= '('; foreach($o->params as $i => $val) { if($i > 0) $b .= ',' . _hx_string_rec($val, $s); else $b .= _hx_string_rec($val, $s); } $b .= ')'; } return $b; } else { if ($o instanceof _hx_anonymous) { if ($o->toString && is_callable($o->toString)) { return call_user_func($o->toString); } $rfl = new ReflectionObject($o); $b2 = \"{\n\"; $s .= \"\t\"; $properties = $rfl->getProperties(); foreach($properties as $i => $prop) { $f = $prop->getName(); if($i > 0) $b2 .= \", \n\"; $b2 .= $s . $f . ' : ' . _hx_string_rec($o->$f, $s); } $s = substr($s, 1); $b2 .= \"\n\" . $s . '}'; return $b2; } else { if($o instanceof _hx_type) return $o->__qname__; else { if(is_callable(array($o, 'toString'))) return $o->toString(); else { if(is_callable(array($o, '__toString'))) return $o->__toString(); else return '[' . _hx_ttype($c) . ']'; } } } } } if(is_string($o)) { if(_hx_is_lambda($o)) return '