Bug 283356 - kdevelop crashed while reading code [Php::findContext]
Summary: kdevelop crashed while reading code [Php::findContext]
Status: RESOLVED FIXED
Alias: None
Product: kdevelop
Classification: Applications
Component: Language Support: PHP (other bugs)
Version First Reported In: 4.2.2
Platform: Debian testing Linux
: NOR crash
Target Milestone: 4.2.3
Assignee: kdevelop-bugs-null
URL:
Keywords:
: 282299 (view as bug list)
Depends on:
Blocks:
 
Reported: 2011-10-04 22:36 UTC by Renato Carena
Modified: 2013-01-13 18:46 UTC (History)
3 users (show)

See Also:
Latest Commit:
Version Fixed/Implemented In:
Sentry Crash Report:


Attachments
New crash information added by DrKonqi (16.21 KB, text/plain)
2012-07-20 20:02 UTC, Rolf Eike Beer
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Renato Carena 2011-10-04 22:36:56 UTC
Application: kdevelop (4.2.2)
KDE Platform Version: 4.6.5 (4.6.5)
Qt Version: 4.7.3
Operating System: Linux 3.0.0-1-686-pae i686
Distribution: Debian GNU/Linux testing (wheezy)

-- Information about the crash:
I was using the mouse wheel to scroll the page, It wasn't big, something like 100 lines of code.
Some open tab too.

-- Backtrace:
Application: KDevelop (kdevelop), signal: Segmentation fault
[Current thread is 1 (Thread 0xb1405720 (LWP 6740))]

Thread 8 (Thread 0xb106eb70 (LWP 6742)):
#0  0xb78dd424 in __kernel_vsyscall ()
#1  0xb60daf86 in poll () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
#2  0xb5355f5b in g_poll (fds=0x92ecb10, nfds=1, timeout=-1) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gpoll.c:132
#3  0xb534596f in g_main_context_poll (n_fds=1, fds=0x92ecb10, timeout=<optimized out>, context=0x92eb938, priority=<optimized out>) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3404
#4  g_main_context_iterate (context=0x92eb938, block=1, dispatch=1, self=<optimized out>) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3086
#5  0xb53460f3 in g_main_loop_run (loop=0x92eb928) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3299
#6  0xb11ab274 in gdbus_shared_thread_func (data=0x0) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./gio/gdbusprivate.c:276
#7  0xb536eb6f in g_thread_create_proxy (data=0x92eb9c8) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gthread.c:1897
#8  0xb3016ee8 in ?? () from /usr/lib/i386-linux-gnu/libGL.so.1
Backtrace stopped: Not enough registers or memory available to unwind further

Thread 7 (Thread 0xac843b70 (LWP 6743)):
#0  0xb78dd424 in __kernel_vsyscall ()
#1  0xb5e87703 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib/i386-linux-gnu/i686/cmov/libpthread.so.0
#2  0xb60f5ab4 in pthread_cond_timedwait () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
#3  0xb6da016e in wait (time=1000, this=0x95d7a70) at thread/qwaitcondition_unix.cpp:86
#4  QWaitCondition::wait (this=0x95e5f64, mutex=0x95e5f68, time=1000) at thread/qwaitcondition_unix.cpp:160
#5  0xb5833cea in KDevelop::DUChainPrivate::CleanupThread::run (this=0x95e5f58) at ../../language/duchain/duchain.cpp:286
#6  0xb6d9fcd3 in QThreadPrivate::start (arg=0x95e5f58) at thread/qthread_unix.cpp:320
#7  0xb3016ee8 in ?? () from /usr/lib/i386-linux-gnu/libGL.so.1
Backtrace stopped: Not enough registers or memory available to unwind further

