E тоже было такое, вот проблемный файл https://github.com/VKCOM/kphp/blob/master/common/crc32c_x86_64.cppA A
Коллеги, есть вопрос.
у меня что-то компилер стал внезапно крешиться.
в компилере никаких изменений не делал, только в целевом приложении рефакторинг на интерфейсах и классах был.
Куда копать?
что его так распупыривает?
(gdb)
#2 0x00000000004f4f05 in on_compilation_error (description=description@entry=0x8e6ff6 "index >= 0",
file_name=file_name@entry=0x8e6f88 ".../kphp/./compiler/utils/idmap.h", line_number=line_number@entry=56,
full_description=full_description@entry=0x8e6f30 "invalid index of IdMap: -1 (maybe you've forgotten to pass a function to stream?)",
assert_level=assert_level@entry=FATAL_ASSERT_LEVEL) at ../kphp/compiler/stage.cpp:65
65 abort();
[pid 14179] [time 1782604908] SIGABRT caught, terminating program
[pid 14179] [time 1782604908] errno = Inappropriate ioctl for device
[pid 14179] [time 1782604908]
------- Register Values -------
[pid 14179] [time 1782604908] RIP=0x00007958F5AB300B RSP=0x00007FFF6B58EEC0 RBP=0x00007FFF6B58F1F0 RDI=0x0000000000000002 RSI=0x00007FFF6B58EEC0 RDX=0x0000000000000000 RCX=0x00007958F5AB300B R8=0x0000000000000000 R9=0x00007FFF6B58EEC0 R10=0x0000000000000008 RBX=0x00007958F5A6B840 RAX=0x0000000000000000 CR2=0x0000000000000000 R11=0x0000000000000246 R12=0x00007958F5C5D6A0 R13=0x00007FFF6B58F180 R14=0x00000000008E6F30 R15=0x00007FFF6B58F190
[pid 14179] [time 1782604908]
------- Stack Backtrace -------
...kphp/objs/bin/kphp2cpp[0x7ec2dd]
...kphp/objs/bin/kphp2cpp[0x7ecb16]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x14420)[0x7958f5fc2420]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0xcb)[0x7958f5ab300b]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x12b)[0x7958f5a92859]
...kphp/objs/bin/kphp2cpp[0x4f4f05]
...kphp/objs/bin/kphp2cpp[0x68e34c]
...kphp/objs/bin/kphp2cpp(_ZN32FilterOnlyActuallyUsedFunctionsF9on_finishER10DataStreamI2IdI12FunctionDataEE+0x7af)[0x68f7af]
...kphp/objs/bin/kphp2cpp(_ZN16PipeWithProgressI32FilterOnlyActuallyUsedFunctionsF10DataStreamISt4pairI2IdI12FunctionDataESt6vectorIN24CalcActualCa
A interface IHaveSetLog { /** * @param callable(string):void $handler * @return void */ public function setLog(callable $handler); } class Proxy implements IHaveSetLog { /** @var IHaveSetLog */ protected $wrapped; public function __construct(IHaveSetLog $wrapped) { $this->wrapped = $wrapped; } public function setLog(callable $handler) { $this->wrapped->setLog($handler); } } class A extends Proxy { /** * @var callable(string):void */ private $log; public function setLog(callable $handler) { $this->log = $handler; $this->wrapped->setLog(function ($s) { echo $s."\n"; }); } } нашёл! что я делаю не так?? kphp test.php Starting php to cpp transpiling... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Fatal error at stage: Calc throws and body value, gen by idmap.h:56 unknown file:0 invalid index of IdMap: -1 (maybe you've forgotten to pass a function to stream?) Compilation failed. It is probably happened due to incorrect or unsupported PHP input. But it is still bug in compiler. [pid 2916226] [time 1782608369] SIGABRT caught, terminating program [pid 2916226] [time 1782608369] errno = No such file or directory [pid 2916226] [time 1782608369] ------- Register Values ------- [pid 2916226] [time 1782608369] RIP=0x00007D9850C9EB2C RSP=0x00007FFEBE743CE0 RBP=0x00007FFEBE743D20 RDI=0x00000000002C7F82 RSI=0x00000000002C7F82 RDX=0x0000000000000006 RCX=0x00007D9850C9EB2C R8=0x0000000000000000 R9=0x0000000000000000 R10=0x0000000000000008 RBX=0x00000000002C7F82 RAX=0x0000000000000000 CR2=0x0000000000000000 R11=0x0000000000000246 R12=0x0000000000000006 R13=0x00007FFEBE743E80 R14=0x0000000000000016 R15=0x0000000000000051 [pid 2916226] [time 1782608369] ------- Stack Backtrace
вопрос: is_subclass_of()
Я хочу опять чудного:
1. есть метод с дженериком
2. Я хочу сделать ветвление: когда целевой тип никак не является наследником аргумента , то сделать специальную обработку.
/**
* @param class-string<T> $resultClass
* @return T[]
* @kphp-generic T:IDataObject
*/
function select(string $resultClass, IDataObject $object):array
{
if ( !($object instanceof $resultClass )){
return new Wrapper(object);
}
return instance_cast($object, $className);
}
конструкция, как я хочу не сработает. Какие есть варианты?
Хочется прибрать логику под фасад, а то постоянно забываю как делать хитрые выборки.
вопрос: режим сборки "lib" и FFI совместимы?
а то при попытке собрать "по быстрому" в режиме библиотеки словил
error: invalid use of incomplete type 'struct libserver::C$FFI$Scope'
на этапе С++ сборки.
и тоже самое
invalid use of incomplete type 'struct libserver::C$CompileTimeLocation'
то есть то что автогенерится