Thread 6 (Thread 0xab54fb70 (LWP 6745)):
#0  0xb78dd424 in __kernel_vsyscall ()
#1  0xb5e8720a in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/i386-linux-gnu/i686/cmov/libpthread.so.0
#2  0xb60f5a5d in pthread_cond_wait () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
#3  0xb6da01e0 in wait (time=4294967295, this=0x966efe0) at thread/qwaitcondition_unix.cpp:88
#4  QWaitCondition::wait (this=0x96550f0, mutex=0x93beb68, time=4294967295) at thread/qwaitcondition_unix.cpp:160
#5  0xb4e93246 in ThreadWeaver::WeaverImpl::blockThreadUntilJobsAreBeingAssigned (this=0x96550d8, th=0x94aee40) at ../../../threadweaver/Weaver/WeaverImpl.cpp:365
#6  0xb4e95d3b in ThreadWeaver::WorkingHardState::waitForAvailableJob (this=0x95a2098, th=0x94aee40) at ../../../threadweaver/Weaver/WorkingHardState.cpp:80
#7  0xb4e92e7a in ThreadWeaver::WeaverImpl::waitForAvailableJob (this=0x96550d8, th=0x94aee40) at ../../../threadweaver/Weaver/WeaverImpl.cpp:356
#8  0xb4e95e3c in ThreadWeaver::WorkingHardState::applyForWork (this=0x95a2098, th=0x94aee40) at ../../../threadweaver/Weaver/WorkingHardState.cpp:71
#9  0xb4e92dd3 in ThreadWeaver::WeaverImpl::applyForWork (this=0x96550d8, th=0x94aee40, previous=0x966dc08) at ../../../threadweaver/Weaver/WeaverImpl.cpp:351
#10 0xb4e94974 in ThreadWeaver::ThreadRunHelper::run (this=0xab54f254, parent=0x96550d8, th=0x94aee40) at ../../../threadweaver/Weaver/Thread.cpp:87
#11 0xb4e94a2a in ThreadWeaver::Thread::run (this=0x94aee40) at ../../../threadweaver/Weaver/Thread.cpp:142
#12 0xb6d9fcd3 in QThreadPrivate::start (arg=0x94aee40) at thread/qthread_unix.cpp:320
#13 0xb3016ee8 in ?? () from /usr/lib/i386-linux-gnu/libGL.so.1
Backtrace stopped: Not enough registers or memory available to unwind further

Thread 5 (Thread 0xaa6b1b70 (LWP 6748)):
#0  0xb78dd424 in __kernel_vsyscall ()
#1  0xb60daf86 in poll () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
#2  0xb5355f5b in g_poll (fds=0xb071b4e0, nfds=1, timeout=-1) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gpoll.c:132
#3  0xb534596f in g_main_context_poll (n_fds=1, fds=0xb071b4e0, timeout=<optimized out>, context=0x971b488, priority=<optimized out>) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3404
#4  g_main_context_iterate (context=0x971b488, block=1, dispatch=1, self=<optimized out>) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3086
#5  0xb5345ce4 in g_main_context_iteration (context=0x971b488, may_block=1) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3154
#6  0xb6ec8d27 in QEventDispatcherGlib::processEvents (this=0x9718d58, flags=...) at kernel/qeventdispatcher_glib.cpp:424
#7  0xb6e99abd in QEventLoop::processEvents (this=0xaa6b1210, flags=...) at kernel/qeventloop.cpp:149
#8  0xb6e99d01 in QEventLoop::exec (this=0xaa6b1210, flags=...) at kernel/qeventloop.cpp:201
#9  0xb6d9ce6b in QThread::exec (this=0x971bb10) at thread/qthread.cpp:492
#10 0xb5934c96 in KDevelop::CompletionWorkerThread::run (this=0x971bb10) at ../../language/codecompletion/codecompletionmodel.cpp:80
#11 0xb6d9fcd3 in QThreadPrivate::start (arg=0x971bb10) at thread/qthread_unix.cpp:320
#12 0xb3016ee8 in ?? () from /usr/lib/i386-linux-gnu/libGL.so.1
Backtrace stopped: Not enough registers or memory available to unwind further

Thread 4 (Thread 0xa997eb70 (LWP 6749)):
#0  0xb78dd424 in __kernel_vsyscall ()
#1  0xb5e8720a in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/i386-linux-gnu/i686/cmov/libpthread.so.0
#2  0xb60f5a5d in pthread_cond_wait () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
#3  0xae093979 in ?? () from /usr/lib/libQtScript.so.4
#4  0xae0939bf in ?? () from /usr/lib/libQtScript.so.4
#5  0xb3016ee8 in ?? () from /usr/lib/i386-linux-gnu/libGL.so.1
Backtrace stopped: Not enough registers or memory available to unwind further

Thread 3 (Thread 0xa8b7bb70 (LWP 6750)):
#0  0xb5dd8e11 in clock_gettime () from /lib/i386-linux-gnu/i686/cmov/librt.so.1
#1  0xb6df6d25 in do_gettime (frac=0xa8b7af30, sec=0xa8b7af28) at tools/qelapsedtimer_unix.cpp:123
#2  qt_gettime () at tools/qelapsedtimer_unix.cpp:140
#3  0xb6ec9696 in QTimerInfoList::updateCurrentTime (this=0xb07052f4) at kernel/qeventdispatcher_unix.cpp:339
#4  0xb6ec99fa in QTimerInfoList::timerWait (this=0xb07052f4, tm=...) at kernel/qeventdispatcher_unix.cpp:442
#5  0xb6ec8253 in timerSourcePrepareHelper (src=<optimized out>, timeout=0xa8b7b04c) at kernel/qeventdispatcher_glib.cpp:136
#6  0xb6ec82ed in timerSourcePrepare (source=0xb07052c0, timeout=<optimized out>) at kernel/qeventdispatcher_glib.cpp:169
#7  0xb534474e in g_main_context_prepare (context=<optimized out>, priority=0xa8b7b0bc) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:2761
#8  0xb5345613 in g_main_context_iterate (context=0x9efb830, block=1, dispatch=1, self=<optimized out>) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3071
#9  0xb5345ce4 in g_main_context_iteration (context=0x9efb830, may_block=1) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3154
#10 0xb6ec8d27 in QEventDispatcherGlib::processEvents (this=0x9efb0a8, flags=...) at kernel/qeventdispatcher_glib.cpp:424
#11 0xb6e99abd in QEventLoop::processEvents (this=0xa8b7b1f0, flags=...) at kernel/qeventloop.cpp:149
#12 0xb6e99d01 in QEventLoop::exec (this=0xa8b7b1f0, flags=...) at kernel/qeventloop.cpp:201
#13 0xb6d9ce6b in QThread::exec (this=0x9db8988) at thread/qthread.cpp:492
#14 0xb6e7a5fd in QInotifyFileSystemWatcherEngine::run (this=0x9db8988) at io/qfilesystemwatcher_inotify.cpp:248
#15 0xb6d9fcd3 in QThreadPrivate::start (arg=0x9db8988) at thread/qthread_unix.cpp:320
#16 0xb3016ee8 in ?? () from /usr/lib/i386-linux-gnu/libGL.so.1
Backtrace stopped: Not enough registers or memory available to unwind further

Thread 2 (Thread 0xa789eb70 (LWP 6766)):
#0  0xb78dd424 in __kernel_vsyscall ()
#1  0xb5e8720a in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/i386-linux-gnu/i686/cmov/libpthread.so.0
#2  0xb60f5a5d in pthread_cond_wait () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
#3  0xb486151b in ?? () from /usr/lib/libQtWebKit.so.4
#4  0xb486163f in ?? () from /usr/lib/libQtWebKit.so.4
#5  0xb3016ee8 in ?? () from /usr/lib/i386-linux-gnu/libGL.so.1
Backtrace stopped: Not enough registers or memory available to unwind further

Thread 1 (Thread 0xb1405720 (LWP 6740)):
[KCrash Handler]
#7  0xb58386c4 in KDevelop::DUChainPointerData::base (this=0x0) at ../../language/duchain/duchainpointer.cpp:32
#8  0xa9c8b393 in operator-> (this=0xbfe94f8c) at /usr/include/kdevplatform/language/duchain/navigation/../duchainpointer.h:144
#9  Php::findContext (topCtx=..., pos=..., type=KDevelop::DUContext::Other) at /build/buildd-kdevelop-php_1.2.2-1-i386-ISyOCL/kdevelop-php-1.2.2/duchain/navigation/magicconstantnavigationcontext.cpp:47
#10 0xa9c8ce76 in Php::MagicConstantNavigationContext::html (this=0x95833f8) at /build/buildd-kdevelop-php_1.2.2-1-i386-ISyOCL/kdevelop-php-1.2.2/duchain/navigation/magicconstantnavigationcontext.cpp:99
#11 0xb590da71 in KDevelop::AbstractNavigationWidget::update (this=0xa580dd0) at ../../language/duchain/navigation/abstractnavigationwidget.cpp:146
#12 0xb590e2dc in KDevelop::AbstractNavigationWidget::setContext (this=0xa580dd0, context=..., initBrows=400) at ../../language/duchain/navigation/abstractnavigationwidget.cpp:123
#13 0xa9c89135 in Php::NavigationWidget::NavigationWidget (this=0xa580dd0, topContext=..., position=..., constant=...) at /build/buildd-kdevelop-php_1.2.2-1-i386-ISyOCL/kdevelop-php-1.2.2/duchain/navigation/navigationwidget.cpp:62
#14 0xa9cf9584 in Php::LanguageSupport::specialLanguageObjectNavigationWidget (this=0x9732b48, url=..., position=...) at /build/buildd-kdevelop-php_1.2.2-1-i386-ISyOCL/kdevelop-php-1.2.2/phplanguagesupport.cpp:207
#15 0xa9afdb60 in ContextBrowserPlugin::showToolTip (this=0x97746f0, view=0x9a4d0c0, position=...) at ../../../plugins/contextbrowser/contextbrowser.cpp:396
#16 0xa9b00841 in ContextBrowserPlugin::textHintRequested (this=0x97746f0, cursor=...) at ../../../plugins/contextbrowser/contextbrowser.cpp:358
#17 0xa9b026c3 in ContextBrowserPlugin::qt_metacall (this=0x97746f0, _c=QMetaObject::InvokeMetaMethod, _id=<optimized out>, _a=0xbfe95604) at ./contextbrowser.moc:144
#18 0xb6ea0e4d in metacall (argv=0xbfe95604, idx=25, cl=QMetaObject::InvokeMetaMethod, object=0x97746f0) at kernel/qmetaobject.cpp:237
#19 QMetaObject::metacall (object=0x97746f0, cl=QMetaObject::InvokeMetaMethod, idx=25, argv=0xbfe95604) at kernel/qmetaobject.cpp:232
#20 0xb6eafb90 in QMetaObject::activate (sender=0x9a4d0c0, m=0xae3f95dc, local_signal_index=3, argv=0xbfe95604) at kernel/qobject.cpp:3278
#21 0xae2e348d in KateView::needTextHint (this=0x9a4d0c0, _t1=..., _t2=...) at ./kateview.moc:490
#22 0xae2fde96 in KateViewInternal::textHintTimeout (this=0x98fd910) at ../../kate/view/kateviewinternal.cpp:3009
#23 0xae305485 in KateViewInternal::qt_metacall (this=0x98fd910, _c=QMetaObject::InvokeMetaMethod, _id=<optimized out>, _a=0xbfe957a4) at ./kateviewinternal.moc:138
#24 0xb6ea0e4d in metacall (argv=0xbfe957a4, idx=51, cl=QMetaObject::InvokeMetaMethod, object=0x98fd910) at kernel/qmetaobject.cpp:237
#25 QMetaObject::metacall (object=0x98fd910, cl=QMetaObject::InvokeMetaMethod, idx=51, argv=0xbfe957a4) at kernel/qmetaobject.cpp:232
#26 0xb6eafb90 in QMetaObject::activate (sender=0x98fda88, m=0xb6fd07b8, local_signal_index=0, argv=0x0) at kernel/qobject.cpp:3278
#27 0xb6efec95 in QTimer::timeout (this=0x98fda88) at .moc/release-shared/moc_qtimer.cpp:134
#28 0xb6eb73e6 in QTimer::timerEvent (this=0x98fda88, e=0xbfe95cdc) at kernel/qtimer.cpp:271
#29 0xb6eb2af4 in QObject::event (this=0x98fda88, e=0xbfe95cdc) at kernel/qobject.cpp:1181
#30 0xb63c80a4 in notify_helper (e=0xbfe95cdc, receiver=0x98fda88, this=0x92bc370) at kernel/qapplication.cpp:4467
#31 QApplicationPrivate::notify_helper (this=0x92bc370, receiver=0x98fda88, e=0xbfe95cdc) at kernel/qapplication.cpp:4439
#32 0xb63cd432 in QApplication::notify (this=0xbfe95cdc, receiver=0x98fda88, e=0xbfe95cdc) at kernel/qapplication.cpp:4214
#33 0xb7255571 in KApplication::notify (this=0xbfe96160, receiver=0x98fda88, event=0xbfe95cdc) at ../../kdeui/kernel/kapplication.cpp:311
#34 0x08051c6d in KDevelopApplication::notify (this=0xbfe96160, receiver=0x98fda88, event=0xbfe95cdc) at ../../app/main.cpp:90
#35 0xb6e9aa9e in QCoreApplication::notifyInternal (this=0xbfe96160, receiver=0x98fda88, event=0xbfe95cdc) at kernel/qcoreapplication.cpp:731
#36 0xb6ecae48 in sendEvent (event=0xbfe95cdc, receiver=<optimized out>) at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:215
#37 QTimerInfoList::activateTimers (this=0x92b309c) at kernel/qeventdispatcher_unix.cpp:604
#38 0xb6ec8322 in timerSourceDispatch (source=0x92b3068) at kernel/qeventdispatcher_glib.cpp:184
#39 0xb5345252 in g_main_dispatch (context=0x92bde70) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:2440
#40 g_main_context_dispatch (context=0x92bde70) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3013
#41 0xb5345a30 in g_main_context_iterate (context=0x92bde70, block=1, dispatch=1, self=<optimized out>) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3091
#42 0xb5345ce4 in g_main_context_iteration (context=0x92bde70, may_block=1) at /build/buildd-glib2.0_2.28.6-1-i386-A3fp41/glib2.0-2.28.6/./glib/gmain.c:3154
#43 0xb6ec8cc7 in QEventDispatcherGlib::processEvents (this=0x928ef38, flags=...) at kernel/qeventdispatcher_glib.cpp:422
#44 0xb647d01a in QGuiEventDispatcherGlib::processEvents (this=0x928ef38, flags=...) at kernel/qguieventdispatcher_glib.cpp:204
#45 0xb6e99abd in QEventLoop::processEvents (this=0xbfe95f74, flags=...) at kernel/qeventloop.cpp:149
#46 0xb6e99d01 in QEventLoop::exec (this=0xbfe95f74, flags=...) at kernel/qeventloop.cpp:201
#47 0xb6e9e45a in QCoreApplication::exec () at kernel/qcoreapplication.cpp:1008
#48 0xb63c5f24 in QApplication::exec () at kernel/qapplication.cpp:3741
#49 0x08051343 in main (argc=<optimized out>, argv=0x3) at ../../app/main.cpp:467

This bug may be a duplicate of or related to bug 282299.

Possible duplicates by query: bug 282299.

Reported using DrKonqi
Comment 1 Vitaliy Filippov 2012-03-11 14:02:41 UTC
I'm also experiencing this crash, on KDevelop 4.3, KDE 4.7 and Bitrix CMS sources :)
I don't know the exact file which caused this problem, because this information isn't in the stack trace, but maybe someone could point out how to determine it?
Comment 2 Vitaliy Filippov 2012-03-11 22:10:10 UTC
Debugged it for a while and found a minimal reproducing test.
This example crashes KDevelop!
<?php
$a = new A();
$a->x = 1;
class A {
        var $x = 1;
}

I'm seeing KDevelop sources for the first time so I don't know how it works, but I'll try to patch it... What if I succeed? :D
The key is to get class context from outside of that class...
Comment 3 Vitaliy Filippov 2012-03-11 22:11:44 UTC
Also, this bug is related to bug 241750 - the change from it causes the crash.
Comment 4 Milian Wolff 2012-03-11 22:16:36 UTC
the two crashes are different, but the latter is easy to reproduce, thanks. I'll fix it ASAP. would be cool if you could create a separate bugreport for this.

bye
Comment 5 Vitaliy Filippov 2012-03-12 20:56:17 UTC
Okay, filled bug 295866.
Comment 6 Rolf Eike Beer 2012-07-20 20:02:44 UTC
Created attachment 72650 [details]
New crash information added by DrKonqi

kdevelop (4.3.1) on KDE Platform 4.8.4 (4.8.4) "release 513" using Qt 4.8.2

I got this crash when I opened a new PHP file, in this case the add-to-any.php from http://wordpress.org/extend/plugins/add-to-any version 1.0.3.

-- Backtrace (Reduced):
#6  KDevelop::DUChainPointerData::base (this=0x0) at /usr/src/debug/kdevplatform-1.3.1/language/duchain/duchainpointer.cpp:32
#7  0x00007f9d1c9429ab in operator-> (this=0x7a96880) at /usr/include/kdevplatform/language/duchain/duchainpointer.h:144
#8  Php::MagicConstantNavigationContext::html (this=0x7a967e0) at /usr/src/debug/kdevelop-php-1.3.1/duchain/navigation/magicconstantnavigationcontext.cpp:69
#9  0x00007f9d3ed5bf6f in KDevelop::AbstractNavigationWidget::update (this=0x7a91810) at /usr/src/debug/kdevplatform-1.3.1/language/duchain/navigation/abstractnavigationwidget.cpp:149
#10 0x00007f9d3ed5c617 in KDevelop::AbstractNavigationWidget::setContext (this=0x7a91810, context=<optimized out>, initBrows=<optimized out>) at /usr/src/debug/kdevplatform-1.3.1/language/duchain/navigation/abstractnavigationwidget.cpp:125
Comment 7 Kevin Funk 2012-12-20 23:17:05 UTC
*** Bug 282299 has been marked as a duplicate of this bug. ***
Comment 8 Milian Wolff 2013-01-13 18:46:29 UTC
Git commit b8067b9226c5f40c1c9dbcd40bd8c5e009f5fc85 by Milian Wolff.
Committed on 13/01/2013 at 19:45.
Pushed by mwolff into branch '1.5'.

Don't try to show magic constant widget if we couldn't find a context.

This could happen when you hovered a magic constant in a file that
was not yet parsed.

M  +5    -1    phplanguagesupport.cpp

http://commits.kde.org/kdev-php/b8067b9226c5f40c1c9dbcd40bd8c5e009f5fc85